Jenkins自动化是指项目按照一定的规则自动执行,这些规则被称为项目触发条件。Jenkins内置支持cron、pollSCM、upstream三种方式来实现触发器。其他方式可以通过插件来实现。
1. Jenkins内置触发器:
对于触发条件,可以从两个维度来区分:时间触发和事件触发。时间触发是指定义一个时间,时间到了就会触发项目执行。常见的定时执行方式有cron和轮询代码仓库pollSCM。事件触发就是发生了某个事件就触发pipeline执行,这个事件可以是手动在界面上触发、其他job主动触发、HTTP API Webhook触发等。由上游任务触发的方式是upstream。
2. 配置触发器的方法:
有两种方法配置触发器:(1)在Jenkins Web上配置;(2)写在pipeline中。在Jenkins pipeline中使用trigger指令来定义时间触发,但需要手动触发一次任务,让Jenkins加载pipeline后,trigger指令才会生效。
3. 定时执行:cron
定时执行就像cronjob,到时间就执行。它的使用场景通常是执行一些周期性的job,如每夜构建。Jenkins trigger cron语法采用的是UNIX cron语法(有些细微的区别)。一条cron包含5个字段,使用空格或Tab分隔,格式为:MINUTE HOUR DOM MONTH DOW。每个字段的含义为:MINUTE(每小时的第几分钟),HOUR(每天的第几小时),DOM(每月的第几天),MONTH(月份),DOW(每周的第几天)。还可以使用特殊字符一次性指定多个值,如*表示匹配所有的值,M-N表示匹配M到N之间的值,M-N/X or */X表示匹配指定范围或整个有效范围,并以X为步长的值,A,B,· · ·,Z表示使用逗号枚举多个值。
在大型组织中,可能会出现同时执行多个定时任务的情况,例如每天的零点(0 0 * * *)执行任务。然而,这种方式会导致负载不均衡。为了解决这个问题,Jenkins trigger cron语法中引入了"H"字符。"H"代表hash,它是一个作业名称的哈希值,对于任何给定的项目都保持稳定。
对于不需要精确到零点执行的任务,可以使用cron表达式"H 0 * * *",表示在0点0分至0点59分之间的任意时间点执行。需要注意的是,当应用于DOM字段时(一个月的某一天),H可能会导致不准确的情况,因为一个月可能是31天,也可能是28天。
Jenkins trigger cron还提供了一些人性化的别名:@yearly、@annually、@monthly、@weekly、@daily、@midnight和@hourly。它们使用哈希值进行自动平衡。其中,@hourly与H * * * *相同,表示一小时内的任意时间;@midnight表示在凌晨00:00到02:59之间的某个时间。
要在Jenkins中配置这些触发器,可以按照以下步骤操作:
1. 在Jenkins Web界面上配置:进入Jenkins -> My Views -> [项目名称] -> Configure。
2. 在pipeline中配置:
- 轮询代码仓库:使用pollSCM命令定期检查代码仓库是否有变化。轮询的时间间隔应尽可能短,以减少构建间隔时间内可能包含的多次代码提交。如果构建失败,无法立即确定是哪一次代码提交导致了问题。实际上,更好的方式是让代码仓库主动通知Jenkins而不是频繁地去检查。这种情况下会采用轮询的方式。
- 由上游任务触发:使用upstream关键字指定上游任务,如果上游任务有变化,就会触发该pipeline。
通过以上配置,可以根据需要选择合适的触发器来实现定时任务的执行。
当任务B的执行依赖于任务A的执行结果时,我们称任务A为任务B的上游任务。在Jenkins 2.22及更高版本中,trigger指令开始支持upstream类型的触发条件。upstream的作用是让任务B的pipeline能够自行决定依赖哪些上游任务。
要将upstream定义在下游任务中,可以在配置下游任务时使用`upstreamProjects`参数,并用逗号`,`分隔多个上游任务。`threshold`参数用于指定上游任务的执行结果达到什么值时触发下游任务。`hudson.model.Result`是一个枚举类型,包括以下值:
- ABORTED:任务被手动中止。
- FAILURE:构建失败。
- SUCCESS:构建成功。
- UNSTABLE:存在一些错误,但不至于构建失败。
- NOT_BUILT:在多阶段构建时,前面阶段的问题导致后面阶段无法执行。
要在Jenkins Web界面上进行配置,可以按照以下步骤操作:
1. 在Jenkins中选择"My Views",然后点击"[项目名称]"进入项目页面。
2. 点击"Configure"按钮进行配置。
如果要在pipeline中配置upstream和threshold,可以使用以下代码示例:
```groovy
pipeline {
agent any
stages {
stage('Build') {
steps {
// 执行上游任务test-project-freestyle01或test-project-pipeline02,且其执行状态是成功的,就会触发该pipeline。
sh 'echo "Building the pipeline"'
}
}
}
upstream {
// 定义上游任务
task test-project-freestyle01 {
// ...
}
task test-project-pipeline02 {
// ...
}
}
threshold(result: 'SUCCESS') { // 当上游任务的执行结果为成功时触发下游任务
echo "Pipeline triggered by upstream tasks"
}
}
```
另外,还可以使用GitLab通知触发来实现自动构建。通过GitLab通知触发,当GitLab发现源代码有变化时,就会触发Jenkins执行构建。开发人员可以通过推送代码来触发Jenkins执行构建,具体操作如下图所示:
注意:不论是单分支的pipeline项目还是多分支的pipeline项目,它们暴露的webhook地址格式都是:/project/<项目名>,而不是/job/<项目名>。这个webhook的调用权限取决于以下两个设置项:
1. Jenkins全局权限设置。
2. 该pipeline是否设置了“Secret token”。
不论Jenkins全局权限如何设置,基于安全考虑,通常会为该pipeline生成一个Secret token,只有携带Secret token的请求才会被处理。生成Secret token的方法很简单:只需点击页面上的“Advanced”按钮,就可以看到一个“Secret token”输入框。推荐单击其右下角的“Generate”按钮自动生成Secret token,而不是手动输入。需要注意的是,需要保存生成的Secret token,因为在接下来的步骤中会用到。
3. GitLab:配置通知Jenkins
(1)登录具有相应权限的GitLab用户,然后点击代码仓库[group01 / project01-private],接着进入Settings。
将Jenkins暴露的webhook和生产的Secret token复制到相应的输入框中。如果出现报错:“Url is blocked: Requests to localhost are not allowed”,请按照以下步骤操作:启用webhook功能:使用管理员用户root登录到后台,勾选“Allow requests to the local network from web hooks and services”。
(2)测试整个链路是否通畅
在GitLab上添加好这个webhook后,可以转到表单下方,找到已添加的webhook列表,单击刚才创建的webbook。选择“Test”按钮并选择“Push events”,GitLab会向该webhook发送一个event。然后回到Jenkins上该项目的详情页,在构建历史记录中查看被GitLab触发的构建,这些构建都会被标记为“Started by GitLab push by user02”,这说明链路已经通畅。
4. 将构建状态信息推送到GitLab(未成功实验)
当Jenkins执行完构建后,还可以将构建结果推送到GitLab的相应commit记录上,这样就可以将构建状态与commit关联起来。以下是具体的操作步骤:
1. 创建GitLab Tokens,并保持生成的token不被泄露。
2. 创建jenkins凭据。
3. 链接GitLab。在Jenkins中依次点击“Configure System”、“[Gitlab]”,配置好后单击“Test Connection”按钮,如果返回Success,就说明集成成功了。注意,“Connection name”的值gitlab-token-user01在后面会用到。
4. 在pipeline的post部分,将构建结果更新到GitLab的相应commit记录上。除此之外,还需要在options部分加入gitLabConnection配置,同时传入“gitlab-token-user01”参数。这个参数就是上面的“Connection name”。
5. 使用GWT插件实现触发(了解)。