2014年4月28日月曜日

[Jenkins][管理者向け] 起動時トリガージョブ

Jenkins の管理者向けに Jenkins が起動したらメール通知するジョブを作りました。
(マシンの不調で再起動することが稀にあるので、その検知をするために作った)

まず、Jenkins が起動した時に "何か" させるために、Startup Trigger Plugin をインストールします。
Startup Trigger Plugin はその名の通り、Jenkins の master もしくは slave が起動したことをビルドトリガーとして使えるようにするプラグインです。

あとは、適当なジョブを作成して Startup Trigger で master の起動をトリガーとして設定。

ビルド後の処理にメール通知を設定したら終わりです。
これで Jenkins が起動するとメールが送られてくるようになりました。


ついでなので、Jenkins のログをメールに含めるようにしてみました。
Groovy postbuild Plugin で以下のコードを実行してください。
def jenkins = hudson.model.Hudson.instance
def logs = jenkins.logRecords
if( logs != null )
{
    manager.listener.logger.println("log: ")
    logs.each {
        manager.listener.logger.println(new Date(it.getMillis()))
        manager.listener.logger.println(it.getMessage())
    }
}

logs の部分を以下のようにすれば、ユーザーが作成したログレコーダーからでもログを取得できます。
def logs = jenkins.getLog().getLogRecorder('HOGEHOGE').getLogRecords()

2014年4月21日月曜日

[Jenkins] Email-ext plugin の Pre-send Script を使う

Email-ext plugin の Pre-send Script を使う機会があったので、備忘録として書き残しておきます。
(Jenkins 1.556, Email-ext plugin 2.37.2.2)

Pre-send Script とは?
Pre-send Script はメール送信前にメッセージなどの編集ができる機能です。そのまんまですね。

Pre-send Script では以下のオブジェクトが扱えます。
msgMimeMessage オブジェクト
loggerログ書き込みオブジェクト
buildビルドオブジェクト
cancelboolean, 送信キャンセル

msg はメールの内容を扱う MimeMessage オブジェクトです。宛先の追加やメッセージの追加などができます。
logger はログ出力用のオブジェクトです。logger.println でビルドログに出力できます。
build はビルド情報を扱うオブジェクトです。結果や変更点などビルドに関わる情報をここから取得できます。
cancel に true をセットすると、その名の通りメールの通知がキャンセルされます。

設定方法
拡張e-mail通知の「Advanced Settings...」を開くと「Pre-send Script」の項目があるので、ここの groovy でスクリプトを書き込みます。


注意が必要なのは Pre-send の前に宛先が空だと Pre-send Script は実行されず "An attempt to send an e-mail to empty list of recipients, ignored." でメールが送信されませんので、宛先を編集する場合は気をつけてください。
Examples
上流ビルドのコミッタ-にメール通知する
上流ビルドのコミッタ-にメール通知する方法 - akira0622's blog

特定のログが含まれる場合にメール通知をキャンセル
def log = build.getLog()
pattern = /test/
if( log=~pattern )
{
  logger.println("キャンセルした")
  cancel |= true
}

ユーザーがビルドを実行した場合にメール通知をキャンセル
def cause = build.getCause(hudson.model.Cause.UserIdCause.class)
if( cause )
{
  logger.println("キャンセルした")
  cancel |= true
}

定期ビルドの場合に宛先を追加
import javax.mail.Message.RecipientType
def cause = build.getCause(hudson.triggers.TimerTrigger.TimerTriggerCause.class)
if( cause )
{
  msg.addRecipients(RecipientType.TO, "hogehoge@hoge.co.jp")
}

その他の使い方は公式の Recipe を参照してください。
https://wiki.jenkins-ci.org/display/JENKINS/Email-ext+Recipes

2014年4月14日月曜日

[Jenkins] アップグレードのスケジューリング

Jenkins の管理者の方々は Jenkins 自体のアップグレードやプラグインのアップグレードなど、メンテナンス業務があると思います。
それを少し楽にしたって話です。少しです、少し。

何をしたかというと、「Jenkins を SafeRestart させるジョブ」を作っただけです。
SafeRestart は実行(ビルド)中のジョブがなければ、Jenkins を再起動させる機能です。

どう楽になったか
アップグレードをする場合、Jenkins を止める必要があります。この作業はできるだけ開発メンバーが作業中でない方が良いです。そうなると、アップグレードは夜中とか休日とかなることが多いと思います。
また、大きいプロジェクトや1ビルドがなが~いテストを持つ Jenkins の場合、止めるのにも時間がかかったりします。(強制中断という手もありますが・・・)

それだと、管理者は大変ですよね?

今回、「Jenkins を SafeRestart させるジョブ」を作ったことで、「SafeRestart のスケジューリング」ができるようになり、Jenkins の再起動を予約できるようになりました。
つまり、金曜に Jenkins の更新をダウンロード&インストールしておき(再起動はしてないので、アップグレード自体は未完)、開発メンバーがいない土曜深夜に SafeRestart を仕掛けておけば、日曜日には再起動がかかって無事アップグレードが完了。
そして月曜日にはいつもどおり CI が回せるというわけです。

これで管理者である私は休日出勤しなくて済むようになりました。
SafeRestart させるジョブの作り方
いろいろ方法があると思います。
SafeRestart 自体は、Jenkins の URL + /safeRestart(http://~/safeRestart)を開くだけでもできますし、SafeRestart Plugin ってのもあります。

今回は、みんな大好き Groovy postbuild Plugin を使った方法を紹介します。

1. プロジェクトを作る
2. 「ビルド後の処理の追加」から「Groovy Postbuild」を追加
3. 以下のスクリプトを入力
def jenkins = hudson.model.Hudson.instance
jenkins.doSafeRestart()
4. ビルド・トリガに再起動させたい日時を設定する(ビルド中であることも考慮して早めに設定しておくといいかも)

設定は以上です。これで Jenkins の管理が楽になりますね。

※ Windows の場合、サービスで実行してないとダメなようです。(その他の OS は確認してません)