Jenkins流水线审批输入无法在后续阶段生效问题排查
问题原因
你遇到的问题根源在于:当input步骤同时指定了parameters和submitterParameter时,返回的结果是一个Map对象(包含ApprovalStatus和approverID两个键值对),而不是单纯的审批状态字符串。你现在直接用env.approvalStatus == 'Approved'做判断,本质是把整个Map和字符串比较,结果必然为false,导致后续阶段全部被跳过。
解决方案
有两种修复方式,推荐第一种,逻辑更清晰:
方式1:提取审批状态字符串到环境变量
修改Approval阶段的代码,先接收input返回的Map,再从中提取ApprovalStatus字段的值赋值给env.approvalStatus:
stage('Approval') { steps { script { emailext body: "Localities : ${Localities} \n name : ${name} \n Click this link to approve and run the executor job: ${env.BUILD_URL}console", subject: "Job Approval: Supplier Delete with build #${currentBuild.number}", to: 'user1' timeout(time: 1, unit: 'HOURS') { // 先接收完整的审批结果Map def approvalResult = input message: 'You want to approve this build? ', ok: 'Submit', parameters: [choice(choices: ['Approved', 'Rejected'], name: 'ApprovalStatus')], submitter: 'user1,user2', submitterParameter: 'approverID' // 提取审批状态赋值给环境变量 env.approvalStatus = approvalResult.ApprovalStatus // 可选:保存提交者ID到环境变量 env.approverID = approvalResult.approverID } } echo "Approval status: ${env.approvalStatus}" // 现在会打印:Approval status: Approved } }
这样后续Build和Deploy阶段的when判断就能正常生效。
方式2:直接在when判断中读取Map字段
如果不想修改Approval阶段的赋值逻辑,可以直接在when的表达式里从Map中读取ApprovalStatus字段:
stage('Build') { when { expression { env.approvalStatus?.ApprovalStatus == 'Approved' } } steps { sh 'echo "Building..."' } } stage('Deploy') { when { expression { env.approvalStatus?.ApprovalStatus == 'Approved' } } steps { sh 'echo "Deploying..."' } }
?.是Groovy的安全导航运算符,避免Map为null时抛出空指针异常。
修改后的完整流水线代码
agent any parameters { string(name: 'Localities', defaultValue: '', description: 'Enter Country Name') string(name: 'name', defaultValue: '', description: 'Enter Name') string(name: 'HOST', defaultValue: '', description: 'Enter Host Name') } stages { stage('Approval') { steps { script { emailext body: "Localities : ${Localities} \n name : ${name} \n Click this link to approve and run the executor job: ${env.BUILD_URL}console", subject: "Job Approval: Supplier Delete with build #${currentBuild.number}", to: 'user1' timeout(time: 1, unit: 'HOURS') { def approvalResult = input message: 'You want to approve this build? ', ok: 'Submit', parameters: [choice(choices: ['Approved', 'Rejected'], name: 'ApprovalStatus')], submitter: 'user1,user2', submitterParameter: 'approverID' env.approvalStatus = approvalResult.ApprovalStatus } } echo "Approval status: ${env.approvalStatus}" } } stage('Build') { when { expression { env.approvalStatus == 'Approved' } } steps { sh 'echo "Building..."' } } stage('Deploy') { when { expression { env.approvalStatus == 'Approved' } } steps { sh 'echo "Deploying..."' } } } }
内容的提问来源于stack exchange,提问作者deewreck
相关产品推荐
相关产品推荐

