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

时间:2019-07-14 08:10:19

标签: jenkins input jenkins-pipeline jenkins-plugins pipeline

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

我已经在“ build-dr”阶段说明了手动触发的输入步骤

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

条件1:先执行“ precheck”->“ build-prod”,然后再执行“ build-dr”。

条件2:先执行“ precheck”,然后执行“ build-dr”(跳过build-prod)。

我需要Condition1中的输入步骤,并且工作正常,但是不应为Condition2执行输入步骤,即没有带输入步骤的弹出消息。请让我知道如何在阶段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'
          }    
      }
  }
}

请提出建议。

1 个答案:

答案 0 :(得分:1)

您当前正在使用here中所述的输入指令,但这会阻止您将此输入作为条件输入。实际上,您必须使用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'
            }
        }
    }
}