Условный шаг / стадия в конвейере Jenkins

90

Как запустить этап / этап сборки только при создании конкретной ветки?

Например, запускайте шаг развертывания, только если ветка вызывается deployment, а все остальное оставьте без изменений.

Девонте
источник

Ответы:

181

То же самое в синтаксисе декларативного конвейера, ниже несколько примеров:

stage('master-branch-stuff'){
  agent any
  when{
    branch 'master'
  }
  steps {
    echo 'run this stage - ony if the branch = master branch'
  }
}

stage('feature-branch-stuff') {
    agent label:'test-node'
    when { branch "feature/*" }
    steps {
        echo 'run this stage - only if the branch name started with feature/'
    }
}

stage('expression-branch') {
    agent label:'some-node'
    when {
    expression {
        return env.BRANCH_NAME != 'master';
        }
    }
    steps {
        echo 'run this stage - when branch is not equal to master'
    }
}

stage('env-specific-stuff') {
    agent label:'test-node'
    when { 
      environment name: 'NAME', value: 'this' 
    }
    steps {
        echo 'run this stage - only if the env name and value matches'
    }
}

Появятся более эффективные способы - https://issues.jenkins-ci.org/browse/JENKINS-41187
Также посмотрите - https://jenkins.io/doc/book/pipeline/syntax/#when


Директива beforeAgent trueможет быть установлена ​​таким образом, чтобы агент не запускал условное выражение, если условное выражение не требует состояния git для решения, запускать ли:

when { beforeAgent true; expression { return isStageConfigured(config) } }

Выпустить публикацию и документы


ОБНОВЛЕНИЕ
Новый пункт WHEN
REF: https://jenkins.io/blog/2018/04/09/whats-in-declarative

equals - сравнивает два значения - строки, переменные, числа, логические значения - и возвращает истину, если они равны. Честно говоря, я не уверен, как мы пропустили добавление этого раньше! Вы можете выполнять сравнения "не равно", используя комбинацию not {equals ...}.

changeRequest - в простейшей форме это вернет истину, если этот конвейер создает запрос на изменение, такой как запрос на извлечение GitHub. Вы также можете выполнить более подробную проверку запроса на изменение, что позволит вам спросить: «Это запрос на изменение основной ветви?» и многое другое.

buildingTag - простое условие, которое просто проверяет, работает ли конвейер с тегом в SCM, а не с веткой или конкретной ссылкой на фиксацию.

tag - более подробный эквивалент buildingTag, позволяющий сверяться с самим именем тега.

Чандан Наяк
источник
1
я могу использовать это для действий пост-сборки?
Дуг
1
Я обнаружил, что Дженкинс запускает указанный агент, даже если when{}условие оценивается как ложное. :(
Trejkaz 06
1
@Trejkaz теперь можно использовать beforeAgent true чтобы этого избежать
Ник Джонс
1
@NickJones действительно, beforeAgentтеперь это обходной путь.
Trejkaz
45

Просто используйте ifи env.BRANCH_NAME, например:

    if (env.BRANCH_NAME == "deployment") {                                          
        ... do some build ...
    } else {                                   
        ... do something else ...
    }                                                                       
Кшиштоф Красонь
источник
4
если должно быть до этапа или после?
Jet
5
Перед этапом этапы могут быть внутри, если ответвления
Кшиштоф Красонь
не думаю, что размещение на самом деле имеет значение
omu_negru
9
Я не могу получить эту работу с декларативным конвейером. Это работает с декларативными конвейерами? WorkflowScript: 9: ожидаемый этап @ линия 9, колонка 9. если (env.BRANCH_NAME == "развертывания") {WorkflowScript: 8: Нет ЭТАПАХ указано @ строка 8, столбец 5. Этапы {
pitchblack408

4
это работает только в конвейерах со сценариями. для декларативных конвейеров вы должны использовать скрипт {} внутри шага.
Педро Энрике
1

Согласно другим ответам я добавляю сценарий параллельных этапов:

pipeline {
    agent any
    stages {
        stage('some parallel stage') {
            parallel {
                stage('parallel stage 1') {
                    when {
                      expression { ENV == "something" }
                    }
                    steps {
                        echo 'something'
                    }
                }
                stage('parallel stage 2') {
                    steps {
                        echo 'something'
                    }
                }
            }
        }
    }
}
Якир Гилади Эдри
источник