Jenkinsfile-выполнение условного этапа в синтаксисе конвейера скриптов


Мы используем синтаксисконвейера сценариев для нашего Jenkinsfile, который имеет много этапов, определенных для построения и развертывания нашего кода. У нас есть пример использования, где я хочу запустить все свои этапы, если я делаю полная сборка но запускайте только один конкретный этап, если мне нужно выполнить маршрутизацию AWS. Я знаю, что могу использовать if(<expression>), чтобы пропустить этап или запустить этап. Проблема в том, что я не хочу применять это условие if к каждому этапу в моей Jenkinsfile.

В новом декларативном Синтаксис конвейера это легко возможно с помощью опции stage..when. У нас есть много пользовательских Groovy вспомогательных функций, используемых в нашей инфраструктуре, поэтому на данный момент для меня невозможно переключиться с синтаксиса конвейера сценариев на новый синтаксис декларативного конвейера. То, что я в конечном итоге сделал на моем существующем Jenkinsfile, что-то вроде этого..

Оригинальный Файл Дженкинса

  stage('Checkout Code') {}
  stage('Build') {}
  parallel(
    stage('Sonar Analysis') {}
    stage('CLM Analysis') {}
    stage('Security Analysis') {}
  )
  stage('Build Docker Image') {}
  ...
  ...
  stage('QA Deploy') {}
  stage('QA Routing') {}
  ...
  ...
  stage('Prod Deploy') {}
  stage('Prod Routing') {}

Изменено на

  if (fullDeploy){
    stage('Full Build') {
        stage('Checkout Code') {}
        stage('Build') {}
        parallel(
          stage('Sonar Analysis') {}
          stage('CLM Analysis') {}
          stage('Security Analysis') {}
        )
        stage('Build Docker Image') {}
        ...
        ...
        stage('QA Deploy') {}
        stage('QA Routing') {}
        ...
        ...
        stage('Prod Deploy') {}
        stage('Prod Routing') {}          
    }
  }

  if (routeOnly){
    stage('Prod Routing') {}    
  } 

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

Есть ли у кого-нибудь лучший способ, которым я могу включить это?
3 2

3 ответа:

Я не использую скриптовые конвейеры, но я уверен, что именно так вы это и сделаете (заключив условные этапы в if).

Если вы хотите, чтобы он действовал немного более декларативно, вы можете поместить if операторы внутри каждого этапа вместо этого. Таким образом, этапы все еще будут визуализированы. Это может быть или не быть желательным, когда они на самом деле ничего не делали.

Я думаю, что переключение на декларативный будет единственным способом заставить пропущенные этапы отображаться по-разному в синем цвете ocean UI (они выглядят по-другому, когда их пропускают из-за предложения when), но на самом деле у вас есть самый маленький код с вашим текущим решением. Мне это не кажется банальным, но такие вещи могут быть субъективными. :)

Мне также не нравилась идея наличия избыточного блока if {} внутри моей стадии {} . Я решил эту проблему, переписав сцену следующим образом

def stage(name, execute, block) {
    return stage(name, execute ? block : {echo "skipped stage $name"})
}

Теперь вы можете отключить этап следующим образом

stage('Full Build', false) { 
    ...
}

Согласно комментариям к JENKINS-47286, это не похоже на добавление поддержки when в скриптовый конвейер. В качестве потенциального обходного пути существует общая библиотека, реализующая оператор when для скриптовых конвейеров: https://github.com/comquent/imperative-when