Вклад Дженкинса в декларативный конвейер - PullRequest
1 голос
/ 23 апреля 2020

Могу ли я спросить, выполнимо ли это, могу ли я получить пользовательский ввод и запустить скрипт на основе того, что было выбрано пользователем? логика c должна быть

ЕСЛИ пользователь выберет Продолжить ТО запустить скрипт (в моем случае повышение или синее / зеленое развертывание) ЕСЛИ пользователь выберет Прервать ТОГДА не прекращайте работу jenkins, запустите скрипт (в моем случае откат)

Я использую этот скрипт, однако я не знаю, как его применить после этапа проверки

  pipeline {
  agent any

  stages {
    stage('Deploy') {
      steps {
        sh """#!/bin/bash +x
          echo "performing sts assume role"
          //SCRIPT-HERE//        
          echo "performing ansible deploy"
          //SCRIPT-HERE//  
        """
      }
    }
    stage('validate') {
        steps {

            timeout(30) {
                script {
                    input(message: 'Please validate, this job will automatically ABORTED after 30 minutes even if no user input provided', ok: 'Proceed')
                }
            }
        }
    }
  }

}

Еще одна проблема, которую я вижу, заключается в том, что, хотя этот конвейерный скрипт запущен, «Приступ / Прервать» не активируются при выводе на консоль задания jenkins, это ошибка? Я имею в виду изображение, показанное ниже

enter image description here

Мне удалось добавить предложение Нандилова, однако кажется, что логика c все еще не применяется Посоветуйте, пожалуйста, то, что здесь пропущено

pipeline {
  agent any

  stages {
    stage('Deploy') {
      steps {
        sh """#!/bin/bash +x
          echo "performing sts assume role"

          echo "performing ansible deploy"

        """
      }
    }
    stage('validate') {
        steps {
          script {
            env.flagError = "false"
              try {
              input(message: 'Please validate, this job will automatically ABORTED after 30 minutes even if no user input provided', ok: 'Proceed')

              }catch(e){
                println "input aborted or timeout expired, will try to rollback."
                env.flagError = "true"        
              }
          }
        }
    }

    stage("If user selects Proceed"){
        when{
            expression { env.inputValue == "value1" }
        }
        steps{
            sh """#!/bin/bash +x
              echo "User selected proceed"
            """
        }
    }

    stage("rollback if flag error true"){
        when{
            expression { env.inputValue == "value2" }
        }
        steps{
            sh """#!/bin/bash +x
              echo "User selected Abort"
            """
        }
    }

  }

}

. С точки зрения конвейера, он никогда не вызывал один из двух последних этапов при выборе «Прервать» или «Продолжить»

enter image description here

Это журналы при выборе Прервать или Продолжить

ABORT

Running in Durability level: MAX_SURVIVABILITY
[Pipeline] Start of Pipeline
[Pipeline] node
Running on Jenkins in /var/lib/jenkins/workspace/test-job-lagot
[Pipeline] {
[Pipeline] stage
[Pipeline] { (Deploy)
[Pipeline] sh
performing sts assume role
performing ansible deploy
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (validate)
[Pipeline] script
[Pipeline] {
[Pipeline] input
Please validate, this job will automatically ABORTED after 30 minutes even if no user input provided
Proceed or Abort
[Pipeline] echo
input aborted or timeout expired, will try to rollback.
[Pipeline] }
[Pipeline] // script
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (If user selects Proceed)
Stage "If user selects Proceed" skipped due to when conditional
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (rollback if flag error true)
Stage "rollback if flag error true" skipped due to when conditional
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
Finished: SUCCESS

ПРОЦЕДУРА

Started by user lagot
Running in Durability level: MAX_SURVIVABILITY
[Pipeline] Start of Pipeline
[Pipeline] node
Running on Jenkins in /var/lib/jenkins/workspace/test-job-lagot
[Pipeline] {
[Pipeline] stage
[Pipeline] { (Deploy)
[Pipeline] sh
performing sts assume role
performing ansible deploy
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (validate)
[Pipeline] script
[Pipeline] {
[Pipeline] input
Please validate, this job will automatically ABORTED after 30 minutes even if no user input provided
Proceed or Abort
Approved by lagot
[Pipeline] }
[Pipeline] // script
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (If user selects Proceed)
Stage "If user selects Proceed" skipped due to when conditional
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (rollback if flag error true)
Stage "rollback if flag error true" skipped due to when conditional
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
Finished: SUCCESS

Ответы [ 2 ]

1 голос
/ 23 апреля 2020

Если вы хотите прервать работу и сделать что-то, вы можете попробовать / поймать ее:

try{
    input(message: 'Please validate, this job will automatically ABORTED after 30 minutes even if no user input provided', ok: 'Proceed')
}catch(e){
    println "input aborted or timeout expired, will try to rollback."
    // execute rollback
}

Вы также можете сделать это на другом этапе:

pipeline {
  agent any

  stages {
    stage('Deploy') {
      steps {
        sh """#!/bin/bash +x
          echo "performing sts assume role"

          echo "performing ansible deploy"

        """
      }
    }
    stage('validate') {
        steps {
          script {
            env.flagError = "false"
              try {
              input(message: 'Please validate, this job will automatically ABORTED after 30 minutes even if no user input provided', ok: 'Proceed')

              }catch(e){
                println "input aborted or timeout expired, will try to rollback."
                env.flagError = "true"        
              }
          }
        }
    }

    stage("If user selects Proceed"){
        when{
            expression { env.flagError == "false" }
        }
        steps{
            sh """#!/bin/bash +x
              echo "User selected proceed"
            """
        }
    }

    stage("rollback if flag error true"){
        when{
            expression { env.flagError == "true" }
        }
        steps{
            sh """#!/bin/bash +x
              echo "User selected Abort"
            """
        }
    }

  }
0 голосов
/ 23 апреля 2020

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

    stage('validate') {
        steps {
            timeout(30) {
                script {
                    CHOICES = ["deploy", "rollback"];    
                        env.yourChoice = input  message: 'Please validate, this job will automatically ABORTED after 30 minutes even if no user input provided', ok : 'Proceed',id :'choice_id',
                                        parameters: [choice(choices: CHOICES, description: 'Do you want to deploy or to rollback?', name: 'CHOICE'),
                                            string(defaultValue: 'rollback', description: '', name: 'rollback value')]
                        } 

                }
            }
        }
    }
    stage('Deploy') {
        when {
            expression { env.yourChoice == 'deploy' }
        }
        steps {
            ...
        }
    }
    stage('Rollback') {
        when {
            expression { env.yourChoice == 'rollback' }
        }
        steps {
            ...
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...