Jenkins多分支构建

2021-06-03 18:05:31 浏览数 (1)

一.创建多分支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
 )
}

0 人点赞