【发布时间】:2016-10-08 00:55:00
【问题描述】:
仅在构建特定分支时如何运行构建步骤/阶段?
例如,仅当分支名为 deployment 时才运行部署步骤,其他一切都保持不变。
【问题讨论】:
标签: jenkins groovy jenkins-pipeline
仅在构建特定分支时如何运行构建步骤/阶段?
例如,仅当分支名为 deployment 时才运行部署步骤,其他一切都保持不变。
【问题讨论】:
标签: jenkins groovy jenkins-pipeline
只需使用if 和env.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 state 来决定是否运行,则可以设置指令 beforeAgent true 以避免启动代理来运行条件:
when { beforeAgent true; expression { return isStageConfigured(config) } }
更新
新的 WHEN 子句
参考:https://jenkins.io/blog/2018/04/09/whats-in-declarative
equals - 比较两个值 - 字符串、变量、数字、布尔值 - 如果它们相等,则返回 true。老实说,我不确定我们是怎么错过的 早点添加这个!您可以使用 not 进行“不等于”比较 { 等于 ... } 组合。
changeRequest - 以最简单的形式,如果这将返回 true Pipeline 正在构建更改请求,例如 GitHub 拉取请求。 您还可以对变更请求进行更详细的检查, 允许你问“这是针对主人的变更请求吗? 分支?”等等。
buildingTag - 一个简单的条件,只检查管道是否是 针对 SCM 中的标签运行,而不是针对分支或特定 提交参考。
tag - 更详细的 buildingTag 等价物,允许您检查 针对标签名称本身。
【讨论】:
when{} 条件评估为假。 :(
beforeAgent true 来避免这种情况
beforeAgent 现在是解决此问题的方法。
根据其他答案,我正在添加并行阶段场景:
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'
}
}
}
}
}
}
【讨论】:
我添加这个答案是为了明确提及在 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 块的情况下使用它
【讨论】: