具有条件 "When" 选择参数表达式的 Jenkins 管道

Jenkins Pipeline with conditional "When" expression of choice parameters

我是 Groovy 的新手。我无法弄清楚这里出了什么问题。

取决于输入的选择,我希望脚本执行步骤 'Hello' 或 'Bye',但它会跳过这两个步骤。我主要针对这个,但还是想不通。

如何正确使用这些选择参数?

pipeline {
   agent any
   stages {
      stage('Init') {
          steps('Log-in'){
            echo 'Log-in'
            }
        }
      stage('Manual Step') {
            input {
              message "Hello or Goodbye?"
              ok "Say!"
              parameters{choice(choices:['Hello','Bye'], description: 'Users Choice', name: 'CHOICE')}
            }
            steps('Input'){
                echo "choice: ${CHOICE}"
                echo "choice params.: " + params.CHOICE     //null          
                echo "choice env: " + env.CHOICE            //Hello 
            }
        }
      stage('Hello') {
        when{ expression {env.CHOICE == 'Hello'}}       
          steps('Execute'){
            echo 'Say Hello'
            } 
        }       
      stage('Bye') {
        when{ expression {env.CHOICE == 'Bye'}}
          steps('Execute'){
            echo 'Say Bye'    
              }
        }
      
    }
}

输出:

[Pipeline] {
[Pipeline] stage
[Pipeline] { (Init)
[Pipeline] echo
Log-in
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (Manual Step)
[Pipeline] input
Input requested
Approved by Admin
[Pipeline] withEnv
[Pipeline] {
[Pipeline] echo
choice: Hello
[Pipeline] echo
choice params.: null
[Pipeline] echo
choice env: Hello
[Pipeline] }
[Pipeline] // withEnv
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (Hello)
Stage "Hello" skipped due to when conditional
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (Bye)
Stage "Bye" skipped due to when conditional
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
Finished: SUCCESS

来自docs

Any parameters provided as part of the input submission will be available in the environment for the rest of the stage.

这意味着你的参数CHOICE在其他阶段不存在。如果你想要一个在所有阶段都可用的参数,你可以在阶段之外定义一个参数,即:

pipeline {
    agent any
   
    parameters {
        choice(choices:['Hello','Bye'], description: 'Users Choice', name: 'CHOICE')
    }
   
   stages {
        stage('Init') {
            steps('Log-in') {
                echo 'Log-in'
            }
        }
        
        stage('Manual Step') {
            steps('Input') {
                echo "choice: ${CHOICE}"
                echo "choice params.: " + params.CHOICE
                echo "choice env: " + env.CHOICE
            }
        }
        
        stage('Hello') {
            when { 
                expression { env.CHOICE == 'Hello' }
            }   
            
            steps('Execute')    {
                echo 'Say Hello'
            } 
        }       
        
        stage('Bye') {
            when {
                expression {env.CHOICE == 'Bye'}
            }
            
            steps('Execute'){
                echo 'Say Bye'    
            }
        }
    }
}

这将按预期运行。不同之处在于作业不会要求您输入,相反,您将在按构建之前提供所需的参数。