自动化流水线---触发任务
一:周期性构建(日程表格式)
这是一种cron类型的构建机制,它按照预定义的时间周期启动任务;
◼ 对于期望能够基于代码变更进行触的CI场景来说,周期性构建并非其最佳选项,但对于有些类型的任务,它
却也能够通过精心编排的周期性构建来避免资源冲突;
Jenkins cron语法遵循Unix cron语法的定义,但在细节上略有差别;
◼ 一项cron的定义包含由空白字符或Tab分隔的5个字段,用于定义周期性的时间点;
◼ Jenkins cron还可以使用以下特定字符,一次性指定多个值
◆ * specifies all valid values
◆ M-N specifies a range of values
◆ M-N/X or */X steps by intervals of X through the specified range or whole valid range(以X为步长)
◆ A,B,…,Z enumerates multiple values(逗号分隔的枚举值)
◼ 此外,H也可用于任何字段,它能够在一个时间范围内对项目名称进行散列值计算出一个唯一的偏移量,以
避免所有配置相同cron值的项目在同一时间启动;
◆ 例如 triggers { cron(H(0,30) * * * *) }
在流水线作业中设置如下:
二:轮询构建(日程表格式)
三:upstream:由上游作业触发
若job-x依赖于job-y的执行结果,则称为job-y为job-x的upstream(上游);
Jenkins自2.22版本开始支持在triggers中定义upstream类型的触发条件;
◼ 当前任务依赖到的upstream任务定义在upstreamProjects参数中,多个任务彼此间以逗号分隔;
◼ 触发条件为upstream的执行状态
GitLab通知触发
GitLab通知触发,是指流水线关联的GitLab Repository上的代码出现变更时,由GitLab将相关事件经由
Webhook通知给Jenkins,从而触发Jenkins执行指定Job的构建操作
◼ 避免了pollSCM的频繁轮询依然存在滞后可能性的问题
◼ 依赖于GibLab插件和Git插件
整合GitLab和Jenkins
配置要点
◼ 前提:GitLab和Jenkins同在本地网络时,需要以管理员权限设置“外发请求”,启用“允许Webhook和服务
对本地网络的请求”
◆授予Jenkins访问GitLab上仓库中特定用户的代码权限
◆(可选) Jenkins可基于SSH协议访问GitLab API,从而将构建状态推送至GitLab
◼ GitLab API访问授权
◆ (可选)配置GitLab API访问认证(Access Token)及操作权限
◆ 配置Jenkins启用/project端点认证
◆ (可选)配置Jenkins能通过配置的Access Token接入GitLab API
◼ Jenkins pipeline项目的通知授权
◆ 创建流水线任务,选择使用的“GitLab Connection”,并选定使用“Build when a change is pushed to GitLab.”触发器
◆ 而后为构建触发器生成Secret token
◆ 配置GitLab Repository能通过Webhook,基于该Secret Token触发构建
具体配置过程相关文档
◼ https://docs.gitlab.com/ce/integration/jenkins.html
配置如下:
一:在jenkins上安装Gitlab插件和Generic Webhook Trigger插件
已安装完毕
安装完成后,构建的任务上出现
Build when a change is pushed to GitLab. GitLab webhook URL: http://10.0.0.100:8080/project/spring-boot-helloworld(允许对方仓库出现什么事件 如:推送事件、接受合并请求事件)
不允许随便推送事件,给接口设置TOKEN
二:配置Gitlab(管理员-设置-网络-出站请求,勾选允许来自 web hooks 和服务对本地网络的请求)
确保在Gitlab主机上能解析Jenkins的主机名,并在代码仓库上进行设置(webhooks)
把在jenkins上的url地址和TOKEN复制上去(http://10.0.0.100:8080/project/spring-boot-helloworld)
做推送测试
在Jenkins的流水线作业查看,由于接收到了Gitlab的推送请求,已完成新一次的构建
哪个分支变更,就构建哪个分支(安装Git Parameter插件)
在流水线任务中进行配置-添加参数
修改代码,进行测试
1、在Gitlab仓库中拉取代码到本地仓库
[root@ubuntu2004 ~]#mkdir jerry
[root@ubuntu2004 ~]#cd jerry/
[root@ubuntu2004 jerry]#git clone http://gitlab.mengfanchao.com/devops/spring-boot-helloWorld.git
正克隆到 'spring-boot-helloWorld'...
Username for 'http://gitlab.mengfanchao.com': root
Password for 'http://[email protected]':
remote: Enumerating objects: 256, done.
remote: Total 256 (delta 0), reused 0 (delta 0), pack-reused 256
接收对象中: 100% (256/256), 35.06 KiB | 717.00 KiB/s, 完成.
处理 delta 中: 100% (73/73), 完成.
2、进入到代码目录,查看当前所处分支
spring-boot-helloWorld
[root@ubuntu2004 jerry]#cd spring-boot-helloWorld/
[root@ubuntu2004 spring-boot-helloWorld]#ls
deploy Dockerfile Jenkinsfile LICENSE pom.xml README.md rollouts src
[root@ubuntu2004 spring-boot-helloWorld]#git branch -l
* main
3、对代码文件进行修改并跟踪提交
[root@ubuntu2004 spring-boot-helloWorld]#vim src/main/java/com/neo/controller/HelloWorldController.java
修改前:return "version 0.9.6!";
修改后:return "version 0.9.7!";
[root@ubuntu2004 spring-boot-helloWorld]#vim pom.xml
修改前:<version>0.9.6-SNAPSHOT</version>
修改后:<version>0.9.7-SNAPSHOT</version>
跟踪
[root@ubuntu2004 spring-boot-helloWorld]#git add .
提交
[root@ubuntu2004 spring-boot-helloWorld]#git commit -m "update v0.9.7"
4、查看文件状态
[root@ubuntu2004 spring-boot-helloWorld]#git status
位于分支 main
您的分支与上游分支 'origin/main' 一致。
尚未暂存以备提交的变更:
(使用 "git add <文件>..." 更新要提交的内容)
(使用 "git restore <文件>..." 丢弃工作区的改动)
修改: pom.xml
修改: src/main/java/com/neo/controller/HelloWorldController.java
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
5、跟踪并提交
[root@ubuntu2004 spring-boot-helloWorld]#git config --local user.name jerry
[root@ubuntu2004 spring-boot-helloWorld]#git config --local user.email [email protected]
[root@ubuntu2004 spring-boot-helloWorld]#git add .
[root@ubuntu2004 spring-boot-helloWorld]#git commit -m "update to 0.9.7"
[main 33a86d9] update to 0.9.7
2 files changed, 2 insertions(+), 2 deletions(-)
6、推送到远程仓库
[root@ubuntu2004 spring-boot-helloWorld]#git push origin
Username for 'http://gitlab.mengfanchao.com': root
Password for 'http://[email protected]':
枚举对象中: 19, 完成.
对象计数中: 100% (19/19), 完成.
使用 2 个线程进行压缩
压缩对象中: 100% (8/8), 完成.
写入对象中: 100% (10/10), 729 字节 | 364.00 KiB/s, 完成.
总共 10 (差异 3),复用 0 (差异 0)
To http://gitlab.mengfanchao.com/devops/spring-boot-helloWorld.git
fecc8c2..33a86d9 main -> main
在main分支上会生成事件,并推送给Jenkins,在jenkins上自动触发任务
去客户端访问查看
不但可以让Gitlab触发Jenkins,反过来,Jenkins也可以在自己构建完之后把流水线执行结果返回头去配置到Gitlab之上作为回馈信息
推送构建状态信息至GitLab
Jenkins也能将流水线上的构建状态结果通过Webhook推送至GitLab进行显示,这需要配置GitLab
Connection
配置步骤简要说明
◼ 在GitLab上,以仓库所关联的用户生成Access Token,并选择可访问的API
◼ 在Jenkins上,将GitLab生成的Access Token保存为Credential
◼ 在Jenkins的系统配置中,添加GitLab Connection的定义
◼ 在FreeStyle类型的流水线上,选择要使用的GitLab Connection
◼ 在FreeStyle类型的流水线上,添加“构建后操作”
操作如下:
1、在GitLab上,以仓库所关联的用户生成Access Token,并选择可访问的API
(用户-编辑个人资料-访问令牌glpat-V3-GLosxv-9QPRmFpcWq)
2、在Jenkins上,将GitLab生成的Access Token保存为Credential(系统管理-manager Credential)
3、在Jenkins的系统配置中,添加GitLab Connection的定义
测试成功后保存
4、在FreeStyle类型的流水线上,选择要使用的GitLab Connection
5、在FreeStyle类型的流水线上,添加“构建后操作”
触发过程:生成feature分支-创建分支合并请求-完成合并-触发相关任务
1、生成并切换到develop分支
[root@ubuntu2004 spring-boot-helloWorld]#git checkout develop
分支 'develop' 设置为跟踪来自 'origin' 的远程分支 'develop'。
切换到一个新分支 'develop'
2、对文件进行修改
[root@ubuntu2004 spring-boot-helloWorld]#vim pom.xml
修改前:<version>0.9.7-SNAPSHOT</version>
修改后:<version>0.9.8-SNAPSHOT</version>
[root@ubuntu2004 spring-boot-helloWorld]#vim src/main/java/com/neo/controller/HelloWorldController.java
修改前:return "version 0.9.7!";
修改后:return "version 0.9.8!";
跟踪
[root@ubuntu2004 spring-boot-helloWorld]#git add .
提交
[root@ubuntu2004 spring-boot-helloWorld]#git commit -m "update v0.9.8"
[main 33a86d9] update to 0.9.8
2 files changed, 2 insertions(+), 2 deletions(-)
3、推送到远程仓库
[root@ubuntu2004 spring-boot-helloWorld]#git push origin
Username for 'http://gitlab.mengfanchao.com': root
Password for 'http://[email protected]':
枚举对象中: 19, 完成.
对象计数中: 100% (19/19), 完成.
使用 2 个线程进行压缩
压缩对象中: 100% (8/8), 完成.
写入对象中: 100% (10/10), 729 字节 | 364.00 KiB/s, 完成.
总共 10 (差异 3),复用 0 (差异 0)
To http://gitlab.mengfanchao.com/devops/spring-boot-helloWorld.git
fecc8c2..33a86d9 得develop -> decelop
创建合并请求
合并反馈会点赞
触发分支合并请求,应自动检出变动的分支
可写为<:>,或者留空
Jenkins回推效果
四、Generic Webhook Trigger(通用webhook触发器)
Generic Webhook Trigger插件
◼ 简称为GWT
◼ 提供的是一种通用的触发机制,它允许直接经
由该插件暴露的API
(<JENKINS_URL>/generic-webhooktrigger/invoke)接收JSON或XML格式的HTTP
POST请求进行触发
◼ 触发的Jenkins项目则由配置的规则和POST请求
进行定义
◆支持从POST请求的JSONPath和Xpath中提取数据
◆支持从query parameters中提取数据
◆支持从headers中提取数据
依赖关系
◼ 需要安装Generic Webhook Trigger插件;
◼ 支持白名单
◆系统管理 → 系统配置 → Generic Webhook Trigger
定义白名单
在流水线作业中配置Generic Webhook Trigger
通用触发条件
在Gitlab上生成token信息
[root@ubuntu2004 spring-boot-helloWorld]#openssl rand -base64 20
SUgkhLV7OzrTZ+12khey+sQ4rZc=