【问题标题】:Conditional step/stage in Jenkins pipeline詹金斯管道中的条件步骤/阶段
【发布时间】:2016-10-08 00:55:00
【问题描述】:

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

例如,仅当分支名为 deployment 时才运行部署步骤,其他一切都保持不变。

【问题讨论】:

    标签: jenkins groovy jenkins-pipeline


    【解决方案1】:

    只需使用ifenv.BRANCH_NAME,例如:

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

    【讨论】:

    • 应该在舞台之前还是之后?
    • 舞台前,如果有分支,舞台可以在里面
    • 认为展示位置并不重要
    • 我无法通过声明性管道完成这项工作。这适用于声明性管道吗? WorkflowScript: 9: 需要一个阶段@第 9 行第 9 列。 if (env.BRANCH_NAME == "deployment") { WorkflowScript: 8: 没有指定阶段@第 8 行第 5 列。stages {
    • 这仅适用于脚本化管道。对于声明性管道,您应该在步骤中使用脚本 {}。
    【解决方案2】:

    在声明式管道语法中做同样的事情,下面是几个例子:

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

    stage('feature-branch-stuff') {
        when {
            branch 'feature/*'
        }
        steps {
            echo 'run this stage - only if the branch name started with feature/'
        }
    }
    

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

    stage('env-specific-stuff') {
        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


    如果条件不需要 git state 来决定是否运行,则可以设置指令 beforeAgent true 以避免启动代理来运行条件:

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

    Release postdocs


    更新
    新的 WHEN 子句
    参考:https://jenkins.io/blog/2018/04/09/whats-in-declarative

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

    changeRequest - 以最简单的形式,如果这将返回 true Pipeline 正在构建更改请求,例如 GitHub 拉取请求。 您还可以对变更请求进行更详细的检查, 允许你问“这是针对主人的变更请求吗? 分支?”等等。

    buildingTag - 一个简单的条件,只检查管道是否是 针对 SCM 中的标签运行,而不是针对分支或特定 提交参考。

    tag - 更详细的 buildingTag 等价物,允许您检查 针对标签名称本身。

    【讨论】:

    • 我可以将它用于后期构建操作吗?
    • 我发现 Jenkins 启动了指定的代理,即使 when{} 条件评估为假。 :(
    • @Trejkaz 你现在可以使用beforeAgent true 来避免这种情况
    • @NickJones 确实,beforeAgent 现在是解决此问题的方法。
    【解决方案3】:

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

    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'
                        }
                    }
                }
            }
        }
    }
    

    【讨论】:

      【解决方案4】:

      我添加这个答案是为了明确提及在 step 中使用条件,而不是 stage,两者都在 声明性管道 中。

      声明性管道阶段中的条件

      正如@Chandan Nayak 和其他人已经表明的那样,这可以基于when 来完成

      stage('myConditionalStage') {
          when {
              branch 'myBranch'
          }
          steps {
              echo 'triggered by myBranch'
          }
      }
      

      因此,myConditionalStage 阶段只有在被推送到 myBranch 时才会运行。

      声明性管道阶段步骤中的条件

      但是,如果您需要阶段的步骤部分中的条件,则可以使用 脚本化管道 中使用的 Groovy 语法(在本例中为 if/else)。如果是声明式管道,您必须将其放入script 块中,如下所示:

      stage('myStage') {
          steps {
              echo 'within myStage'
              script {
                  if (env.BRANCH_NAME == "myBranch") {
                      echo 'triggered by myBranch'
                  } else {
                      echo 'triggered by something else'
                  }
              }
          }
      }
      

      对于 脚本化管道,您可以在没有 @Krzysztof Krasoń 所示的 script 块的情况下使用它

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-02-27
        • 1970-01-01
        • 2022-10-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多