声明性管道上的Jenkins输入

声明性管道上的Jenkins输入,jenkins,jenkins-pipeline,jenkins-declarative-pipeline,Jenkins,Jenkins Pipeline,Jenkins Declarative Pipeline,我可以问一下,如果我能够获得用户输入并根据用户选择的内容运行脚本,是否可以做到这一点?逻辑是什么 如果用户选择继续,则在我的情况下运行脚本升级或蓝色/绿色部署 如果用户选择Abort,则不终止jenkins作业,请在我的案例rollback中运行脚本 这是我正在使用的脚本,但是我不知道如何在验证阶段后应用 pipeline { agent any stages { stage('Deploy') { steps { sh """#!/bin/ba

我可以问一下,如果我能够获得用户输入并根据用户选择的内容运行脚本,是否可以做到这一点?逻辑是什么

如果用户选择继续,则在我的情况下运行脚本升级或蓝色/绿色部署 如果用户选择Abort,则不终止jenkins作业,请在我的案例rollback中运行脚本

这是我正在使用的脚本,但是我不知道如何在验证阶段后应用

  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作业控制台输出上不能单击继续/中止,这是一个bug吗?我指的是下图

我可以补充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"
            """
        }
    }

  }

}
从管道视图来看,在选择中止或继续时,它从未触发最后两个阶段中的任何一个

这些是选择中止或继续时的日志

流产

进行


如果要中止作业并执行某些操作,可以尝试/捕获它:

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

  }

如果要中止作业并执行某些操作,可以尝试/捕获它:

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

尝试这样做,您需要单击“继续”,然后在部署和回滚之间进行选择。我们将把结果存储在一个环境变量中,您可以在下一阶段将其用作条件

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

嗨,nandilov,从我提供的屏幕截图可以看出,用户只需单击继续或中止。我想知道这个逻辑是否可行=如果用户选择继续,则运行部署脚本;如果用户选择中止,则运行回滚脚本。部署脚本和回滚脚本是我的示例。相应地,我的错误,在我刚读到您想要从输入中获取值之前。嗨,nandilov,我想我就快到了,但是当我尝试选择中止或继续时,我仍然是预期要运行的脚本。我在上面添加了您的脚本块,您可以查看我在上面更新的消息。我仍在调整管道脚本,并试图使其正常工作。谷歌ing研究:-嗨,拉戈特,检查我的最新编辑。在第一次读取用户输入后,我修改变量名时,变量名有一个输入错误。因为你不需要,我想我最近的编辑会对你有用。让我知道。谢谢你,南迪洛夫。我一直在找这个。嗨,nandilov,从我提供的屏幕截图中可以看出,用户只需单击继续或中止。我想知道这个逻辑是否可行=如果用户选择继续,则运行部署脚本;如果用户选择中止,则运行回滚脚本。部署脚本和回滚脚本是我的示例。相应地,我的错误,在我刚读到您想要从输入中获取值之前。嗨,nandilov,我想我就快到了,但是当我尝试选择中止或继续时,我仍然是预期要运行的脚本。我在上面添加了您的脚本块,您可以查看我在上面更新的消息。我仍在调整管道脚本,并试图使其正常工作。谷歌ing研究:-嗨,拉戈特,检查我的最新编辑。在第一次读取用户输入后,我修改变量名时,变量名有一个输入错误。因为你不需要,我想我最近的编辑会对你有用。让我知道。谢谢你,南迪洛夫。我在找这个嗨robertobatts我试过的时候你的代码起作用了。但是,当我单击Abort(中止)时,管道也中止了,我在想这个逻辑是否可行=如果用户选择继续,则运行部署脚本;如果用户选择Abort(中止)则运行回滚脚本。部署脚本和回滚脚本只是我的示例Hi robertobatts,我尝试时您的代码工作正常。但是,当我单击Abort(中止)时,管道也中止了,我在想这个逻辑是否可行=如果用户选择继续,则运行部署脚本;如果用户选择Abort(中止)则运行回滚脚本。部署脚本和回滚脚本只是我的示例