1 构建触发器(钩子)
构建触发器(webhook),有的人称为钩子,实际上是一个 HTTP 回调,其用于在开发人员向 gitlab 提交代码后能够触发 jenkins 自动执行代码构建操作。
以下为新建一个开发分支,只有在开发人员向开发(develop)分支提交代码的时候才会触发代码构建,而向主分支提交的代码不会自动构建,需要运维人员手动部署代码到生产环境。

1.1 gitlab开发分支创建,代码提交以及合并流程
- 进到gitlab项目里(web-02), 选择新建分支


- 向开发分支提交代码
root@git-client:/opt/web-02# git branch
* master
root@git-client:/opt/web-02# git pull # 拉取最新代码, 把devlop分支拉下来
Username for 'http://10.0.0.239': developer-01
Password for 'http://developer-01@10.0.0.239':
From http://10.0.0.239/qq/web-02
* [new branch] develop -> origin/develop
Already up to date.
root@git-client:/opt/web-02# git branch
* master
root@git-client:/opt/web-02# git checkout develop # 切换到develop分支
Branch 'develop' set up to track remote branch 'develop' from 'origin'.
Switched to a new branch 'develop'
root@git-client:/opt/web-02# git branch
* develop
master
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>qq</title>
</head>
<body>
<h1>web-02-v.111111</h1>
<h1>web-02-v.222222</h1>
<h1>web-02-v.333333</h1>
<h1>web-02-v.444444</h1>
<h1>web-02-v.555555</h1>
<h1>web-02-v.666666</h1>
<h1>web-02-v.777777</h1>
<h1>web-02-v.888888</h1>
<h1>web-02-v.999999</h1>
<h1>web-02-v.10</h1>
</body>
</html>
root@git-client:/opt/web-02# git add index.html
root@git-client:/opt/web-02# git commit -m "v10"
[develop 24d3539] v10
1 file changed, 1 insertion(+)
root@git-client:/opt/web-02# git push -u origin
Username for 'http://10.0.0.239': developer-01
Password for 'http://developer-01@10.0.0.239':
Counting objects: 3, done.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 302 bytes | 302.00 KiB/s, done.
Total 3 (delta 1), reused 0 (delta 0)
remote:
remote: To create a merge request for develop, visit:
remote: http://10.0.0.239/qq/web-02/-/merge_requests/new?merge_request%5Bsource_branch%5D=develop
remote:
To http://10.0.0.239/qq/web-02.git
9e27543..24d3539 develop -> develop
Branch 'develop' set up to track remote branch 'develop' from 'origin'.
- 此时master分支是v9版本, develop分支是v10版本


- 模拟开发上传代码到develop分支后, 提交代码合并申请, 由开发项目管理人员批准合并
公司中一般都是由开发负责人去做代码合并, 开发将代码提交到开发分支后, 把master分支合并到develop上, 这样develop分支就是最新的代码, 之后部署到测试环境进行测试, 当测试没问题后, 需要提交一个合并申请, 把开发分支的代码合并到master分支, 然后由开发负责人进行审批合并.
这里模拟developer-01为开发普通用户, developer-02为开发负责人, 先给developer-02授权qq项目的owner. 权限设置的最小粒度是一个组, 不能对项目单独授权

- 假设developer-01提交了v10版本后, 测试没问题, 之后提交merge request




因为developer-01本身就是管理员账户, 因此, 自己也会提示可以批准申请, 工作中请求会被发给开发的负责人, 这里就是developer-02账号
负责人登陆后会在右上角看到merge requests提示



点击同意即可, 不用删除原分支

开发回到gitlab, 验证master分支升级到了v10版本

1.2 配置gitlab触发器
1.2.1 jenkins安装插件
Gitlab Authentication Plugin和Gitlab Hook Plugin

注意: 1.4.2版本的插件会有安全隐患, 所有的jenkins配置都是以明文保存, 具有jenkins服务器文件系统权限的用户可以登录并且修改配置, 造成构建不可用, 还需要重新配置. 因此, jenkins服务器的用户名和密码不要和其他服务器一样, 要妥善保管

1.2.2 修改jenkins用户权限
如果想使用构建触发器, 那么需要修改用户授权为登陆用户可以做任何事, 并且匿名用户具有可读权限. 这样之前设置的Roles-based就失效了, 任何用户登陆都是超级管理员权限, 因此, 触发器的配置可以在任意账户配置

启动跨站请求伪造保护

早期的jenkins版本, 配置这些后, gitlab就可以跨站触发构建了, 不过新版本的jenkins还需要添加一个认证字段, 否则会报错, 不过可以直接用curl命令或者通过Python脚本触发
openssl rand -hex 12
b8f29d278dc227ffbce317be # 通过shell命令生成一个令牌, 然后配置到jenkins上, gitlab访问jenkins时需要携带这个令牌
1.2.3 配置jenkins项目触发器
在需要自动触发的项目里, 配置令牌

修改远程触发jenkins构建的URL
JENKINS_URL/job/projectA-web1/build?token=TOKEN_NAME
http://10.0.0.249:8080/job/projectA-web1/build?token=b8f29d278dc227ffbce317be
1.2.4 配置gitlab上的系统钩子, 需要用root账号登陆


- 测试

这时会报错, 因为新版的jenkins需要一个专门字段做认证

1.2.5 解决报错
方法1: 在Linux服务器上, 使用curl命令进行触发, 此时是不需要认证的. 只需指明在构建触发器中填写的token即可
在任意终端执行即可
root@git-client:/opt/web-02# curl http://10.0.0.249:8080/job/projectA-web1/build?token=b8f29d278dc227ffbce317be
执行命令后, 会触发项目构建

验证v10版本部署成功
这里web-02项目仍然部署的是master版本

方法2: 使用Python处理
pip3 install jenkinsapi
from jenkinsapi.jenkins import Jenkins
conn = Jenkins("http://10.0.0.249:8080", username="tom",password="ning0803030221",useCrumb="b8f29d278dc227ffbce317be")
conn.build_job("projectA-web1")
运行脚本后, 会立即触发项目的构建, userCrumb字段就是在构建触发器里填写的Token
总结: 对于Jenkins构建触发器, 如果是老版本Jenkins, 可以按照上述方法, 完成gitlab自动触发jenkins构建. 新版本可以在代码上传到开发分支后, 手动使用curl命令或者Python脚本实现构建触发. 无论是自动触发还是通过curl和Python, 都只适用于开发测试分支, 对于master分支的部署, 需要经过测试后, 由运维人员到Jenkins手动构建
2 构建后项目关联
用于多个 job 相互关联,串行执行多个 job 的场景,可以通过安装插件 Parameterized Trigger 触发执行其他 project. 也就是当一个项目完成构建后, 自动触发另一个项目的构建
使用场景就是把一个job分成多个, 可以实现多个job的复用, 比如, 把关闭tomcat定义为一个job, 那么这个job就可以在任意job结束后进行调用. 不过一般用的不多, 实际都是把所有的工作在一个job内完成
案例: 当projectB-web1执行完, 自动触发projectB-web2的构建, 让web1执行停止tomcat服务操作, web2执行启动tomcat服务操作

- 修改projectB-web1的构建

- 修改projectB-web2的构建

- 测试构建


3 视图
视图可用于将 job 进行分组显示,比如将同一个业务的job放在一个视图显示,安装build pipeline 插件之后将会有一个+号用于创建视图.
Jenkins共有三个视图类别, 我的视图, 列表视图和pipeline视图
3.1 使用pipeline视图
- 安装build pipeline插件

- 重启jenkins
root@jenkins:~# systemctl restart jenkins
- 创建pipeline视图





- 点击构建, 刷新页面后会显示新的job正在执行

- 可以查看控制台输出


- 视图创建后, 会显示在jenkins首页

3.2 使用我的视图
我的视图就是用来用户登陆后, 用来显示自己权限所能看到的job, 不过用户登陆本身也是显示自己所能看到的job, 所以一般没什么用


3.3 使用列表视图

- 选择视图需要显示的job

这样该列表视图就会只显示定义的job, 因此, 列表视图就是按照不同的业务, 不同的项目, 对job进行分类

3.4 使用脚本批量触发任务构建
- 利用Python脚本, 可以实现多个任务的串行构建, 效率远高于在页面用鼠标点击
from jenkinsapi.jenkins import Jenkins
conn = Jenkins("http://10.0.0.249:8080", username="tom",password="ning0803030221",useCrumb="b8f29d278dc227ffbce317be")
# 需要构建哪个job, 只需要添加即可
conn.build_job("projectA-web1")
conn.build_job("projectA-web2")
conn.build_job("projectB-web1")
conn.build_job("projectB-web2")
- 只要把需要构建的项目的job, 编写到脚本里, 即可一次运行, 触发所有的构建任务. 工作中, 可以和开发协商需要构建哪些业务的哪些项目, 提前把构建任务配置好, 需要部署时, 直接运行Python脚本, 即可完成批量的构建触发

网友评论