有没有一种方法可以直接在阶段/步骤中使用声明性语法在Jenkinsfile中使用“ propagate = false”?

时间:2019-04-17 08:23:11

标签: jenkins jenkins-pipeline jenkins-declarative-pipeline

您可以按以下说明在构建作业上使用传播:

https://jenkins.io/doc/pipeline/steps/pipeline-build-step/

因此,您可以使用类似的方法来防止失败的步骤使整个构建失败:

build(job: 'example-job', propagate: false)

有没有办法将其用于阶段或步骤?我知道我可以用try / catch包围它,并且确实可以按我的意愿工作。它不会忽略失败的阶段,并继续进行其余的构建,但不会将阶段显示为失败。目前,我将所有失败的阶段都写入变量,并在稍后的阶段输出,但这并不理想。

如果我不能抑制阶段/步骤中的传播,也许有一种方法可以使用build()调用来做到这一点?也许如果我将其移动到另一个管道并通过build()调用它?

任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:1)

目前forscripted语法有很多建议,但是对于声明性语法,正在进行中,以支持该建议。

跟踪https://issues.jenkins-ci.org/browse/JENKINS-26522的进度,该进度将所有片段组合在一起以实现此目的。它有一些有趣的位已经标记为“已解决”(表示已更改代码),例如https://issues.jenkins-ci.org/browse/JENKINS-49764(“允许为管道阶段定义自定义状态”)。不幸的是,由于父票证尚未完成,我找不到在Jenkins变更日志中涉及的任何票证的引用。

以下可能是您感兴趣的:https://issues.jenkins-ci.org/browse/JENKINS-45579由于问题而重新开放。为此的环境是: enter image description here

诚然,跟踪这项工作的票证数量令人困惑,但这可能是由于所实现的功能有许多用例的事实。

另一个有趣的票证是"Individual Pipeline steps and stages/blocks should have Result statuses",我能够找到相关的PR:https://github.com/jenkinsci/workflow-api-plugin/pull/63


值得注意的是,声明性管道始终被设计为具有自发性,因此并不旨在支持脚本化语法的所有可能。对于无法满足您需求的更复杂的工作流和用例,脚本语法可能是唯一的(也是推荐的?)选项。

对于您所陈述的需求,如果产生了足够的噪音,则声明性管道可能会在适当时候进行修改以支持它。

答案 1 :(得分:0)

使用catchError,您可以防止失败的步骤使整个构建失败:

pipeline {
    agent any
    stages {
        stage('1') {
            steps {
                sh 'exit 0'
            }
        }
        stage('2') {
            steps {
                catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE') {
                    sh "exit 1"
                }
            }
        }
        stage('3') {
            steps {
                sh 'exit 0'
            }
        }
    }
}

在上面的示例中,所有阶段都将执行,管道将成功,但是阶段2将显示为失败:

Pipeline Example

您可能已经猜到了,可以随意选择buildResultstageResult,以防不稳定或其他原因。您甚至可以使构建失败并继续执行管道。

只需确保您的Jenkins是最新的,因为这是一个相当新的功能。