如何知道 Jenkins 流水线的哪个阶段失败了?

32

在我的Jenkins流水线中,我通常使用post声明函数来在流水线失败时向我发送电子邮件。

post函数的简单语法如下:

post {
    failure {
        mail to: 'team@example.com',
             subject: "Failed Pipeline: ${currentBuild.fullDisplayName}",
             body: "Something is wrong with ${env.BUILD_URL}"
    }
}
在上述电子邮件中,我还想提及流水线的哪个阶段(假设流水线有5到6个阶段)失败了。我该怎么做?非常感谢任何帮助。
对上述要求的扩展是在故障通知电子邮件中同时为用户提供实际的错误日志(已经失败的阶段的日志)。
思路是,当用户从jenkins接收到失败通知时,他应该知道哪个阶段的管道失败了以及错误日志。
预先感谢您。

另一种选择是在阶段级别使用“post”。 - vmartin
这个问题有更全面的答案。在Jenkins声明性流水线中确定失败阶段。这个回答解决了你的问题吗? - zett42
1个回答

30
有一个名为env.STAGE_NAME的变量可以使用。但在你的情况下,你可能需要将阶段名称存储在不同的变量中,因为当你在post阶段获取env.STAGE_NAME时,结果将是Declarative: Post Actions。相反,你需要在所有阶段中将阶段名称存储在一个变量中。因此,一旦一个阶段失败——Jenkins就不会继续进行下一个阶段,因此你会得到“失败”的阶段名称。
这里是一个例子:
def FAILED_STAGE

pipeline {
    agent { label "master" }
    stages {
        stage("Stage 1") {
            steps {
                script {
                    FAILED_STAGE=env.STAGE_NAME
                    echo "stage 1"
                }
            }
        }
        stage("Stage 2") {
            steps {
                script {
                    FAILED_STAGE=env.STAGE_NAME
                    echo "stage 2"
                    error "failed for some reason."
                }
            }
        }
        stage("Stage 3") {
            steps {
                script {
                    FAILED_STAGE=env.STAGE_NAME
                    echo "stage 3"
                }
            }
        }
    }
    post {
        failure {
            echo "Failed stage name: ${FAILED_STAGE}"
        }
    }
}

可能有更好的方法,但我目前还没有找到。

关于日志 - 截至JENKINS-40526,您可能可以使用API并从其中获取日志文件,但我不确定您是否可以从管道内部获取所需的参数。另一个解决方案是使用emailext并通过电子邮件发送整个构建日志文件:

emailext attachLog: true, body: '', compressLog: true, subject: '构建失败。', to: 'somebody@somewhere.com'


1
谢谢 @tftd,安装了 Stage Step 插件 v2.3 后,我可以使用 STAGE_NAME 环境变量了。 - Yash
1
似乎需要script标签才能更改def,请参考https://dev59.com/aVkS5IYBdhLWcg3wdmgx#39846733。在您的示例中,它仅在步骤2中使用。 - William Reed
1
@WilliamReed 是的,没错 - 我已经更新了答案。谢谢! :) - tftd
1
尝试使用双引号 " 而不是单引号 ' - tftd
2
看起来不错。但是当您使用并行阶段时,可能会返回不正确的阶段名称。 - Kutzi
显示剩余7条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接