确定Jenkins脚本管道中的失败阶段

时间:2017-11-30 09:26:04

标签: jenkins jenkins-pipeline

我正在寻找一种通用的方法来确定Jenkins脚本化管道末尾的失败阶段的名称。

请注意,这与声明性管道的Determine Failed Stage in Jenkins Declaritive Pipeline不同。

另请注意,在每个阶段中使用try / catch是不可能的,因为它会使管道脚本无法读取。这是因为我们有10-15个阶段存储在多个文件中,并使用JJB编译它们以创建最终的管道脚本。它们已经非常复杂,所以我需要一个干净的方法来找到哪个阶段失败。

2 个答案:

答案 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
}

Source