Контрольно-пропускной пункт в декларативном трубопроводе Jenkins

Я смотрю на документацию Cloudbees, которая гласит:

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

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

stage ('Promotion Checkpoint') {
    steps {
        checkpoint 'Ready for Manual intervention'
        timeout(time: 60, unit: 'SECONDS') {
            input message: 'Do you want to proceed?'
        }
    }
}

Насколько я понимаю, этап в Декларативном конвейере похож на узел в Скриптовом конвейере. Я не могу заставить контрольно-пропускной пункт работать за пределами стадии или шага, что, по-видимому, является моей интерпретацией предложения от Cloudbees. Может ли кто-нибудь помочь с правильным использованием вне контрольной точки?

1 ответ

Решение

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

"Нормальный" декларативный конвейер имеет агента, определенного вверху

pipeline {
  agent any
  stages {
    stage("Build") {
      echo 'Build' 
    }
  }
}

Но теперь все метки этапа будут использовать один и тот же агент и рабочее пространство. Это облегчает написание "стандартных" конвейеров, но делает невозможным использование команды без какого-либо агента. Итак, используя checkpointили написание конвейера, не блокирующего исполнителя при использовании input становится невозможным.

Таким образом, предложенный правильный путь для декларативного конвейера заключается в использовании agent none на верхнем уровне конвейера и укажите agent any или же agent none в каждом stage,

В документации CloudBees есть два примера. Вы также можете найти такие обходные пути для input в документации Jenkins.

Таким образом, одно решение с использованием переключателя агента будет выглядеть так:

pipeline {
  agent none
  stages {
    stage("Build") {
      agent any
      steps {
        echo "Building"
      }
    }
    stage("Checkpoint") {
      agent none //running outside of any node or workspace
      steps {
        checkpoint 'Completed Build'
      }
    }
    stage("Deploy") {
      agent any
      steps {
        sh 'Deploying'
      }
    }
  }
} 

Существует также один с использованием node блок в декларативном конвейере.

pipeline {
  agent none
  stages{
    stage("Build"){
      // no agent defined will be solved with node
      steps{
        node('') { // this is equivalent to 'agent any'
          echo "Building"
        }
        checkpoint "Build Done"
      }
    }
    stage("Deploy") {
      agent any
      steps {
        echo 'Deploy'
      }
    }
  }
}
Другие вопросы по тегам