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

如何只在生成特定分支时运行生成步骤/阶段?

例如,只有在分支名为 deployment时才运行部署步骤,其他所有步骤保持不变。

252460 次浏览

只要使用 ifenv.BRANCH_NAME,例如:

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

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

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 状态来决定是否运行,那么可以设置指令 beforeAgent true来避免启动代理来运行条件:

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

发布文章 和 < a href = “ https://www.jenkins.io/doc/book/eline/language/# when”rel = “ noReferrer”> docs


更新
新的时间条款
参考文献: < a href = “ https://jenkins.io/blog/2018/04/09/whats- 在-声明性”rel = “ norefrer”> https://jenkins.io/blog/2018/04/09/whats-in-declarative

Equals-比较两个值-字符串、变量、数字、布尔值- 如果它们相等,返回 true 我真不知道我们怎么会错过 可以使用 not 进行“不等于”比较 { equals... }组合也是。

ChangeRequest-在其最简单的形式中,如果 管道正在构建更改请求,例如 GitHub 请求。 您还可以根据更改请求进行更详细的检查, 允许你问“这是一个针对主人的变更请求吗?” 树枝?”还有更多。

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

Tag-与 buildingTag 更加详细的等价物,允许您检查 与标记名本身相对应。

根据其他答案,我加入了平行阶段的情景:

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

我添加这个答案是为了明确提到在 台阶中使用条件,而在 declarative pipelines中都使用 舞台

声明性管道阶段中的条件

正如@ChandanNayak 和其他人已经显示的,这可以基于 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'
}
}
}
}

对于一个 脚本管道,你可以不使用 script块,如@Krzysztof Kraso 所示

我创建了如下更多的嵌套阶段:

    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