2011-12-08

外部ジョブの監視も使ってみよう!

Jenkins Advent Calender 2011 8日目担当の、@akiko_pusuです。よろしくお願いします!

私の場合は、Jenkinsを正統派CIツールとして使っているのではなくて、雑多なCronジョブや定型化できる作業(バックアップやリストア、リカバリなど)の管理 / 実行 / 記録のために使っています。

作成するジョブはフリースタイルのプロジェクトで、かつ、Shell ScriptやDOSコマンドを使って処置するものがほとんど。

ただし、「外部ジョブの監視」というタイプでのCronジョブのチェックも行っています。今回はこのタイプについてのお話しを書いてみようと思います。

内容は、下記の通りです。
1. 機能の説明
2. どうやってPOSTしているの?
3. javaを使わずにShell + curlでPOSTしてみる
* * *


1.機能の説明


地味な機能?だとは思いますが、『Cronジョブのメールが届き過ぎて、全然チェックしないままになっている。そういうことが積み重なって、実際のところエラーがあったのに見落としてしまった…』というようなパターンには、有効だと思います。

作り方は簡単で、「外部ジョブの監視」を選んで、タイトルと説明、記録をどれだけ残すかを設定するだけです。

external-job

JenkinsのWikiを参考にかいつまんで言うと、Jenkinsのマスタノードをトリガにせず、マスタ / スレーブの設定も行わずに、任意のホスト上でジョブを実行し、JenkinsのプロジェクトのURLに結果をPOSTし、記録のみを行う、ということになります。

jenkins

Jenkinsはジョブの結果を受け取る場所だけを用意し、XMLの形式でPOSTが届いたら、せっせとその記録を蓄積するだけです。

ステータスコードによるジョブの失敗/成功の判定と、実行記録を蓄積するのみなので、結果を受けてJenkinsマスタノードが次のステップを呼び出したり、プラグインによる色々な操作につなげる…といったことは出来ません。

ですが、少なくとも、自分のメールボックスをCronの通知でいっぱいにさせることもなくなるし、自分以外の管理者との情報共有も可能になります。通知のMAILTOの設定もaliasを使ったりすると面倒なのですが、それもしなくて良くなります。

また、RSS、最新の成功/失敗ジョブの記録は、フリースタイルやMavenプロジェクトタイプと同じように固定URLで取得できるので、このURLを定期的にチェックして、次のアクションを起こせるように、Jenkins自身で別のジョブを作ればいいのかもしれませんね。

2.どうやってPOSTしているの?


JenkinsのWikiを参考にすると、こんなかんじです。


1. jenkinsのjenkins-core.jar を使って、実行したいスクリプト (Shellや*.bat) を引数に指定してあげて、javaからラップして実行する。
2. スクリプトの結果(出力とステータスコード)をjavaのプログラムが受け取り、XMLのフォーマットに変換する
3. XMLをJenkinsの指定のジョブにPOSTする。
4. Jenkins側がXMLを受け取って、ビルドの記録として蓄積。結果は<result/>を参照して判断。(ただし、結果をhexBinaryで変換する必要がある

要は、所定のフォーマットのXMLで結果をPOSTすればいい、ということになります。

シェルの結果からXMLに変換しJenkinsにPOSTする部分をjenkins-core.jarが担っているのですが、このケースだとjavaを使う必要がありますし、jenkins-core.jarも実行環境に配置しておかないといけません。

サーバ、マシンの環境によってはjavaを入れていない、使えないケースもあるかと思いますが、とにかくXMLをPOSTすればいいので、javaとjenkins-core.jarを必ずしも使う必要は無かったりします。

3. javaを使わずにShell + curlでPOSTしてみる



JenkinsのPOST用のXMLはそんなに複雑なフォーマットではありません。
XML生成専用のライブラリを使ってGenerate…なんてことはせずに、単純に文字列を連結するだけでも大丈夫。

また、httpでのPOSTも、Unixの環境ならwgetやcurlが利用できます。

下記に、Jenkins側にローカルホスト内のジョブやスクリプトの実行結果を通知するための、ラッパースクリプトを作って置いてみました。(と言っても、hudsonのラッパーを作成して下さっていたBlogエントリがあったので、そちらを利用したものですが…)

ソース: https://github.com/akiko-pusu/misc/blob/master/misc/jenkins_wrapper.sh
参考にしたサイト: http://blog.markfeeney.com/2010/01/hudson-external-jobs-wrapper-script.html 

実行例は下記の通りです。
jenkins_wrapper <jenkins_url> <job名> <script>

% jenkins_wrapper http://jenkins.myco.com:8080 \ testjob /path/to/script.sh

※ tempファイルを作成するため、実行ユーザに /tmp の書き込み権限があるかをチェックして下さい。また、既存のシェルスクリプトを指定してうまく動かない場合は、フルパスで指定してみて下さい。もし、すでに、こんなCronがあったとしたら、ラッパースクリプトを使って置き換えるだけでOKです。

#00 02 * * * /pasth_to/myscript.sh
00 02 * * * jenkins_wrapper.sh jenkinsのURL job名 /pasth_to/myscript.sh


TODO:

Jenkinsのバージョンが上がって、XMLにもう少し説明を追加できるようになっているので、このラッパースクリプトもちょっと修正が必要です。また、認証付きのジョブになっている場合は、username & passwordも付加しないといけないので、こちらも対応できるようにしたいなと思っています :)

また、ぜひ、Windows環境下に適応したラッパー書いてくださる方を募集します!(PowerShell大歓迎!そこまでの技量がなくて申し訳ないです...)

* * *

おわりに


マスタ/スレーブの形が利用できない環境では、最初はわたしも jenkins-core.jar を使ってjavaでラップしていたのですが、Shellのみに置き換えたところ、cronの調整も楽になりました。(Blogを書いてくださった Markさんのおかげです!)

Hudson時代も含め、Jenkinsさんにはとてもお世話になっていて、川口さんのおっしゃっている、『人間の貴重な時間』を、有効に使えるようになりました。

#子どもたち、家族との時間も、急な対応に邪魔されずにすむようになりました。

before

みなさんも、ビルドだけでなく、どんどん定型ジョブや定型化できそうな作業を、Jenkinsに置き換えてみて下さい。また、記録もJenkinsさんにお任せしてみて下さい。
なんでもないと思っていたcronの結果からも、記録し続けることで何かもっと改善できるヒントが見つかるかもしれません。

@kiy0takaさんのX’masプラグインにめげずに、みなさんが良い年末年始を過ごせますように…。

* * *

次は@leather_soleさんになります。どうぞよろしくお願いいたします!

2 件のコメント:

  1. 絵がかわいい!

    最近この機能はいじっていないのですが、トリガとかメールとかの機能がこれと組み合わせて使えるようになっていたら便利ですね。出来ない理由は何もないので。

    返信削除
  2. 川口さんだ!
    書き込みありがとうございます!

    あまり高度な機能は無くてもいいのですが、失敗/成功だけではなく、不安定という形でステータスを設定できるといいなと感じたことはありますね。

    「外部ジョブの監視」もサーバ管理運用者向けにはとても良いものだと思っています。

    成果物というフォルダはないけれど、ある記録だけは上書きされずに取って置けたり、まとめてログをダウンロードできるようになっていると、いいかなと感じています。

    自分でコードを書けないのが痛いのですが、この機能を利用する方が増えたらきっと本体へ追加機能やプラグインなどを書いてくださる方が増えるだろう!と思って、あえて紹介してみました(^^

    返信削除