Есть ли способ вставить ручное утверждение в конвейеры Jenkins 2?

19

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

node {
   // Mark the code checkout 'stage'....
   stage 'Checkout'

   // Get some code from a GitHub repository
   git url: 'git@github.com:elifesciences/elife-bot.git'

   // Mark the code build 'stage'....
   stage 'Build'
   echo "Unit tests will run here"

   stage "Production"
   echo "Deploying to production environment"
}

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

Я искал возможные шаги для достижения этой цели в документах , но безрезультатно.

giorgiosironi
источник
Я не знаю Дженкинса, но разве нет способа разделить ваш план сборки на несколько этапов, и некоторые из этих этапов выполняются только по «ручному триггеру»?
Тиктак
Лучшее частичное решение на данный момент: inputшаг в конвейере, который останавливает и просит пользователя ввести (или прервать сборку). Тем не менее, сцена и индикатор состояния продолжают мигать, пока я хотел стабильного состояния (например, вы входите в него в пятницу днем ​​и решаете развернуть в понедельник.)
giorgiosironi

Ответы:

18

Ввод - это опция, которую вы ищете. Вот способ, которым я использую это. Важно сделать шаг за пределы узла, иначе jenkins будет держать агента в ожидании следующего шага. Имейте в виду, что второй узел может не использовать то же рабочее пространство, что и первый.

node {
    stage('build'){
        echo "building"
    }
}
stage('Deploy approval'){
    input "Deploy to prod?"
}
node {
    stage('deploy to prod'){
        echo "deploying"
    }
}
Стив Мишкевич
источник
Учитывая, что туда могут попасть несколько конвейеров, что случится со старыми, которые не будут развернуты в производство? Есть ли способ, чтобы помешать старшим остаться там (не знаю, будут ли они мигать) в неполном состоянии?
giorgiosironi
1
насколько я могу судить, он будет мигать вечно, пока вы не нажмете кнопку "abort", что довольно неприятно. Вы могли бы вероятно установить тайм-аут, чтобы предотвратить потерю некоторых из них. По истечении времени ожидания вы потеряете возможность его развертывания. jenkins.io/doc/pipeline/steps/workflow-basic-steps/…
Стив Мишкевич,
1
Я не понимаю, что вход можно настроить, чтобы не задерживать агента. Это делает способ ввода более полезным.
djhaskin987
Было бы неплохо иметь возможность повторно развернуть версию без сборки или развернуть предыдущую версию.
Техникаорг
1

В конце концов я создал отдельный test-projectи prod-projectконвейер, где в конце test-projectкод сливается в approvedветку.

Затем prod-projectконвейер можно настроить так, чтобы он не запускался для каждого нового коммита, чтобы его можно было развернуть по требованию.

giorgiosironi
источник
0

Кроме того, вы также можете добавить автоматический тайм-аут, как показано ниже

        stage('build') {
        steps {
            sh  """
                # Some commands
                """
            script {
              timeout(time: 10, unit: 'MINUTES') {
                input(id: "Deploy Gate", message: "Deploy ${params.project_name}?", ok: 'Deploy')
              }
            }
        }
    }

    stage('deploy') {
        when {
            branch 'master'
        }
        steps {
            sh  """
                # some commands
                """
        }
    }

Если вы посмотрите его, вы также можете связать входные данные jenkins с учетными данными пользователей, обращающихся к Jenkins, если вы хотите разрешить конкретным лицам отвечать на запросы - это также подтверждается тем фактом, что ваши элементы управления Git также достаточны.

Кру
источник
0

Это простой пример, но вы можете запустить его так, как вам нужно.

stage{
    script{
        input "Continue?"
        ...enter code here
        ...
    }
}
Орен
источник
0

Я сделал так, как показано ниже, прочитав этот документ https://jenkins.io/doc/book/pipeline/syntax/

pipeline {
environment {
    BRANCH_NAME = "${env.BRANCH_NAME}"
}
agent any
stages{
    stage('Build-Initiator-Info'){
            steps{
                sh 'echo "Send Info"'
            }
    }
    stage('Build') {
        steps{
             catchError {
                sh 'echo "This is build"'
            }
         }
         post {
            success {
                echo 'Compile Stage Successful . . .'
            }
            failure {
                echo 'Compile stage failed'
                error('Stopping early…')

             }
    }
   }
  stage ('Deploy To Prod'){
  input{
    message "Do you want to proceed for production deployment?"
  }
    steps {
                sh 'echo "Deploy into Prod"'

              }
        }
  }
   }
user5956891
источник