如何仅在构建特定分支时运行构建步骤/阶段?例如,仅当分支名为deployment时才运行部署步骤,其他所有内容保持不变。
deployment
0mkxixxg1#
在声明性管道语法中执行同样的操作,下面是几个示例:第一个更有效的方法即将出现-https://issues.jenkins-ci.org/browse/JENKINS-41187另请参阅-https://jenkins.io/doc/book/pipeline/syntax/#when指令beforeAgent true可以设置为避免启动代理来运行条件,如果条件不需要git state来决定是否运行:
beforeAgent true
when { beforeAgent true; expression { return isStageConfigured(config) } }
Release post和文档
更新
新建WHEN子句参考:https://jenkins.io/blog/2018/04/09/whats-in-declarativeequals -比较两个值-字符串、变量、数字、布尔值-如果它们相等,则返回true。老实说,我不知道我们之前怎么漏掉了这个!您也可以使用not { equals...}组合进行“not equals”比较。changeRequest -最简单的形式是,如果这个管道正在构建一个变更请求,比如GitHub pull请求,它将返回true。你也可以对变更请求做更详细的检查,允许你询问“这是一个针对master分支的变更请求吗?”等等。buildingTag -一个简单的条件,仅检查管道是否针对SCM中的标记运行,而不是针对分支或特定的提交引用。tag -buildingTag的更详细对等用法,可让您检查标签名称本身。
c0vxltue2#
只需使用if和env.BRANCH_NAME,例如:
if
env.BRANCH_NAME
if (env.BRANCH_NAME == "deployment") { ... do some build ... } else { ... do something else ... }
elcex8rz3#
我添加这个答案是为了明确地提到在 step 中使用条件,而不是在 stage 中使用条件,两者都在 * 声明性管道 * 中。
正如@Chandan Nayak和其他人所示,这可以基于when完成,如下所示
when
stage('myConditionalStage') { when { branch 'myBranch' } steps { echo 'triggered by myBranch' } }
因此,阶段myConditionalStage将仅在由到myBranch的推送触发时才运行。
myConditionalStage
myBranch
但是,如果您需要在阶段的步骤部分中使用条件,则可以使用 Scripted pipelines 中使用的Groovy语法(本例中为if/else)。对于 *Declarative pipelines *,您必须将其放入script块中,如下所示:
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' } } } }
对于 Scripted pipeline,您可以在没有script块的情况下使用它,如@Krzysztof Krasoń所示
bbmckpt74#
根据其他答案,我添加了并行阶段方案:
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' } } } } } }
l3zydbqr5#
我创建了更多的嵌套阶段,如下所示:
pipeline { // Agent To Run On agent none stages { // Processing OpenCV Optimizer stage('OpenCV Processing'){ when { expression { inputOptimizer == "OpenCV DNN" } } stages { // Checkout and Compile stage stage('SCM Checkout & Build'){ parallel { stage('Test On Windows') { agent { label "Stagging-Node" } steps { echo "first stage" } }//Test On Windows stage('Test On Linux') { agent { label "Stagging-Node" } steps { echo "second stage" } }//Test On Linux stage('Testing '){ agent { label "Stagging-Node" } steps { echo "second dddd" } }//Testing } } // Docker Build stage("Docker Build"){ steps { echo "Build stage" } } } } // Processing OpenVino Optimizer stage('OpenVino Processing'){ when { expression { inputOptimizer == "OpenVino CPU Yolov7" } } stages { // Checkout and Compile stage stage('SCM Checkout & Build'){ parallel { stage('Test On Windows') { agent { label "Stagging-Node" } steps { echo "first stage" } }//Test On Windows stage('Test On Linux') { agent { label "Stagging-Node" } steps { echo "second stage" } }//Test On Linux stage('Testing '){ agent { label "Stagging-Node" } steps { echo "second dddd" } }//Testing } } // Docker Build stage("Docker Build"){ steps { echo "Build stage" } } } } }//end of stages }//end of pipeline
5条答案
按热度按时间0mkxixxg1#
在声明性管道语法中执行同样的操作,下面是几个示例:
第一个
更有效的方法即将出现-https://issues.jenkins-ci.org/browse/JENKINS-41187
另请参阅-https://jenkins.io/doc/book/pipeline/syntax/#when
指令
beforeAgent true
可以设置为避免启动代理来运行条件,如果条件不需要git state来决定是否运行:Release post和文档
更新
新建WHEN子句
参考:https://jenkins.io/blog/2018/04/09/whats-in-declarative
equals -比较两个值-字符串、变量、数字、布尔值-如果它们相等,则返回true。老实说,我不知道我们之前怎么漏掉了这个!您也可以使用not { equals...}组合进行“not equals”比较。
changeRequest -最简单的形式是,如果这个管道正在构建一个变更请求,比如GitHub pull请求,它将返回true。你也可以对变更请求做更详细的检查,允许你询问“这是一个针对master分支的变更请求吗?”等等。
buildingTag -一个简单的条件,仅检查管道是否针对SCM中的标记运行,而不是针对分支或特定的提交引用。
tag -buildingTag的更详细对等用法,可让您检查标签名称本身。
c0vxltue2#
只需使用
if
和env.BRANCH_NAME
,例如:elcex8rz3#
我添加这个答案是为了明确地提到在 step 中使用条件,而不是在 stage 中使用条件,两者都在 * 声明性管道 * 中。
宣告式管缐阶段中的条件
正如@Chandan Nayak和其他人所示,这可以基于
when
完成,如下所示因此,阶段
myConditionalStage
将仅在由到myBranch
的推送触发时才运行。声明性管道阶段的步骤中的条件
但是,如果您需要在阶段的步骤部分中使用条件,则可以使用 Scripted pipelines 中使用的Groovy语法(本例中为
if/else
)。对于 *Declarative pipelines *,您必须将其放入script
块中,如下所示:对于 Scripted pipeline,您可以在没有
script
块的情况下使用它,如@Krzysztof Krasoń所示bbmckpt74#
根据其他答案,我添加了并行阶段方案:
l3zydbqr5#
我创建了更多的嵌套阶段,如下所示: