Jenkins 流水线,带有选择参数的条件“何时”表达式

时间:2021-04-22 13:28:43

标签: jenkins groovy jenkins-pipeline jenkins-groovy

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

取决于输入的选择,我希望脚本执行步骤 'Hello' 或 'Bye' 但它会跳过这两个步骤。我主要针对此 Jenkins pipeline conditional stage using "When" for choice parameters,但仍然无法弄清楚。

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

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

1 个答案:

答案 0 :(得分:0)

来自docs

<块引用>

作为输入提交的一部分提供的任何参数都将在该阶段的其余部分的环境中可用。

这意味着您的参数 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'    
            }
        }
    }
}

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