Пропустить стадию в конвейере Дженкинса без привлечения агента?
Мы используем jenkins pipe dsl для наших должностных инструкций. Теперь у нас есть что-то подобное:
pipeline {
agent none
options {
timestamps()
}
environment {
//SOME ENV VARS
}
stages {
// more stages
stage('stage1'){
when {
expression { env.BRANCH_NAME == 'master' }
}
agent { label 'slave1' }
steps{
//doing stuff
}
}
}
Этап процесса сборки, который должен выполняться только тогда, когда создается основная ветка, вы можете подумать о задании развертывания или о чем-то в этом направлении. Проблема в том, что наши ресурсы агентов с этим конкретным ярлыком ограничены. Когда мы создаем другие ветви, задание все еще вызывает агента slave1 и затем пропускает этап после проверки того, что ветвь не является главной. Это плохо, потому что, когда все агенты slave1 работают над заданиями главного филиала, другие задания должны будут ждать, пока агент slave1 станет доступным, просто чтобы проверить, нужно ли ему выполнять этот этап.
Есть ли способ с DSL конвейера jenkins пропустить этот этап, не дожидаясь, пока агент slave1 определит ветвь?
2 ответа
Я нашел решение, которое сработало для меня. Хотя я не совсем уверен, почему. Введение параллельного раздела и использование узлов, однако, устранило проблему, и этапы пропускаются без предварительного вызова агента. Смотрите модифицированный конвейер:
pipeline {
agent none
options {
timestamps()
}
environment {
//SOME ENV VARS
}
stages {
// more stages
stage('stage1'){
when { branch 'master' }
steps{
parallel(
'Job1': {
node( 'slave1' ){
//doing stuff
}
}
)
}
}
}
Подход, представленный в ответе выше, работает, потому что вы не объявляете агента на этапе ('stage1'), вместо этого вы явно создаете узел на этапах, и поэтому агент не создается при проверке условия.
Этот подход будет работать, но он добавляет ненужную сложность для вас Jenkinsfile. Правильный способ достичь этого будет:
pipeline {
agent none
stages {
// more stages
stage('stage1'){
when {
beforeAgent true
branch 'master'
}
agent { label 'slave1' }
steps {
// do stuff
}
}
}
}
Проверьте синтаксис и доступные параметры, доступные в теге when, здесь: https://jenkins.io/doc/book/pipeline/syntax/