如何在Jenkins的声明性管道中执行简单的if语句

时间:2017-02-16 17:47:24

标签: jenkins jenkins-pipeline jenkinsfile

我正在尝试将我的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的最佳方法是什么?

4 个答案:

答案 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答案,似乎不再需要该插件。