5

我有一个配置为每小时运行的詹金斯作业。我希望每天仅以电子邮件形式发送一次成功构建邮件。Email-Ext 让我可以选择发送所有成功、失败等的电子邮件。但我想要的是只发送一次成功电子邮件的能力。

4

3 回答 3

4

这是一个老问题,您可能已经找到了自己的解决方法,但我也有类似的需求,我想无论如何我都会分享我的解决方案。我试图做的是每天生成一份关于失败状态的工作的摘要电子邮件。这与为单个工作发送每日一次的成功报告基本上非常相似。

我的解决方案使用了 Groovy 构建步骤以及 Email-Ext 插件的预发送脚本功能。我从上面评论中引用的Nabble 线程中得到了这个想法。另请参阅Jenkins 网站上的电子邮件分机食谱。

这是确定哪些构建失败的初始 groovy 脚本,在Execute System Groovy Script下配置。您可以执行类似的操作来确定您的构建是成功还是失败:

// List the names of jobs you want to ignore for this check
ignore = [ ]

// Find all failed and unstable jobs
failed = hudson.model.Hudson.instance.getView("All").items.findAll{ job ->
  job.getDisplayName() != "Daily Jenkins Job Nag" &&
  !ignore.contains(job.getDisplayName()) &&
  job.isBuildable() &&
  job.lastCompletedBuild &&
  (job.lastCompletedBuild.result == hudson.model.Result.FAILURE ||
   job.lastCompletedBuild.result == hudson.model.Result.UNSTABLE)
}

// Log the job names so the build results are legible
failed.each { job ->
  println(job.getDisplayName() +
          " " + job.lastCompletedBuild.result +
          " at build " + job.lastCompletedBuild.number +
          " (" + job.lastCompletedBuild.timestamp.format("yyyy-MM-dd'T'HH:mm ZZZZ") + ")");
}

// Return failure if there are any failed jobs
return failed.size 

然后,在Editable Email Notification部分,我将 Email-Ext 插件设置为通知失败。我将Content Type设置为Plain Text (text/plain),将Default Content留空,并将以下内容设置为Pre-send Script

failed = hudson.model.Hudson.instance.getView("All").items.findAll{ job ->
  job.getDisplayName() != "Daily Jenkins Job Nag" &&
  job.isBuildable() &&
  job.lastCompletedBuild &&
  (job.lastCompletedBuild.result == hudson.model.Result.FAILURE ||
   job.lastCompletedBuild.result == hudson.model.Result.UNSTABLE)
}

def output = StringBuilder.newInstance()

output << "<html>\n"
output << " <body>\n"
output << "<p>Jenkins reports the following failed jobs:</p>"
output << "  <ul>\n"

failed.each { job ->
  url = hudson.model.Hudson.instance.rootUrl + job.url + "/" + job.lastCompletedBuild.number + "/"
  output << "   <li>"
  output << "<a href=\"" + url  + "\">" + job.displayName + "</a>"
  output << " " + job.lastCompletedBuild.result 
  output << " at build " + job.lastCompletedBuild.number
  output << " (" + job.lastCompletedBuild.timestamp.format("yyyy-MM-dd'T'HH:mm ZZZZ") + ")"
  output << "</li>\n"
}

output << "  </ul>\n"
output << " </body>\n"
output << "</html>"

msg.setContent(output.toString(), "text/html")

关键是您可以访问该msg对象,即MimeMessage。您可以将 MIME 消息的内容设置为您想要的任何内容。

在这种情况下,我正在生成一个失败作业的列表,但在您的情况下,它将是您希望收到的每日一次成功报告的任何消息。根据您的需要,您可以让 Email-Ext 为每个构建发送结果,而不仅仅是为失败的构建发送结果。

于 2015-06-17T16:02:11.093 回答
3

如果自上一封电子邮件以来没有足够的时间过去,如何禁止电子邮件?虽然不完全是所要求的,但像这样的预发送脚本因其简单性可能值得考虑?

if (build.result != hudson.model.Result.SUCCESS) {
    cancel = true;
}
else {
  try {
    long minEmailGap = 1000 * 60 * 60 * 16; // 16 hours in milliseconds

    File file = new File("/TimestampForMyJob.txt");

    if (file.exists() == false) {
      file.createNewFile();
    }
    else {
      long currentTime = (new Date()).getTime();

      if (file.lastModified() + minEmailGap > currentTime) {
        cancel = true;
      }
      else {
        file.setLastModified(currentTime);
      }
    }
  }
  catch(IOException e) {
    // We can't tell whether the e-mail should be sent out or not, so we do nothing
    // and it just gets sent anyway - probably the best we can do with this exception.
  }
}
于 2015-10-02T13:19:05.650 回答
2

好吧,没有插件可以为您做到这一点。Jenkins 中的默认电子邮件功能非常简单,而且运行良好。虽然有Email-ext 插件,但这个插件可以为您做更多的事情。

首先,使用 Email-ext,您可以配置一个特定的触发器来发送电子邮件通知 - 它可以是successfailure,这类似于 Jenkins 的默认行为。但是你有更精致的,比如First failureStill failed。这将让您对 Jenkins 发送电子邮件的时间和对象(收件人列表、提交者或请求者)有很大的控制权。就我而言,这里的良好配置将对 Jenkins 生成的电子邮件流量有很大帮助。您可以在特定情况下向特定人员列表发送特定电子邮件 - 太棒了!

另一种选择是,如果您真的不需要这种级别的控制并且只想将电子邮件流量限制为每天一个摘要,则可以设置一个邮件列表。大多数邮件列表引擎将允许您将所有电子邮件流量的每日摘要发送到列表。应该足够了,虽然我真的不觉得从长远来看它实际上是一个好的选择。我肯定会尝试使用 Email-ext 插件。

于 2013-03-02T11:50:04.790 回答