簡體   English   中英

聲明性管道上的 Jenkins 輸入

[英]Jenkins input on declarative pipeline

請問如果我可以獲得用戶輸入並根據用戶選擇的內容運行腳本是否可行? 邏輯應該是

如果用戶選擇繼續然后運行腳本(在我的情況下提升或藍/綠部署)如果用戶選擇中止那么不要終止 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 作業控制台 output 上無法單擊繼續/中止,這是一個錯誤嗎? 我指的是下圖

在此處輸入圖像描述

我能夠添加 nandilov 的建議,但似乎邏輯仍然不適用,請告知此處遺漏的內容

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"
            """
        }
    }

  }

}

從管道視圖中,它在選擇“流產”或“繼續”時從未觸發最后兩個階段之一

在此處輸入圖像描述

這些是選擇 Abort 或 Proceed 時的日志

中止

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

如果您想中止工作並做某事,可以嘗試/抓住它:

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"
            """
        }
    }

  }

試試這個,您需要單擊繼續,然后在“部署”和“回滾”之間進行選擇。 我們將結果存儲在環境變量中,您可以將其用作下一階段的條件

    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 {
            ...
        }
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM