【Jenkins使用之五】jenkins集成Gitlab
环境
CentOS Linux release 7.6.1810
jdk1.8.0_65
apache-tomcat-8.5.45
Jenkins-2.235.5
apache-maven-3.6.3
git-2.9.5
gradle-6.6.1
SonarQube-7.8
sonar-scanner-cli-4.2.0.1873
拓扑:
node1:安装GitLab、SonarQube
node2:安装Jenkins、Git、MAVEN
一、SSH key
SSH(Secure Shell Protocol):是一种协议,在进行数据传输之前,SSH先对联机数据包通过加密技术进行加密处理,加密后在进行数据传输,确保了传递的数据安全。
SSH key即SSH密钥对,可以让您方便的登录到SSH服务器,而无需输入密码,也就是免密登录。SSH 密钥对总是成双出现的,一把公钥,一把私钥。公钥可以自由的放在您所需要连接的SSH服务器上,而私钥保存在客户端。
1、公钥和私钥作用
(1)什么是公钥登录
公钥登录,很多时候也说public key认证,公钥登录的原理:首先用户将自己的公钥存储在需要登录的远程机器上面,然后登录的时候,远程主机会向用户发送一段随机字符串,接着用户使用自己的私钥加密字符串,并发给远程主机。最后,远程主机使用存储的公钥进行解密,若解密成功,则说明用户可信,准许登录,不在提示输入密码。
备注:
1)服务端会将客户端发的公钥写入到~/.ssh/authorized_keys 文件末尾。
2)公钥和私钥在客户端(登录端)生成
(2)什么是口令登录
口令登录,即登录的时候需要输入登录密码。
1)客户端向服务器发出请求
2)服务器将自己的公钥返回给客户端;
3)客户端用服务器的公钥加密登录信息, 再将信息发送给服务器;
4)服务器接收到客户端传送的登录信息, 用自己的私钥解码, 如果结果正确, 则同意登录, 建立起连接。
备注:公钥和私钥在服务端生成
2、密钥对的生成
sh-keygen命令,可以生成公钥和私钥,默认生成到用户的家目录下的.ssh文件夹里面
示例:ssh-keygen -t rsa -C "cac2020@163.com"
私钥默认会被保存在 ~/.ssh/id_rsa
公钥默认会被保存在 ~/.ssh/id_rsa.pub
参数解析:
-f 指定要生成文件的文件名称
-t 设置认定方式,值为rsa,即非对称加密;或dsa,即数字签名和认证
-c 指定公钥中的备注信息。在gitlab里备注一般使用邮箱,因为像gitlab、github等都是通过邮箱来区分的,邮箱仅仅是识别用的key
二、为什么GitLab需要SSH Key
因为GitLab需要识别出你推送的提交确实是你推送的,而不是别人冒充的,而Git支持SSH协议,所以,GitLab只要知道了你的公钥,就可以确认只有你自己才能推送。另外,CI/CD(服务器环境,不能阻塞态等待输入)
https开头的就是用的https了,git@ 开头的就是用的ssh了.
场景一:不同账号生成不同SSH Key
(1)打开Git Bash,输入ssh-keygen -t rsa -C "cac2020@163.com" ,三个回车,没有输入密码,最后在用户家目录下找到.ssh目录
(2)拷贝公钥里面的内容,粘贴到GitLab-->Settings下面SSH Keys里
(3)配置完成上面操作后,会发现Gitlab里项目地址已经变成了:git@192.168.76.65:sonartest/maven-basic.git SSH的了.
然后到本地项目目录下Git Bash执行 git config --global credential.helper store,再次pull或者push的时候还要输入用户名和密码,输入之后 下次就不用再输入了。注意:如果账或者邮箱错误 可以重新按照以上步骤重新生成。
场景二:同一账号多个终端生成不同SSH Key
GitLab允许你添加多个Key。假定你有若干电脑,你一会儿在公司提交,一会儿在家里提交,只要把每台电脑的Key都添加到GitLab,就可以在每台电脑上往GitLab推送了。那最好这里-C指定的title最好是主机名来区分。
场景三:一个终端配置多个ssh key
大多数时候,我们的机器上会有很多的git host,比如公司gitlab、github、oschina等,那我们就需要在本地配置多个ssh key,使得不同的host能使用不同的ssh key。以前用github的ssh key,后来工作原因多了一个gitlab的账号,在绑定gitlab的ssh key时,发现将github的ssh key覆盖了。怎么同时绑定github和gitlab的ssh key,并不产生冲突呢?技巧是在.ssh目录下新建一个config文件配置一下,就能解决gitlab与github的ssh key的冲突。
做法如下:问题的关键是生成密钥对的时候需要指定文件
(1)生成公司的GitLab秘钥ssh key
ssh-keygen -t rsa -C 'yourEmail@xx.com' -f ~/.ssh/gitlab-rsa
(2)生成github秘钥ssh key
ssh-keygen -t rsa -C 'yourEmail2@xx.com' -f ~/.ssh/github-rsa
(3)登录ssh-agent 添加添加私钥
eval `ssh-agent` ssh-add ~/.ssh/id_rsa_github ssh-add ~/.ssh/id_rsa_gitlib ssh-add ~/.ssh/id_rsa_oschina ssh-add ~/.ssh/id_rsa_foxmail
(4)在~/.ssh目录下新建名称为config的文件(无后缀名)。用于配置多个不同的host使用不同的ssh key,内容如下:
Host github.com HostName github.com User smallajax@foxmail.com PreferredAuthentications publickey IdentityFile ~/.ssh/id_rsa_github Host gitlib.com HostName gitlib.com User smallajax@foxmail.com PreferredAuthentications publickey IdentityFile ~/.ssh/id_rsa_gitlib Host oschina.com HostName oschina.com User smallajax@foxmail.com PreferredAuthentications publickey IdentityFile ~/.ssh/id_rsa_oschina Host 192.168.1.222 HostName 192.168.1.222 User smallajax@foxmail.com PreferredAuthentications publickey IdentityFile ~/.ssh/id_rsa_foxmail # 配置文件参数 # Host : Host可以看作是一个你要识别的模式,对识别的模式,进行配置对应的的主机名和ssh文件 # HostName : 要登录主机的主机名 # User : 登录名,填邮箱或者用户名都可以 # IdentityFile : 指明上面User对应的identityFile路径
(5)按照上面的步骤分别往gitlab和github上添加生成的公钥gitlab_id-rsa.pub和github_id-rsa.pub
然后就可以clone、push、pull了,注意在内网、虚机、Docker安装的Gitlab,可能会出现问题:
git@192.168.76.65: Permission denied (publickey,password,keyboard-interactive). fatal: Could not read from remote repository.
那么宿主机的22端口可能被占用等引起。
附:对于Http协议登录,git可以记住首次输入的密码,后面不再输入
(1)取消全局用户名和邮箱设置
git config --global --unset user.name
git config --global --unset user.email
(2)启用git 认证保存
git config --global credential.helper store
(3)首次pull push clone需要输入密码 后面不再输入
三、jenkins集成Gitlab
1、安装Git
安装Git:因为我们需要从GitLab上拉取代码。
参考:git安装
2、jenkins安装GitLab插件
3、配置jenkins访问Gitlab凭证
这里涉及两种凭证:
第一个是拉取代码库的凭证,这个凭证有多种方式,这里介绍两种:
(1)配置Username with password类型,使用http协议
ID设立一个简洁,有含义的名称,因为后面我们将要在脚本中通过这个id名称来调用这个账户来连接gitlab获取数据
(2)配置SSH Username with private key类型,使用SSH协议,需要配置免密登录
#首先在jenkins所在主机node2下生成一对公钥和私钥
[root@node2 ~]# ssh-keygen -t rsa -C 'cac2020@163.com' Generating public/private rsa key pair. Enter file in which to save the key (/root/.ssh/id_rsa): Created directory '/root/.ssh'. Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /root/.ssh/id_rsa. Your public key has been saved in /root/.ssh/id_rsa.pub. The key fingerprint is: SHA256:vWziB4fz4ilri49Glp7OHzySj6upKitkQuLRP7DlTaQ cac2020@163.com The key's randomart image is: +---[RSA 2048]----+ | | | . | | . o | |.o o E . . | |+ . *.o S.. | |.+ .+* .+... | |+ +o.= .=+ | |o o+*o+.+o | |Boo+B=*=+o | +----[SHA256]-----+
#然后将公钥内容加到Gitlab里的SSH keys 见上面 二 部分。
#然后将私钥加到Jenkins里的凭证里 在项目里使用
第二个是jenkins访问Gitlab提供的API接口的凭证
Jenkins连接gitlab需要配置access token,所以先在gitlab上生成access token,后将该token配置在Jenkins上。(access token只需配置一次,后续每个工程直接使用即可)
(1)在Gitlab里生成personal access token
(2)在jenkins配置凭证
Credentials配置GitLab API token类型
(3)配置jenkins全局配置
4、项目构建触发方式-Build Triggers
我们这里项目类型是pipeline流水线类型,这里将两个常见的触发类型
4.1 定时触发
勾选Build periodically,下面配置cron表达式,这个常见。
4.2 webhook触发事件触发
就是开发人员随时开发 随时发布 随时测试这种场景,需要GitLab配置webhook。Build Triggers 模块下配置触发器,webhook 相关的触发有如下三种:
方式二:Build when a change is pushed to GitLab. GitLab CI Service URL: http://x.x.x.x:8888/project/project-name
这种方式依赖Gitlab Hook Plugin,GitLab Plugin,Gitlab Authentication plugin插件
如果报错参考:Hook executed successfully but returned HTTP 403
方式三:Trigger builds remotely (e.g., from scripts)
(1)在Jenkins所在主机生成一个Token,Build Triggers下勾选 Trigger builds remotely (e.g., from scripts),填入Authentication Token(身份验证令牌)框
[root@node2 repo]# openssl rand -hex 12 9f87e6362bb720f3b7b78121
(2)生成当前jenkins构建用户的API token,我这里使用的是admin用户,生成的API Token是119e934834ed454acfb8bbffb244ef9d97
(3)组装HookURL,配置到GitLab里
格式:http://jenkins用户名:apitoken@jenkinsURL/job/构建任务名/build?token=(1)步骤中生成的Authentication Token
我这个是:http://admin:119e934834ed454acfb8bbffb244ef9d97@134.32.80.196:8080/job/test3-pipeline/build?token=9f87e6362bb720f3b7b78121
可能产生的问题:问题:Hook executed successfully but returned HTTP 403 (No valid crumb was included in the request)
参考:
Gitlab Jenkins WebHook 持续集成配置踩坑记
Build Triggers
5、拉取代码
test3-pipeline任务核心就是 pipeline里的配置,这个环节有两种类型:Pipeline script 和 Pipeline script from scm
示例GitLab项目:项目下面只有一个README.md文件:
5.1 Pipeline script类型
可以使用pipeline声明式语法,也可以使用脚本式语法。这里用的git命令拉取代码。
node(){ def workspace = pwd() stage 'checkout' dir('base'){ git credentialsId: 'gitlab-wangjy', url: 'http://192.168.82.46:19527/wjy/citest.git' } sh """ echo $workspace """ } 命令解释: (1)def workspace = pwd() 此处等同于linux命令行中pwd命令,等于把当前路径赋值给workspace变量, (2)dir('base') 创建base目录:用于存放本次从gitlab中拉取的代码 base目录绝对路径是:Jenkins家目录下/workspace/任务名称/base,我这里是/data/.jenkins/workspace/test3-pipeline (3)注意这里用到了git命令,所以前面要在jenkins-->Manage Jenkins-->Global Tool Configuration设置Git路径 (4)credentialsId指上面配置的Gitlab账户凭证标识,这里使用的是Username with password类型的凭证,url就选用http类型
查看生成的目录:
[root@node106 base]# pwd /data/.jenkins/workspace/test3-pipeline/base [root@node106 base]# ll total 4 -rw-r----- 1 root root 26 Sep 10 18:08 README.md
查看任务执行日志:
写pipeline脚本的技巧,使用Pipeline Syntax自动生成脚本:
5.2 Pipeline script from SCM类型
这种方式使用Jenkinsfile,使用声明式pipeline脚本,这样便于构建代码的版本化管理,这是业界推荐的一种做法。
此选项指示Jenkins从源代码管理(SCM)仓库获取你的流水线配置文件Jenkinsfile,里面是pipeline脚本,这里的仓库就是你clone到本地的Git仓库。
(1)首先配置jenkinsfile对应的Git仓库信息,这里需要说明
(2)编写Jenkinsfile,这里使用pipeline声明式语法来编写
在工程根目录下新建一个文件Jenkinsfile,因为上面配置的脚本路径就是:Jenkinsfile,没有多级目录:
在Jenkinsfile里编写如下脚本:
pipeline{ agent any options { ansiColor('xterm') } stages{ stage("代码下载"){ steps{ script{ sh """ echo 123 """
checkout scm echo "