我正在尝试将我的Scripted管道转换为声明性管道。
想知道如何在steps {}
块内部执行简单的if语句。
stage ('Deploy to Docker') {
steps {
parallel (
"instance1" : {
environment {
containerId = sh(script: "docker ps --quiet --filter name=${fullDockerImageName}", returnStdout: true).trim()
}
steps {
if (containerId.isEmpty()) {
docker.image('some/image').run("--name ${fullDockerImageName}")
}
}
}
)
}
}
这会导致以下异常:
WorkflowScript: 201: Expected a step @ line 201, column 29.
if (containerId.isEmpty()) {
由于我不允许在if(..)
区块内执行简单的steps {}
,是否知道如何执行此操作?
使用when {}
创建一个完整的阶段似乎没有意义,因为在一个简单的阶段中会发生更多的步骤(如果存在则启动已停止的容器等)。
做一个简单的if的最佳方法是什么?
答案 0 :(得分:11)
不幸的是,你现在必须将其包裹在script
内。正如says here;
声明性管道可以使用Pipeline Steps reference中记录的所有可用步骤,其中包含完整的步骤列表,并添加了下面列出的步骤,这些步骤仅在声明性管道中受支持。
如果您查看步骤参考,它只会列出所有有助于管道步骤的插件。而据我所知,没有步骤支持,否则,否则。所以答案是,不,现在它是不可能的,但是,将它作为一个步骤实现并添加到插件应该相当简单。
答案 1 :(得分:7)
这应该有效
pipeline {
stages {
stage ('Main Stage') {
steps {
script {
if (true) {
stage ('Stage 1') {
sh 'echo Stage 1'
}
}
if (false) {
stage ('Stage 2') {
sh 'echo Stage 2'
}
}
}
}
}
}
}
答案 2 :(得分:2)
使用Conditional BuildStep插件,您可以添加when {}
步骤来处理条件。
以下内容应该有效,除非在此上下文中使用isEmpty()检查语法问题。
stage ('Deploy to Docker') {
steps {
parallel (
"instance1" : {
environment {
containerId = sh(script: "docker ps --quiet --filter name=${fullDockerImageName}", returnStdout: true).trim()
}
when {
expression {
return containerId.isEmpty()
}
}
step {
docker.image('some/image').run("--name ${fullDockerImageName}")
}
}
)
}
}
相关博文is here.
编辑:抱歉,实际的snytax似乎更接近于此,无法访问您需要的条件:
stage ('Deploy to Docker') {
when {
expression {
return containerId.isEmpty()
}
}
steps {
parallel (
"instance1" : {
environment {
containerId = sh(script: "docker ps --quiet --filter name=${fullDockerImageName}", returnStdout: true).trim()
}
step {
docker.image('some/image').run("--name ${fullDockerImageName}")
}
}
)
}
}
答案 3 :(得分:1)
我认为这是在Jenkins声明式管道中使用if / else或控制逻辑的最正确/最佳实践方法。
https://jenkins.io/doc/book/pipeline/syntax/#when
@IronSean答案,似乎不再需要该插件。