5

1 時間ごとに実行するように構成された jenkins ジョブがあります。成功ビルドのメールを 1 日 1 回だけメールで送信したい。Email-Ext は、すべての成功、失敗などについてメールを送信するオプションを提供してくれます。

4

3 に答える 3

4

これは古い質問であり、おそらくすでに独自の回避策を見つけているでしょうが、同様のニーズがあり、とにかく解決策を共有すると思いました. 私がやろうとしていたのは、失敗した状態のジョブの要約メールを 1 日 1 回生成することでした。これは基本的に、単一のジョブの成功レポートを 1 日 1 回送信するのと非常によく似ています。

私のソリューションでは、Email-Ext プラグインの事前送信スクリプト機能と組み合わせた Groovy ビルド ステップを使用します。上記のコメントで参照されているNabble スレッドからアイデアを得ました。Jenkins サイトのEmail-Ext Recipesも参照してください。

以下は、どのビルドが失敗したかを判断する最初の 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 

次に、[編集可能な電子メール通知]セクションで、失敗時に通知するように Email-Ext プラグインを設定しました。Content TypePlain 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")

重要なのは、 MimeMessagemsgであるオブジェクトにアクセスできることです。MIME メッセージの内容は任意に設定できます。

この場合、失敗したジョブのリストを生成していますが、あなたの場合は、1 日 1 回の成功レポートで受け取りたいメッセージです。必要に応じて、失敗したビルドだけでなく、ビルドごとに 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 を使用すると、メール通知を送信する特定のトリガーを構成できます。これは、Jenkins のデフォルトの動作と同様に、成功時または失敗時に行うことができます。しかし、最初の失敗やまだ失敗しているような、より洗練されたものがあります。これにより、Jenkins がいつ、誰に (受信者リスト、コミッターまたはリクエスター) にメールを送信するかを大幅に制御できます。私の場合、ここでの適切な構成は、Jenkins によって生成された電子メール トラフィックに大いに役立ちます。また、特定の状況で特定のメールを特定のリストに送信することもできます。

もう 1 つのオプションは、そのレベルの制御が本当に必要なく、メール トラフィックを 1 日に 1 つの要約だけに制限したい場合、メーリング リストを設定することです。ほとんどのメーリング リスト エンジンでは、すべてのメール トラフィックの毎日のダイジェストをリストに送信できます。十分なはずですが、長期的には実際に良い選択肢だとは思いません. 私は間違いなく Email-ext プラグインを試してみます。

于 2013-03-02T11:50:04.790 に答える