Jenkins流水线交互input步骤点击中止按钮返回null值问题
Jenkins流水线input步骤Abort时无法获取评论的解决方案
问题根因
Jenkins input 步骤的逻辑是:仅当审批人点击 Proceed 按钮时,才会正常返回配置的参数值,执行env.cmnt = input(...)的赋值操作;如果点击 Abort 按钮,input 步骤会直接抛出FlowInterruptedException中断流水线,赋值逻辑完全不会执行,所以aborted分支读取到的env.cmnt自然为null。
修复方案
用try-catch块包裹input步骤,捕获中断异常后从异常对象中提取用户输入的评论,赋值给环境变量后重新抛出异常即可,异常对象内置了审批人在弹窗中填写的所有参数,修改后的完整流水线代码如下:
pipeline { agent any stages { stage("Approval") { steps { script { try { // 正常通过时赋值 env.cmnt = input( message: 'Do you want to approve the pipeline?', parameters: [ text(defaultValue: '', description: 'Enter your comment...', name: 'COMMENT') ]) } catch (org.jenkinsci.plugins.workflow.steps.FlowInterruptedException e) { // 中止时从异常中提取参数赋值 env.cmnt = e.getParameters()?.COMMENT ?: '' // 重新抛出异常保证流水线进入aborted状态 throw e } } } } } post{ success{ emailext ( subject: "Job '${env.JOB_NAME} [${env.BUILD_NUMBER}]' is approved.", body: """<p>APPROVER COMMENT: '${env.cmnt}'</p>""", recipientProviders: [[$class: 'DevelopersRecipientProvider']] ) } aborted{ emailext ( subject: "Job '${env.JOB_NAME} [${env.BUILD_NUMBER}]' is aborted by approver", body: """<p>APPROVER COMMENT: '${env.cmnt}'</p>""", recipientProviders: [[$class: 'DevelopersRecipientProvider']] ) } } }
验证说明
修改后无论点击Proceed还是Abort,env.cmnt都会完成赋值,post阶段的两个分支都可以正常读取到审批人输入的评论内容,?: ''的空值处理逻辑可以避免审批人未填写评论时出现空值异常。
内容的提问来源于stack exchange,提问作者Prashant Kumar
相关产品推荐
相关产品推荐

