Jenkins 管道脚本中需要基于条件的输入步骤

Need Condition based Input Step in Jenkins pipeline script

我在 jenkins 管道脚本中有三个阶段,即 (1) 预检查,(2) build-prod & (3) build-dr。

我在"build-dr"

阶段说明了手动触发的输入步骤

我的管道是基于条件的,即基于预检查阶段的用户参数。

条件1:"precheck" -> "build-prod"然后"build-dr"被执行。

条件 2:"precheck" 然后执行 "build-dr"(跳过 build-prod)。

我需要条件 1 中的输入步骤并且工作正常,但是不应为条件 2 执行输入步骤,即没有带有输入步骤的弹出消息。请让我知道我们如何在第 3 阶段 build-dr 中为输入步骤设置条件,以便在 pipleline 跳过 (2) build-prod 时它不执行输入步骤。

Jenkins 管道脚本代码:

  agent any         
  stages {
      stage ("Pre-Check Parameters") {      
          steps {

              echo "Pre-Check called in pipeline"
          }
        }
              stage ("build-prod") {           
          when {
              expression { params.region == 'prod_only' || params.region == 'prod_and_dr' }
          }
          steps { 
              build 'job4'
          }

        }
          stage ("build-dr") {           
                  input{
                  message "Proceed or Abort"
                  submitter "user1,admin"
                  parameters {
                  string(name:'username', defaultValue: 'user1', description: 'Username of the user pressing Ok')
                  }
              } 

          when {
              expression { params.region == 'dr_only' || params.region == 'prod_and_dr'}
          }
          steps { 
              build 'job5'
          }    
      }
  }
}

请多多指教。

您目前正在使用 here but this prevents you to make this input conditional. You actually have to use the Input Step 所述的输入指令。不是将输入字段直接添加到 stage 指令下方,而是将其移动到舞台的 steps 块中,并在其周围添加一个 script 块以使用 if/else 条件。

并注意删除输入步骤周围的大括号并在每个 属性 后添加一个冒号。

您现在要做的是根据您的要求调整此行: if(Condition1 == true) 取决于您的参数值。

stage("build-dr") {
    when {
        expression { params.region == 'dr_only' || params.region == 'prod_and_dr'}
    }
    steps {
        script {
            if(Condition1 == true) {
                input message: "Proceed or Abort", submitter: "user1,admin",
                parameters: [string(name:'username', defaultValue: 'user1', description: 'Username of the user pressing Ok')] 
            }
        }
        build 'job5'
    }
}

或者,如果要执行第二阶段,您可以使用环境声明块来声明变量并为其分配特定值。但是任何环境值将始终被键入为 String 这对于 if/else 条件很重要。为变量赋值的一个好方法是在第二阶段添加一个 post 部分。

pipeline {
    agent any
    environment {
        STAGE_2_EXECUTED = "0"
    }
    stages{
        stage("....") {
            steps {
                ....
            }
        }
        stage("Second stage") {
            when {
                expression { /* Your condition */ }
            }
            steps {
                ....
            }
            post {
                always {
                    script {
                        STAGE_2_EXECUTED = "1";
                    }
                }
            }
        }
        stage("Third Stage") {
            steps {
                script {
                    if(STAGE_2_EXECUTED == "1") {
                        input message: "Proceed or Abort", submitter: "user1,admin",
                        parameters: [string(name:'username', defaultValue: 'user1', description: 'Username of the user pressing Ok')] 
                    }
                }
                build 'job5'
            }
        }
    }
}