我正在寻找一种通用的方法来确定Jenkins脚本化管道末尾的失败阶段的名称。
请注意,这与声明性管道的Determine Failed Stage in Jenkins Declaritive Pipeline不同。
另请注意,在每个阶段中使用try / catch是不可能的,因为它会使管道脚本无法读取。这是因为我们有10-15个阶段存储在多个文件中,并使用JJB编译它们以创建最终的管道脚本。它们已经非常复杂,所以我需要一个干净的方法来找到哪个阶段失败。
答案 0 :(得分:0)
使用GraphListener:
def listener = new GraphListener.Synchronous(){
@NonCPS
void onNewHead(FlowNode node){
if (node instanceof StepStartNode){
// before steps execution
}else if (node instanceof StepEndNode){
// after steps execution
}
}
def execution = (FlowExecution) currentBuild.getRawBuild().getExecution()
execution.addListener(listener)
您将需要一些帮助程序功能才能使其正常运行,例如,StepStartNode和StepEndNode被调用了两次,因此您必须使用标签过滤一个。此外,在侦听器中还可以使用env之类的变量,因此您可以在其中存储任何内容,以便以后使用。
这个答案很笼统,但我发现它在某些关于某个阶段之前或之后(或全部)之后要做的堆栈溢出问题中很有用。
您不能在管道内部尝试/捕获异常,因为这种方法不是阶段的包装,而是每个行指令都执行一次的侦听器,但是您只能在开始和结束检查时记录阶段< em> currentBuild.result 来查看阶段是否失败。此时,您几乎可以做任何事情。
在使用FlowExecution的某个时刻,您可以访问管道脚本,我不知道该脚本当时是否可写,但是重写管道以实际尝试/捕获阶段将是很棒的。如果您在此行中做某事,请让我知道;)
答案 1 :(得分:0)
U还可以在共享库super_stage中创建自定义步骤
简单示例:
// vars/super_stage.groovy
def call(name, body) {
try {
stage(name) {
body()
}
} catch(e) {
register_failed_stage(name, e)
throw e
}
}
这样,您可以“重用”相同的异常处理程序。
在脚本化管道中,您将像这样使用它:
super_stage("mystage01") {
//do stuff
}