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

Jas*_*oel 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}")
                        }
                    }
                }
            )
        }
   }
Run Code Online (Sandbox Code Playgroud)

这会导致以下异常:

WorkflowScript: 201: Expected a step @ line 201, column 29.
                           if (containerId.isEmpty()) {
Run Code Online (Sandbox Code Playgroud)

既然我不允许if(..)在一个steps {}块内做一个简单的内容,任何关于如何做到这一点的想法?

when {}因为在一个简单的阶段中发生了更多的步骤(如果它存在则启动已停止的容器等),这似乎没有意义,因为在一个简单的阶段中会发生更多的步骤.

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

Jon*_*n S 15

不幸的是,你现在必须把它包装成一个script.正如它在这里所说 ;

声明性管道可以使用" 管道步骤"参考中记录的所有可用步骤,其中包含完整的步骤列表,并添加下面列出的步骤,这些步骤仅在声明性管道中受支持.

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

  • 您应该添加一个相当简单的示例才能真正回答该问题。问题是如何执行 if 子句,而不是 if it is possible 。 (3认同)
  • 如何添加无法完成的事情的示例?话虽如此,这个答案已经有两年多了,现在情况可能已经改变了...... (2认同)

小智 12

这应该工作

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'
                        }
                    }
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 虽然这会起作用,但它仍将作为“脚本化”管道。原始问题要求转换为声明性管道。 (4认同)
  • 这只是非声明性的。 (4认同)

Ruw*_*uwd 8

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

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

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

  • 请不要只引用 URL(将来可能会消失),还要提供链接的实质内容或答案中的示例。 (5认同)