相关疑难解决方法(0)

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

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

jenkins jenkins-pipeline jenkinsfile

24
推荐指数
3
解决办法
4万
查看次数

在执行某些步骤(例如 when 指令)后,如何跳过 Jenkins 阶段?

如何在执行过程中跳过 Jenkins 阶段?一旦确定了跳过条件,这就像when在某些步骤之后或步骤中间使用一样。我知道我可以进一步分解阶段/步骤并使用全局变量来实现此目的,但似乎应该有一种更简单的方法。

该步骤应该显示为已跳过,而不是失败或不稳定。

stage('Builds') {
    failFast true
    parallel {
        stage('FlagA') {
            steps {
                BuildWithFlag("FlagA")
            }
        }
        stage('FlagB') {
            steps {
                BuildWithFlag("FlagB")
            }
        }
        ...

void BuildWithFlag(String flag) {
    skipCondition = false
    <setup-steps>
    if(skipCondition) {
        currentStage.result = '' // Doesn't work
        return
    }
    <build-steps>
}
Run Code Online (Sandbox Code Playgroud)

相关:
Jenkins 管道中的条件步骤/阶段
如何在声明性管道中执行 when..else
Jenkins 管道阶段跳过基于管道中定义的常规变量

所有这些都when在阶段开始时使用。我需要在一个步骤中模仿它。

jenkins jenkins-groovy jenkins-pipeline

3
推荐指数
1
解决办法
4238
查看次数