设置好了功能强大的流水线后,接下来我们要做的就是去执行流水线,如果都靠手动去触发流水线,显然不符合带着自动化基因新一代工程师的风格,必须自动触发。
那么Jenkins的Pipeline支持哪些触发机制呢。一起来看一下。
定时触发:cron
cron规则与crontab的规则是一样的
1 2 3 4 5 6 7 8 9 10 11 12 13
| pipeline{ agent any triggers{ cron('0 0 * * *') } stages{ stage('半夜触发'){ steps{ echo "凌晨执行" } } } }
|
轮询代码仓库
周期性检查代码,看代码是否有更新。这种方式需要使用
1 2 3 4 5 6 7 8 9 10 11 12 13
| pipeline{ agent any triggers{ pollSCM('* * * * *') } stages{ stage('每分钟检查'){ steps{ echo "每分钟检查代码仓库是否更新" } } } }
|
由上游任务触发
1 2 3 4 5 6 7 8 9 10 11 12 13
| pipeline{ agent any triggers{ upstream(upstreamProjects: 'job1,job2', threshold: hudson.model.Result.SUCCESS) } stages{ stage('上游触发'){ steps{ echo "当job1或job2执行成功时,触发该流水线" } } } }
|
hudson.model.Result包括以下状态:
ABORTED:任务被手动中止
FAILURE:构建失败
SUCCESS:构建成功
UNSTABLE:存在一些错误,但构建没失败
NOT_BUILT:多阶段构建时,前面阶段问题导致后面阶段无法执行
GitLab通知触发
详情请在插件Gitlab plugin的github页面上查看
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| pipeline{ agent any triggers{ gitlab( triggerOnPush: true, triggerOnMergeRequest: true, branchFilterType: 'All', secretToken: "abcdxxxfa") } stages{ stage('构建'){ steps{ echo "gitlab 触发" } } } }
|
将构建状态信息推送到GitLab
- 在Jenkins的系统设置中,Gitlab选项下填入Gitlab信息。例Connection name设为gitlab
- 按提示设置Gitlab的凭证,以对话框中输入Gitlab平台获取的API token
- 在pipeline的post部分,将构建结果更新到Gitlab相应的commit记录下,同时还需要在options参数中加入
gitLabConnection配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| pipeline{ agent any triggers{ gitlab( triggerOnPush: true, triggerOnMergeRequest: true, branchFilterType: 'All', secretToken: "abcdxxxfa") } stages{ stage('构建'){ steps{ echo "gitlab 触发" } } } post{ failure{ updateGitlabCommitStatus name: 'build', state: 'failed' } success{ updateGitlabCommitStatus name: 'build', state: 'success' } } options{ gitLabConnection('gitlab') } }
|
Generic Webhook Trigger插件触发
Generic Webhook Trigger是一个通用的通过Webhook的方式触发pipeline的插件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| pipeline{ agent any triggers{ GenericTrigger( genericVariables: [ key: 'ref', value: '$.ref' ], token: 'secret',
causeString: 'Triggered on $ref', printContributedVariables: true, printPostContent: true, regexpFilterText: '$ref', regexpFilterExpression: 'refs/heads(master|dev)' ) } stages{ stage('自定义触发'){ steps{ echo "Generic 触发" } } } }
|
然后通过POST请求触发
1
| curl -X POST -H "Content-Type: application/json" -d '{"ref": "refs/heads/master" }' -vs http://jenkins.local:8080/jenkins/generic-webhook-trigger/invoke?token=secret
|
触发条件依靠:token、regexpFilterText、regexpFilterExpression三个参数。首先token必须匹配,其次regexpFilterText指定的key对应的值满足regexpFilterExpression表达式。
参考资料
《Jenkins 2.X实践指南》