一.创建多分支pipeline
在实际中,需要多分支同时进行开发。如果每个分支都创建一个Jenkins项目,比较多余。创建选择 Multibranch Pipeline
1.设置代码仓库地址,也就是要选择分支的仓库地址
2.设置分支扫描触发策略 分支扫描是指Jenkins根据一定的策略去代码仓库扫描分支,如果有新分支就创建一个以分支名命名的任务,如果发现有分支被删除了,就删除相应的Jenkins任务。
在”Scan Multibranch Pipeline Triggers”下就只有一一个可选项:Periodically if not otherwise run ( 没有手动触发,就定期扫描分支)。勾选此选项,设置扫描的间隔时长
读者可根据项目建立分支的频繁程度设置周期的长短。越频繁建立分支,扫描周期应越短。当然我们也可以单击任务页面左侧的”Scan Multibranch Pipeline Now”项,手动触发Jenkins去扫描分支。
3.孤儿任务(Orphaned Item)处理策略 如果在代码仓库中删除了release分支,那么在多分支任务页面上,该分支在Jenkins上的任务也应该被删除。至于什么时候删除,取决于下次分支扫描的时间。如果代码仓库中的分支被删除了,而Jenkins上的相应任务没有被删除,那么这个任务就被称为孤儿任务。
对于分支任务上的历史记录,保存多长时间是可以设置的
参数含义: Days to keep old items: 保留多少天 Max#of old items to keep:最多保留多少个孤儿任务
二.根据分支部署
git分支可以用于对代码进行物理隔离。对分支的管理有很多方法,比如主干开发,发布分支以及Gitflow法等。我们不讨论它们的好坏,但不论使用哪种分支管理方法,都可能会涉及一个问题:如何根据不同的分支做不同的事情,比如根据不同的分支部署到不同的环境。
类似这样的事情可以使用if-else来实现
代码语言:javascript复制tage("deploy to test"){
steps{
script {
if (env.GIT_BRANCH == 'master') {
echo "deploy to test env"
}
}
}
}
stage("deploy to prod"){
steps{
script {
if (env.GIT_BRANCH == 'release') {
echo "deploy to prod"
}
}
}
}
但是这样的代码不够优雅,而且不是声明式的。使用when指令可以让pipeline看起来更优雅。
代码语言:javascript复制stage("deploy to test") {
when {
branch 'master'
}
steps{
echo "deploy to test"
}
}
stage("deploy to prod") {
when {
branch 'release'
}
steps {
echo "deploy to prod"
}
}
gitlab触发与多分支
对于GitLab来说,并没有Jenkins多分支pipeline的概念,所以GitLab只会触发Jenkins进行分支索引 ( branch index ) ,Jenkins可根据索引结果决定是否执行构建。对于多分支pipeline,Jenkins GitLab插件只监听push事件,不监听merge request事件。
而在Jenkins多分支pipeline项目的设置页面中,是找不到GitLab配置项的。只能通过修改Jenkinsfile来实现,在triggers指令中加入gitlab配置。
代码语言:javascript复制triggers {
gitlab(triggerOnPush: true,
triggerOnMergeRequest: true,
branchFilterType: 'Al1',
secretToken: "abcdefghijklmnopqrstuvwxyz0123456789ABCDEF")
}
值得一提的是,笔者通过实验发现,对于不同的分支使用不同的secretToken时,是以master分支的secretToken为准的。
Generic Webhook多分支
pipeline场景下的应用在多分支pipeline场景下,我们希望触发某个分支的构建执行,Generic Trigger可以这么传参
代码语言:javascript复制triggers {
GenericTrigger(
genericVariables:[
[key: 'ref' ,value: '$.ref']
],
token: env.J0B_NAME,
regexpFilterText: '$ref',
regexpFilterExpression: 'refs/heads/' env.BRANCH_NAME
)
}