Jenkins管道中的条件步骤/阶段


90

仅在构建特定分支时,如何运行构建步骤/阶段?

例如,仅在调用分支的情况下才运行部署步骤deployment,而其他所有都保持不变。

Answers:


180

在声明性管道语法中执行相同的操作,以下是一些示例:

stage('master-branch-stuff'){
  agent any
  when{
    branch 'master'
  }
  steps {
    echo 'run this stage - ony if the branch = master branch'
  }
}

<b

stage('feature-branch-stuff') {
    agent label:'test-node'
    when { branch "feature/*" }
    steps {
        echo 'run this stage - only if the branch name started with feature/'
    }
}

<b

stage('expression-branch') {
    agent label:'some-node'
    when {
    expression {
        return env.BRANCH_NAME != 'master';
        }
    }
    steps {
        echo 'run this stage - when branch is not equal to master'
    }
}

<b

stage('env-specific-stuff') {
    agent label:'test-node'
    when { 
      environment name: 'NAME', value: 'this' 
    }
    steps {
        echo 'run this stage - only if the env name and value matches'
    }
}

出现更有效的方法-https: //issues.jenkins-ci.org/browse/JENKINS-41187
另请 参阅-https://jenkins.io/doc/book/pipeline/syntax/#when


beforeAgent true如果条件不需要git状态来决定是否运行,则可以将指令设置为避免使代理旋转来运行条件:

when { beforeAgent true; expression { return isStageConfigured(config) } }

发布帖子文档


更新
新的WHEN条款
REF:https : //jenkins.io/blog/2018/04/09/whats-in-declarative

等于-比较两个值-字符串,变量,数字,布尔值-如果相等,则返回true。老实说,我不确定我们怎么错过之前添加的内容!您也可以使用not {equals ...}组合进行“不等于”比较。

changeRequest-以最简单的形式,如果此管道正在构建更改请求(例如GitHub拉取请求),则将返回true。您还可以针对更改请求进行更详细的检查,从而允许您询问“这是针对master分支的更改请求吗?” 以及更多。

buildingTag-一个简单的条件,仅检查Pipeline是否针对SCM中的标记而不是针对分支或特定的提交引用而运行。

标签-更详细的等效于buildingTag的标签,可让您检查标签名称本身。


1
我可以将其用于后期构建操作吗?
道格'18

1
我发现即使when{}条件评估为假,詹金斯也会启动指定的代理。:(
Trejkaz

1
@Trejkaz,您现在beforeAgent true可以避免这种情况
Nick Jones

1
实际上,@ NickJonesbeforeAgent现在是解决该问题的方法。
Trejkaz

45

只需使用ifenv.BRANCH_NAME,例如:

    if (env.BRANCH_NAME == "deployment") {                                          
        ... do some build ...
    } else {                                   
        ... do something else ...
    }                                                                       

4
如果应该在舞台之前还是之后?
喷射机

5
上舞台之前,如果有分支机构,舞台可以进入内部
KrzysztofKrasoń17-10-27

认为放置实际上并不重要
omu_negru

9
我无法通过声明性管道来完成这项工作。这对声明性管道有效吗?WorkflowScript:9:预期的阶段@ 9行,列9.如果(env.BRANCH_NAME == “部署”){WorkflowScript:8:无级指定@第8行,第5列的阶段{
pitchblack408

4
这仅适用于脚本化管道。对于声明性管道,应在步骤内使用脚本{}。
Pedro Henrique

1

根据其他答案,我正在添加并行阶段方案:

pipeline {
    agent any
    stages {
        stage('some parallel stage') {
            parallel {
                stage('parallel stage 1') {
                    when {
                      expression { ENV == "something" }
                    }
                    steps {
                        echo 'something'
                    }
                }
                stage('parallel stage 2') {
                    steps {
                        echo 'something'
                    }
                }
            }
        }
    }
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.