如何在声明式Pipeline中获取被调用任务的构建状态?currentBuild.Currentresult始终返回success
获取Jenkins声明式Pipeline中被调用Job的构建状态
问题描述
你的Pipeline代码片段如下:
script{ build job : 'somejob', parameters: [ extendedChoice(name: 'some_choice', value: "${env.some_choice}") ], propagate: false } echo "${currentBuild.Currentresult}"
执行后发现${currentBuild.Currentresult}始终返回success,但你实际想获取的是被调用的somejob的构建状态,对吧?
问题原因
propagate: false的影响:当设置propagate: false时,即使被调用的somejob构建失败,当前Pipeline Job也不会被标记为失败,所以currentBuild.currentResult(注意你这里写的Currentresult大小写错误,Jenkins变量是严格大小写敏感的)只会反映当前Job的状态,自然一直是SUCCESS。currentBuild的作用范围:currentBuild对象代表的是当前正在执行的Pipeline Job的构建信息,和被调用的子Job完全是两个独立的构建实例。
解决方案
要获取被调用Job的构建状态,你需要捕获build步骤的返回值——这个返回值是一个RunWrapper对象,包含了子Job的所有构建详情,其中就包括我们需要的构建结果。
修改后的代码示例:
script{ // 将build步骤的返回结果赋值给变量,保存子Job的构建实例 def childBuild = build(job : 'somejob', parameters: [extendedChoice(name: 'some_choice', value: "${env.some_choice}")], propagate: false) // 从子Job实例中提取构建状态 def childJobResult = childBuild.result echo "被调用的somejob构建状态: ${childJobResult}" // 可选:如果需要让当前Pipeline的状态和子Job保持一致 if (childJobResult in ['FAILURE', 'UNSTABLE']) { currentBuild.result = childJobResult } } // 现在如果上面更新了currentBuild.result,这里就能正确显示对应状态 echo "当前Pipeline构建状态: ${currentBuild.currentResult}"
关键细节补充
RunWrapper对象的更多属性:除了result,你还能通过这个对象获取子Job的其他信息,比如childBuild.number(构建编号)、childBuild.url(构建页面URL)等。- 大小写问题:一定要注意
currentBuild.currentResult的正确写法,你之前的Currentresult会导致无法正确获取值,甚至返回null。 propagate参数的选择:如果设置propagate: true,子Job失败时当前Pipeline会直接抛出异常终止;而你用了false,就需要手动判断子Job状态并做相应处理。
内容的提问来源于stack exchange,提问作者Siri
相关产品推荐
相关产品推荐

