2015年3月22日日曜日

別サーバにあるJenkinsジョブと連携するスクリプト書いた

タイトルの通り、別サーバにあるJenkins間でジョブを連携させるスクリプトを勉強がてら書いたので、ことのついでに晒してみます。

ソースはgist(syncbuild_remote_jenkins.py)にあります。
動作環境などは↓のような感じ。
  • python2.7で動作確認済み
    • 3.x系では動きません
  • 基本的に標準のライブラリだけで動く(はず)
    • 自由にpip install出来ない環境では重宝するかも
使い方としては、任意のホスト、ポート、ジョブ名を指定する感じです。
$ ./syncbuild_remote_jenkins.py --host remote-jenkins-server --job RemoteJobName --interval 300

ちなみに、intervalオプションでジョブの状態をポーリングする間隔を変えられるようにしています。(上記の例だと300秒)
時間のかかるジョブであれば長めに設定すると無駄な処理が走らなくて良いかと。

できること/できないこと

今のところ以下のことが可能です。
  • 指定したサーバのJenkinsジョブが完了するまで待機して、成否などの情報を返す

一方、できないことは以下の通りです。
  • 認証付きのJenkinsサーバには対応していません
  • このスクリプトでビルドしたジョブの成果物を取得するとかも特にやってません
  • その他いろいろ未対応

いやそもそもさぁ……

Q:普通に Remote access API とか Parameterized Remote Trigger Plugin とかあるよね?
A:うん。

確かに便利なプラグインやライブラリは存在していて、最初はRemote Trigger Pluginを使おうと考えていました。
が、こいつの出力があまり充実しておらず、特にビルドした別サーバのJenkinsジョブのURLが出てこないのがちょっとマズかったので自作することにしました。
(設定いじると出てくるのであれば乗り換えたいですが。)

自作するにしても、なるべく簡単に作りたかったので単にRemote access APIをシェルから叩くつもりでしたが、レスポンスのパースとかが面倒くさそうだった大変そうだったのでPythonで実装しています。

実装方針とか

そもそも複数サーバのJenkinsを連携させようと考えたきっかけが、会社で動かしてるCI環境のせいだったりします。
現状が、
  • プロダクトビルド用のJenkinsがある
  • デグレードの検出に直前のバージョンとの返却値比較をしたい
  • ただし、デグレードのチェックは最近構築したJenkinsサーバでやりたい
    • ビルド用サーバは共有していてあまりいじりたくないので
  • ビルドジョブはそのままビルド用サーバ上で動かしたい
  • チェックが失敗したら、プロダクトのビルドも失敗させたい
  • 成否によらず、プロダクトのビルド結果からチェックのビルドを参照したい
という感じなので、複数サーバの連携が必要だと考えました。

今回の要件としては、
  • python2.7で動く
  • pip installはNG
  • ビルドしたジョブが終わるのを待機できる
  • ビルドしたジョブのURLを出力する
  • できれば1ファイル
というところでしょうか。

JenkinsのREST APIを色々試していると、
  1. 対象ジョブのビルド開始
    1. ${JOBNAME}/buildWithParameters を叩く
  2. ビルドキューの状態確認
    1. ${JOBNAME}/buildWithParameters のレスポンスについてくるLocationヘッダに対象ビルドに関するキューのステータス取得用パスが入ってる(実際には、api/jsonなどを末尾に付与する必要はありますが)
    2. JSONの場合、ステータスとして取得したオブジェクトにexecutableフィールドが存在しない間はキューで待ち状態になっているようなので、返ってくるまで定期的にポーリング
    3. executableフィールドが返ってきたら、中のurlを使ってビルド自体の進捗をチェック
  3. ビルド自体の状態確認
    1. キューの状態確認で取れたexecutableフィールドのurlにアクセスすると、ビルドの状態が取れる
    2. ビルドが完了していない間は、取得したオブジェクトのresultフィールドがnullになっているので、これまた定期的にポーリング
    3. null以外になったら、入っている文字列が最終的なビルド結果
という感じで必要な情報は全部取れそうなので、この流れで実装すれば大丈夫そうです。

そして実装したソースコード全体は以下の通りです。
会社で動かすものはいろいろな事情で制約がつきやすいと思いますので、そういう時に活用していただけると良いかと思います。

0 件のコメント:

コメントを投稿