2016年5月30日月曜日

[Jenkins] 手動実行の時に実行ノードを指定する

実行可能なノードが複数ある設定のとき、その中から1つが選ばれ実行されます。基本的にはどのノードでもいいのですが、手動で実行させるときに特定のノードで実行させたいことがあります。
たとえば、「特定のノードだけでテストが失敗していて、その修正をしたからそのノードで実行させて確認したい」ときがあります。

これはとっても簡単です。
NodeLabel Parameter Plugin を使うことですぐに実現できます。

NodeLabel Parameter Plugin は、ノードやラベル名をパラメーターにし、そのパラメータに指定されたノード(ラベルにマッチするノード)でビルドしてくれるプラグインです。
こちらのプラグインは以前にも紹介していますので、そちらもご覧いただければ思います。
ブログズミ: [Jenkins] ノードやラベルを指定して実行する

あとは、使い方の問題です。
ノードやラベルをパラメーター化する必要がないジョブでも、パラメーター化をしておきます。
デフォルトパラメーターは、「実行するノードを制限」に記入する内容と同じにしておきます。
普段はデフォルトパラメーターが使われてビルドされるので、パラメーター化しなかった時と同じです。


特定のノードで実行したい場合は、ノード指定をパラメーターに入力してキックするだけです。


特定のノードに限定する方法は、プラグインを使わなくても設定から「実行するノードを制限」を変更することで実現することができますが、パラメーターにしたことでこの手間がなくなります。
また、権限で設定を変更できないアカウントでも、ノード限定ができるようになるのもメリットの1つです。



簡単なことですが、割りと便利なので覚えておくといいと思います。
では。

2016年5月23日月曜日

[Jenkins] Groovy で IRC Plugin を使い倒す

IRC 使ってますか?
Slack とか Chatwork とか HipChat ですか?

IRC 使ってないし関係ないか~と思った「あなた」、ちょっと待ってください。

今回は「"Groovy" で IRC Plugin を使い倒す」というわけで、
Groovy 使ってプラグインにアクセスしてごにょごにょしようという話です。
なので、今回は IRC Plugin で説明をしますが、これに限った話ではなく、他のプラグインにも応用できます。

ちなみに、Groovy のことをよく知らなくても大丈夫です。見よう見まねでなんとかなります。(私がそうですから)

IRC Plugin でできること
まずは、IRC Plugin がどういったものか紹介をします。

IRC Plugin では以下のことができます。
  • コマンド
  • ビルド後の処理で通知(ビルド前も可)

コマンド機能は今回は話のメインではないので軽く説明。
jenkins-bot build job now
のようにするとビルドを開始するなど、IRC から Jenkins を操作する機能です。

もう1つが、ビルド後の処理で IRC に通知する機能です。

ビルド後の処理に追加しますが、「高度な設定...」 の 「Notify on build start」を有効にするとビルド開始時にも通知してくれます。

こんな感じに通知が来ます。

IRC Plugin でできないこと
  • 任意のメッセージ送信
  • ビルド後/ビルド前以外での通知

ビルド後/ビルド前の処理で送れる内容はある程度決まっており、任意のメッセージ・フォーマットで送れないのでちょっと不便です。(出力の順番を変えたいとか、定期的に任意のメッセージを通知をしたいとか)

Groovy で潜在能力を引き出す
プラグインで提供されている機能以上の力を引き出すことができるのが、Groovy です。
Groovy から Jenkins の機能にアクセスする方法はこれまでも紹介してきましたが、今回はプラグイン機能にアクセスします。そして、任意のメッセージを出力できるようにしたいと思います。

プラグインにアクセスするには、「getPlugin」を使います。今回は IRC Plugin なので
「hudson.model.Hudson.instance.getPlugin("ircbot")」のようにアクセスします。
getPlugin にはプラグイン ID を指定します。プラグイン ID はプラグインの Wiki に記載されています。

プラグインが get できたら、そこからさらにプラグインの機能にアクセスをしていきます。
IRC PluginSource Code(Github) を開くと実装が見れるので、これを参考に機能にアクセスしていきます。
(他のプラグインでもだいたいソースコード見れます。)

以下が、Jenkins のシステム設定で設定した IRC コネクションを使って、任意のメッセージを送るスクリプトです。
def jenkins = hudson.model.Hudson.instance
def irc_channel="#kiwiirc-iutest"
def p = jenkins.getPlugin("ircbot")
if( p == null ) {
  println("require IRC Plugin")
  return
}
def c = p.imPlugin.provider.currentConnection()
if( c == null ) {
  println("IRC connection not found. please set to IRC configuration")
  return
}
c.send(irc_channel, "label assignment")
return
細かい説明は省きます。
(何をしているか知りたい人は、プラグインのソースコードと照らし合わせて確認してください。)

最後にこのスクリプトを各種 Groovy の設定にコピーすれば設定完了です。
以下は Groovy Label Assignment plugin の設定をしているところです。


そして、実際に実行したところがこちら。


皆さんも、是非お試し下さい。

各種タイミングでの Groovy 利用を可能にするプラグイン
最後に Groovy が使えるようになるプラグインを少し紹介して終わりたいと思います。
ではでは。

プラグインタイミング設定
Groovy Pluginビルドジョブ
Groovy Postbuild Pluginビルド後ジョブ
Groovy Label Assignment plugin実行ノード決定ジョブ
Matrix Groovy Execution Strategy Pluginマトリックス生成ジョブ
Global Post Script Pluginビルド後グローバル
Scriptler Pluginビルドグローバル
Groovy Events Listener Plugin各種イベントグローバル
etc...

2016年5月16日月曜日

[Jenkins] Promote builds で成果物を使う

今回は Promoted Builds Plugin を使った「昇格」ビルドの時に成果物を参照して、サーバーにアップしたり、バックアップを取ったりなど、任意の処理をさせる方法を紹介します。

自作テスティングフレームワークの iutest のリリースをする際には、Jenkins でパッケージを作成して、その成果物をアップしています。
現状、このアップロードの作業は手作業で行っているのですが、これを自動化するための第一歩として今回の方法を使いたいと思っています。

Promoted Builds Plugin
iutest ではリリースするパッケージが出来上がったら、Promote builds でそのジョブを「昇格」させています。
これは、のちのちリリースしたパッケージを参照したいときに分かりやすいようにするためです。
また、このときビルドを保存するようにもしています。

これは Promoted Builds Plugin で簡単にできます。
ジョブの設定画面を開き、「Promote builds when」のチェックを入れます。


今回は昇格トリガーを手動「Only when manualy approval」、ログを保存したいので、「Actions」に「Build Log Forever」を設定。


設定するとサイドバーに「Promotion Status」が表示されるので、そこを開いて実行します。

実行すると、ログが保存され、スターが付きます。



Promoted Builds Plugin について、だいたいどんなものか分かったと思いますので、成果物を扱う方法に移ります。

成果物を扱う
成果物を扱うために Copy Artifact Plugin を使います。
Promote builds のアクションに「他プロジェクトから成果物をコピー」が選べますので、それを追加します。

コピー元のプロジェクトは自身のジョブを設定、ビルドは「特定のビルド」を選択します。
公式ページ にも書いてありますが、永続リンク(permalink)に Promote builds で設定した名前が選べるようになっており、それを使うと昇格したビルドを参照できますが、今回は使いません。

ビルド番号の設定には、「${PROMOTED_ID}」を指定します。
BUILD_ID ではなく PROMOTED_ID です。
BUILD_ID は Promote build のビルド番号になります。PROMOTED_ID が Promote build を実行したビルドのビルド番号になります。
なので、コピーしたい成果物は PROMOTED_ID で取ることになります。

あとは、コピーしたい成果物のフィルターやダウンロードパスなどを設定してください。

これで Promote build のときに成果物を扱えるようになりますので、あとは好きにしちゃってください。

今回は以上です。

2016年5月9日月曜日

Circle CI で Junit 形式 xml の集計

CI サービスで JUnit 形式の xml を集計できるものは、以下のものがあります。

Circle CI

Shippable


どちらを使ってもいいのですが、現在 iutest の開発では、
Shippable は Wandbox を使ったコンパイラーバージョン検証に利用しているので、Circle CI を使うことにしました。
ただ、Circle CI も今までは python ツールの検証用に使っていました。
今回、最適化オプションごとの検証用として再定義しなおしています。(もともとしてた python ツールのテストは別サービスに移行予定)

Circle CI で Junit 形式の xml 集計
さて、本題です。
Circle CI では、テスト結果は $CIRCLE_TEST_REPORTS ディレクトリに入れることになっています。
https://circleci.com/docs/test-metadata/
さらに、テストツールごとに階層がある構成になってます。(e.g. $CIRCLE_TEST_REPORTS/cucumber)
今回は JUnit 形式の xml を出力するので、junit ディレクトリに保存します。

iutest の場合:
test:
  post:
    - mkdir -p $CIRCLE_TEST_REPORTS/junit/
    - find . -type f -regex ".*/test/.*xml" -exec cp {} $CIRCLE_TEST_REPORTS/junit/ \;

集計結果は「Test Summary」に表示されます。
成功の場合:

失敗の場合:


簡単ですね。

2016年5月2日月曜日

PowerShell を使ってバッチファイルを管理者権限で実行する

自分用備忘録です。
よく runas コマンドを使った方法が紹介されていますが、Powershell を使ったほうが個人的には楽でいいなと思いました。

参考:

rem 管理者権限があるかどうかチェック
whoami /PRIV | find "SeLoadDriverPrivilege" >NUL
if not errorlevel 1 goto start

rem ない場合は powershell 経由で自分自身を実行
powershell.exe -Command Start-Process "%~0" -Verb Runas
goto :EOF

:start
rem ここからバッチ本来の処理