Jenkins多分支流水线(Multibranch Pipeline )项目类型能够在同一个项目的不同分支上实现不同的Jenkinsfile。在多分支流水线项目中, Jenkins 自动的发现、管理和执行在源代码控制中包含Jenkinsfile
的分支的流水线,这消除了手动创建和管理流水线的需要。
在实际应用中,我们经常需要Git+Jenkins实现代码提交触发Job的自动构建。对于普通Job,webhook自动触发即可;但是对于多分支流水线,每次webhook触发的可能是master、develop或更多分支的构建,这显然是不符合要求的,将会产生很多垃圾的构建历史,给后期查看构建历史排错带来极大的不便。
因此,我们需要的是webhook按分支触发,例如我们的应用场景:
自动构建只针对develop分支,这样按分支构建,将会避免master或其他分支产生垃圾构建。
注意:本文只介绍通过generic webhook trigger触发部分,至于git版本库端的webhook请根据实际情况自行配置。
1.generic webhook trigger 插件实现Jenkins 触发器;
2.通过插件的正则匹配,基于refs/heads/develop、refs/heads/master进行判断;
(1)若develop分支提交代码,则变量ref=refs/heads/develop,匹配refs/heads/develop,触发构建;
(2)若master分支提交代码,则变量ref=refs/heads/master,不匹配refs/heads/develop,不触发构建;
3.在develop分支中根据Jenkinsfile进入不同的stage构建;
由于触发的是develop分支,则when条件匹配develop分支,develop分支构建;而master分支构建跳过。
关于正则匹配及多分支流水线,请参考以下链接:
- https://www.jenkins.io/zh/doc/book/pipeline/multibranch/
- https://plugins.jenkins.io/generic-webhook-trigger/
- https://github.com/jenkinsci/generic-webhook-trigger-plugin/tree/master/src/test/resources/org/jenkinsci/plugins/gwt/bdd
git每个分支必须有相同Jenkinsfile文件,否则“Discovery Branches”检测不到分支。
pipeline {
agent any
options {
ansiColor('xterm')
timestamps()
}
triggers {
GenericTrigger (
causeString: 'Triggered by develop',
genericVariables: [[key: 'ref', value: '$.ref']],
printContributedVariables: true,
printPostContent: true,
regexpFilterExpression: 'refs/heads/' + BRANCH_NAME,
regexpFilterText: 'refs/heads/develop',
token: 'VXnNT5X/GH8Rs'
)
}
stages {
stage("测试部署") {
when {
branch 'develop'
}
steps {
echo 'develop branch'
}
}
stage("生产部署") {
when {
branch 'master'
}
steps {
echo 'master branch'
}
}
}
post {
unstable {
emailext (
body: """项目名称:${JOB_NAME}\n构建编号:${BUILD_NUMBER}\n构建日志:${BUILD_URL}console""",
subject: '【Jenkins构建通知】:$JOB_NAME - Build # $BUILD_NUMBER - Unstable!',
to: '[email protected]',
from: '[email protected]'
)
}
success {
emailext (
body: """项目名称:${JOB_NAME}\n构建编号:${BUILD_NUMBER}\n构建日志:${BUILD_URL}console""",
subject: '【Jenkins构建通知】:$JOB_NAME - Build # $BUILD_NUMBER - Successful!',
to: '[email protected]',
from: '[email protected]'
)
}
failure {
emailext (
body: """项目名称:${JOB_NAME}\n构建编号:${BUILD_NUMBER}\n构建日志:${BUILD_URL}console""",
subject: '【Jenkins构建通知】:$JOB_NAME - Build # $BUILD_NUMBER - Failure!',
to: '[email protected]',
from: '[email protected]'
)
}
}
}
其中:triggers部分就是本次多分支流水线的关键所在,为便于解释,我们在下面详细介绍
Jenkinsfile中的triggers部分,是Generic Webhook Trigger 插件的具体配置,可以通过Declarative Directive Generator
(即声明式指令生成器)图形化生成上面的代码,如下:
token:通过http://JENKINS_URL/generic-webhook-trigger/invoke?token=VXnNT5X/GH8Rs
可以触发job。
其中:
(1)Expression:通过正则表达式匹配不同分支,此项目有两个分支,即:
refs/heads/master
refs/heads/develop
而’refs/heads’ + BRANCH_NAME 中的BRANCH_NAME是通过环境变量获取构建过程中的当前分支。
(2)Text:匹配的结果,即如果通过正则匹配的结果为refs/heads/develop,则触发构建;否则不会触发构建
(1)浏览器中通过webhook手动触发构建:
http://x.x.x.x/generic-webhook-trigger/invoke?token=VXnNT5X/GH8Rs
通过上图可看出develop分支触发了自动构建,而master分支则没有触发。
Webhook按分支触发自动构建使多分支流水线更加灵活化,在便于运维集中管理每个项目的分支同时,有效避免了多分支同时构建产生过多的垃圾构建。
PS:如果你对博文感兴趣,请关注我的公众号“木讷大叔爱运维”,与你分享运维路上的点滴。