33

我正在尝试将我的脚本化管道转换为声明性管道。想知道如何在一个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 {}块内做一个简单的事情,关于如何做到这一点的任何想法?

用 a 把它变成一个完整的阶段似乎没有意义when {},因为在一个简单的阶段会发生更多的步骤(如果存在,则启动一个停止的容器等)。

做一个简单的 if 的最佳方法是什么?

4

4 回答 4

29

这应该工作

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'
                        }
                    }
                }
            }
        }
    }
}
于 2017-10-16T13:22:31.890 回答
22

不幸的是,您现在必须将其包装在script, 中。正如这里所说

声明式管道可以使用管道步骤参考中记录的所有可用步骤,其中包含完整的步骤列表,以及下面列出的仅在声明式管道中支持的步骤。

如果您查看步骤参考,它只是列出了所有有助于管道步骤的插件。据我所知,没有步骤支持 if, then, else。所以答案是,不,现在不可能,但是,将其作为一个步骤实现并添加到插件中应该相当简单。

于 2017-02-16T18:04:40.857 回答
8

我认为这是在 Jenkins 声明式管道中使用 if/else 或控制逻辑的最正确/最佳实践方式。

https://jenkins.io/doc/book/pipeline/syntax/#when

@IronSean 回答,您似乎不再需要那个插件了。

于 2019-01-04T17:25:00.963 回答
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}")
                }
            }
        )
    }
}

相关的博客文章在这里。

编辑:对不起,实际的 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}")
                }
            }
        )
    }
}
于 2018-01-08T14:59:03.530 回答