詹金斯管道中的条件步骤/阶段

Posted

技术标签:

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

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

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

【问题讨论】:

【参考方案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 post 和 docs


更新 新的 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 块的情况下使用它

【讨论】:

以上是关于詹金斯管道中的条件步骤/阶段的主要内容,如果未能解决你的问题,请参考以下文章

詹金斯管道:如何运行一个平行于许多阶段?

詹金斯:无法在管道阶段定义变量

在詹金斯管道中复制工件

在 Gitlab 管道中的条件手动阶段之后运行阶段

如何在詹金斯管道中访问 git commit 消息 INSIDE sh STEP?

检查詹金斯管道中是不是存在文件