詹金斯管道中的条件步骤/阶段
Posted
技术标签:
【中文标题】詹金斯管道中的条件步骤/阶段【英文标题】:Conditional step/stage in Jenkins pipeline 【发布时间】:2016-10-08 00:55:00 【问题描述】:仅在构建特定分支时如何运行构建步骤/阶段?
例如,仅当分支名为 deployment
时才运行部署步骤,其他一切都保持不变。
【问题讨论】:
【参考方案1】:只需使用if
和env.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
块的情况下使用它
【讨论】:
以上是关于詹金斯管道中的条件步骤/阶段的主要内容,如果未能解决你的问题,请参考以下文章