Пропустить стадию в конвейере Дженкинса без привлечения агента?

Мы используем 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/

Другие вопросы по тегам