Как сделать простые операторы if внутри декларативного конвейера в Jenkins

Я пытаюсь преобразовать свой скриптовый конвейер в декларативный конвейер. Хотите знать, как сделать простой оператор if внутри блока steps {}.

    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 {}, поскольку на простом этапе происходит больше шагов (запуск остановленного контейнера, если он существует, и т. д.).

Какой лучший способ сделать простое если?


person Jasper Roel    schedule 16.02.2017    source источник
comment
@jon-s Это очень похоже на мой другой вопрос (stackoverflow.com/questions/42277936/), но я хотел задокументировать оба чрезвычайно распространенных сценария (оператор if и оператор var-assignment), так что все равно опубликуйте его. Может быть, у вас есть другое представление об этом?   -  person Jasper Roel    schedule 16.02.2017


Ответы (4)


Это должно работать

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'
                        }
                    }
                }
            }
        }
    }
}
person Reuben Abela    schedule 16.10.2017
comment
Хотя это будет работать, он останется сценарным конвейером. Исходный вопрос требует преобразования в декларативный конвейер. - person Arnab; 13.02.2019
comment
Это просто НЕ ДЕКЛРАТИВНО. - person Raúl Salinas-Monteagudo; 01.07.2019

К сожалению, на данный момент вы должны обернуть его в script. Как сказано здесь;

Декларативные конвейеры могут использовать все доступные шаги, описанные в справочнике по шагам конвейера, который содержит полный список шагов с добавлением перечисленных ниже шагов, которые поддерживаются только в декларативном конвейере.

И если вы посмотрите на справку по шагам, там просто перечислены все плагины, которые вносят свой вклад в шаги пайплайна. И, насколько я вижу, нет никакой опорной ступени, если, то, иначе. Итак, ответ: нет, сейчас это невозможно, но должно быть довольно просто реализовать это как шаг и добавить в плагин.

person Jon S    schedule 16.02.2017
comment
Вы должны добавить довольно простой пример, чтобы на самом деле ответить на вопрос. Это было то, как выполнить условия if not, если это вообще возможно. - person Dominik; 20.08.2019
comment
Как добавить пример того, что нельзя сделать? С учетом сказанного, этим ответам более двух лет, возможно, сейчас все изменилось... - person Jon S; 20.08.2019
comment
Я просто комментирую это, потому что это лучший ответ, но он просто говорит что-то вроде того, что это должно быть довольно просто реализовать как шаг, но на самом деле не обеспечивает этот простой результат. Вы можете просто взглянуть на ответ Рубена Абеласа для примера того, как выполнять операторы if в декларативном конвейере. Кроме того, как вы сказали, этому ответу два года, поэтому я бы рекомендовал использовать директиву when - person Dominik; 20.08.2019
comment
Ага, я понимаю, говоря, что должно быть довольно просто реализовать это как шаг и добавить в плагин, я имею в виду, что добавить эту функциональность в Jenkins в форме плагина было бы довольно просто, однако, как любой, кто разработал плагины, это никогда oneliner, вероятно, ~ 100 строк Java, файл POM примерно такого же размера, а затем несколько файлов groovy или jelly поверх этого, что выходит далеко за рамки ответа на StackOverflow. Насчет того, когда, автор прямо заявляет, что использовать нет смысла и нельзя (и ищет другие варианты). - person Jon S; 21.08.2019


Используя плагин 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}")
                }
            }
        )
    }
}

Соответствующая запись в блоге здесь.

EDIT: извините, фактический 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}")
                }
            }
        )
    }
}
person IronSean    schedule 08.01.2018