当前位置: 首页 > 知识库问答 >
问题:

如何检测Jenkins声明性管道中哪个并行阶段失败?

须新
2023-03-14

我的Jenkins流水线并行运行多个任务。似乎如果一个阶段失败,所有后续阶段将运行其<code>failure</code>post块(无论它们是否实际失败)。我不知道这是故意的还是我做错了什么。

注意:这个管道运行在一个Windows节点上,因此< code>bat('exit /b 1')

pipeline {
    agent any

    stages {
        stage('Parallel steps') {
            parallel {
                stage('Successful stage') {
                    steps {
                        script { sleep 10 }
                    }
                    post {
                        failure {
                            echo('detected failure: Successful stage')
                        }
                    }
                }
                stage('Failure stage') {
                    steps {
                        script { bat('exit /b 1') }
                    }
                    post {
                        failure { 
                            echo('detected failure: Failure stage')
                        }
                    }
                }
            }
        }
    }
}

在上面的管道中,只有“失败阶段”失败,但在输出中我看到了这一点,这表明对这两个步骤都执行了< code>failure条件!

Started by user Doe, John
Running on WINDOWS_NODE in D:\workspace
[Successful stage] Sleeping for 10 sec
[Failure stage] [test] Running batch script
[Failure stage] D:\workspace>exit /b 1 
Post stage
[Pipeline] [Failure stage] echo
[Failure stage] detected failure: Failure stage
[Failure stage] Failed in branch Failure stage
Post stage
[Pipeline] [Successful stage] echo
[Successful stage] detected failure: Successful stage
ERROR: script returned exit code 1
Finished: FAILURE

对于我来说,检测哪个并行阶段失败并将其报告给整个管道的最佳方法是什么?

共有1个答案

方季同
2023-03-14

看起来这是一个关于声明性管道的已知错误。我不得不放弃使用内置的帖子-

  1. 您必须捕获然后重新引发错误,以使阶段相应地失败。
  2. UI 可能会有点混乱,因为失败的步骤不再以红色突出显示(但错误消息仍在日志中)。
  3. 代码的可读性稍差。

这段代码工作正常。只有失败的阶段回显“检测到的失败”,而不是两者。

pipeline {
    agent any

    stages {
        stage('Parallel steps') {
            parallel {
                stage('Successful stage') {
                    steps {
                        script {
                            try {
                                sleep 10 
                            } catch (e) {
                                echo('detected failure: Successful stage')
                                throw(e)
                            }
                        }
                    }
                }
                stage('Failure stage') {
                    steps {
                        script {
                            try {
                                bat('exit /b 1')
                            } catch (e) {
                                echo('detected failure: Failure stage')
                                throw(e)
                            }
                        }
                    }
                }
            }
        }
    }
}
 类似资料:
  • 问题内容: 如何报告声明式管道失败的阶段?在fail块中,我想获取failureStage.name并将其报告(最终报告为松弛)。 问题答案: PipelineVisitor是一种很好的方法。但是,如果您只想查看错误,那么利用可能会更好。 以下内容提供了每个失败步骤的映射列表,并且还遍历了下游作业。我发现它非常有用。 您将要使用共享库来避免安全沙箱警告/批准

  • 问题内容: 如何在Jenkins声明式管道中循环参数化并行阶段?(或脚本管道,如果声明式不能) 这是我简单的伪示例。如何循环(“部署serverN”)阶段? 数组可能具有1..n变量。 我不想重复代码。詹金斯管道中一定有办法吗?还是我应该使用矩阵。我已经尝试了一些,但是没有成功。 我也尝试过这种方法,但是由于前一阶段不依赖于下一阶段,因此它并不是完美的。 在Blue Ocean中应该看起来像这样(

  • 我正在使用詹金斯声明管道,不知道是否有任何方法可以定期触发特定阶段。 我的意思是,当我们签出SCM时,管道会触发,但阶段2对我们的一些项目来说太长了。因此,我不想等待这个阶段,我只想每天运行这个阶段,但仍然将这个阶段保存在Jenkins文件中。 有没有办法做到这一点?这样做的最佳方法是什么?

  • 我想在Jenkins声明性管道语法中定义多个阶段,它们可以在任何一个失败后继续。我找不到任何现存的真正重复的问题,因为它们都假定或允许脚本语法。 为了澄清,我不寻求如何在脚本语法中实现这一点。我试图理解这种流控制是否在声明性语法中得到支持和形式化。为此,我将尝试准确定义我要寻找的内容: < li >没有尝试/捕捉。我不想陷入脚本模式,或者将我的声明性管道“包装”在另一个共享库或脚本块中。 < li

  • 问题内容: 目标 在同一节点上运行声明性Jenkins管道的多个阶段。 安装程序 这只是显示问题的一个最小示例。有2个Windows节点“ windows-slave1”和“ windows-slave2”,均标有“ windows”标签。 注意:我真正的Jenkinsfile无法使用全局代理,因为存在需要在不同节点上运行的阶段组(例如Windows与Linux)。 预期行为 Jenkins根据标

  • 目标 在同一节点上运行声明性Jenkins管道的多个阶段。 设置 这只是说明问题的一个最小示例。有两个Windows节点“Windows-slave1”和“Windows-slave2”都标有“Windows”标签。 注意:我的real Jenkins文件不能使用全局代理,因为需要在不同的节点(例如Windows和Linux)上运行多组阶段。 预期行为 Jenkins基于标签选择阶段1中的一个节点