当前位置: 首页 > 面试题库 >

在管道工作流程中使用Jenkins'Mailer'

隆长卿
2023-03-14
问题内容

我想在一个定义管道构建作业的框架中利用Jenkins
的现有Mailer插件Jenkinsfile。给定以下简单的失败脚本,我希望每个构建版本都会收到一封电子邮件。

#!groovy

stage 'Test'
node {
    try {
        sh 'exit 1'
    } finally {
        step([$class: 'Mailer', notifyEveryUnstableBuild: true, recipients: 'me@me.com', sendToIndividuals: true])
    }
}

构建的输出为:

Started by user xxxxx
[Pipeline] stage (Test)
Entering stage Test
Proceeding
[Pipeline] node
Running on master in /var/lib/jenkins/jobs/rpk-test/workspace
[Pipeline] {
[Pipeline] sh
[workspace] Running shell script
+ exit 1
[Pipeline] step
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
ERROR: script returned exit code 1
Finished: FAILURE

如您所见,它确实记录了它step在失败后立即执行管道的过程,但是没有生成电子邮件。

利用自由工作的其他自由式工作中的电子邮件mailer,只是通过管道工作来调用。

这与Jenkins 2.2和mailer 1.17一起运行。

是否有其他机制可以用来调用失败的构建电子邮件? 我不需要该mail步骤的所有开销,仅需要有关故障和恢复的通知。


问题答案:

在Pipeline中,失败sh不会立即将设置为currentBuild.resultFAILURE而初始值为null。因此,依赖于诸如Mailer之类的构建状态的构建步骤可能看起来不正确。

您可以通过添加调试打印来检查它:

stage 'Test'
node {
    try {
        sh 'exit 1'
    } finally {
        println currentBuild.result  // this prints null
        step([$class: 'Mailer', notifyEveryUnstableBuild: true, recipients: 'me@me.com', sendToIndividuals: true])
    }
}

整个流程都由Jenkins提供的异常处理程序包装,这就是Jenkins最终将构建标记为失败的原因。

因此,如果您想使用Mailer,则需要正确维护构建状态。例如:

stage 'Test'
node {
    try {
        sh 'exit 1'
        currentBuild.result = 'SUCCESS'
    } catch (any) {
        currentBuild.result = 'FAILURE'
        throw any //rethrow exception to prevent the build from proceeding
    } finally {
        step([$class: 'Mailer', notifyEveryUnstableBuild: true, recipients: 'me@me.com', sendToIndividuals: true])
    }
}

如果您不需要重新抛出异常,则可以使用catchError。它是内置的Pipeline,可捕获其范围内的任何异常,将其打印到控制台中并设置构建状态。例:

stage 'Test'
node {
    catchError {
        sh 'exit 1'
    } 
    step([$class: 'Mailer', notifyEveryUnstableBuild: true, recipients: 'me@me.com', sendToIndividuals: true])
}


 类似资料:
  • 问题内容: 我在OS X上使用boot2docker并克隆了以下存储库: https://github.com/enokd/docker-node-hello 它基本上有一个Dockerfile和一个非常简单的Express应用程序,可以打印世界。在构建和运行映像时,一切运行良好,但是,如果我在Mac上对index.js进行了任何更改,这些都不会反映在运行的映像中。我似乎找不到任何有关如何设置do

  • 问题内容: 我有一个不同阶段的管道。我希望当前作业检查上一个版本中经过了多少个阶段并将其记录在控制台中? 考虑这是我当前的管道 我想要一个时髦的脚本给我这样的东西 我的代码的目的是跟踪构建过程中不同阶段的成功与失败。有没有其他替代方法? 问题答案: 您绝对可以使用Pipeline REST API插件,对我来说,Jenkins 2.13 可以直接使用它。 通过解析结果JSON,您可以获得与您期望的

  • 我试图设置jenkins管道使用gCloud,但我得到以下错误: /service-account-creds.json警告:无法在 /.config/gcloud/logs中设置日志文件,(错误:无法创建目录[/. config/gCloud/logs/2019.02.07]:权限被拒绝。 守则: Jenkins使用imagen Jenkins/Jenkins在容器中运行

  • 问题内容: 请注意: 这个问题是基于旧的,现在称为“脚本化”管道格式的。使用“声明性管道”时,可以将并行块嵌套在阶段块内部(请参阅带有声明性管道1.2的并行阶段)。 我想知道Jenkins工作流/管道插件,特别是并行步骤应该如何工作。如何将它们与构建阶段混合使用。我了解一般模式: 但是,我想并行运行几个阶段(在具有多个执行程序的同一节点上),因此我尝试添加以下阶段: 这不能按预期方式工作。“执行任

  • 由于一些公司的变化,我们被迫改用詹金斯作为CI工具。虽然这似乎不是一个坏主意,但由于缺乏对非Java应用程序的支持,尤其是对管道(旧的工作流)插件的支持,以及我们对Jenkins知识的缺乏(目前还没有),我们遇到了很多麻烦。 但是出现错误: java.lang.IllegalArgumentException:预期的命名参数,但在org.jenkinsci.plugins.workflow.cps

  • 问题内容: 我正在尝试使用Ruffus管道中的多个Sailq文件作为参数的Sailfish。我使用python中的子流程模块执行Sailfish,但即使设置,在子流程调用中也不起作用。 这是我要使用python执行的命令: 或(最好): 概括: 我将如何在python中执行此操作?子过程正确吗? 问题答案: 模拟bash进程替换: 在Python中,您可以使用命名管道: 在哪里: 实现bash进程