MENU閉じる

HEXA BLOG

その他

HEXA BLOGその他2015.7.16

Jenkinsでのビルドパイプライン構築~構築編02 REST APIを使ってレスポンスを良くしよう

どーも
周りはすっかり夏って感じでピーカン照りな日々が続いていますね
しかしそんな中、スポーツする時以外は年がら年中長袖なノブが通ります

 

さて、今回もJenkinsを用いた運用を記載させていただきます。
前回までで基本的なJenkinのビルドパイプラインを構築しました。
ビルドが失敗するとメールで失敗通知が飛んでくるようにはデフォルトで設定できますが
もっとビルド失敗に対するサイクルを早くするための工夫をしていこうと思います

 

社内ではChatworkというメッセンジャーツールで情報共有を行っております。
Chatworkにも申請が必要ですが、APIが用意されており
API経由でメッセージを送ることができます。

 

JenkinsにもChatWork Pluginが用意されており、
「失敗した時」「成功した時」「不安定なとき」など
ジョブごとに選択して任意のメッセージを送る事ができます。

 

しかし、社内から以下のような要望が挙がってきたらどうしましょうか?
「成功した時は通知はいらないけど、失敗した時は通知がほしい」
「失敗から成功に戻った時は通知がほしい」
プラグインでは痒いところに手が届かない場合があります

 

そういった時に便利なのがJenkin REST APIです
実はJenkinsにもAPIが用意されています。
ジョブの状態、ダッシュボードの状態をXML、json、Python形式でデータを取得できます。

 

取得方法は簡単で
[JenkinsのURL]/api/[取得するデータ形式]
[JenkinsのURL]/[ジョブ名]/api/[取得するデータ形式]
でアクセスできます。
例)JenkinsのURLがlocalhost:8080の場合
・ダッシュボードの状態をPython形式で取得するには
localhost:8080/api/python

 

・「BuildJob」というジョブの状態をPython形式で取得するには
localhost:8080/BuildJob/api/python
でそれぞれ取得できます。

 

ということでこれを利用して、
「成功した時は通知はいらないけど、失敗した時は通知がほしい」
「失敗から成功に戻った時は通知がほしい」
というスクリプトをPythonで作ってみましょう

 

・JobStateCheck.py 

import urllib
import urllib.request
import sys

# 引数獲得
param = sys.argv

# アドレスを獲得
APIURL = param[1]

# REST APIでJenkinsのステートをPythonの連想配列を獲得
with urllib.request.urlopen(APIURL) as response:
	jenkinsState= eval(response.read())

# メッセージを設定
message = "";

# 失敗ビルドが読み取れなければ安定している
if jenkinsState["lastUnsuccessfulBuild"] == None:
	message = "ビルドは安定しています"
# 最新ビルドは失敗している
elif jenkinsState["lastBuild"]["number"] == jenkinsState["lastUnsuccessfulBuild"]["number"]:
	message = "ビルドエラーが発生しました"
# エラー状態から復帰している
elif jenkinsState["lastBuild"]["number"] - 1 == jenkinsState["lastUnsuccessfulBuild"]["number"]:
	message = "ビルドは復帰しました"
# それ以外なら安定している
else:
	message = "ビルドは安定しています"

# メッセージを出力してみる
print(message)

# メッセージをRESTAPIでポストする
# やり方は様々だと思うのでここは適宜変えてみてください
# urllib.parse.quote_plus(message, encoding="utf-8")などを使用してmessageをURL化する必要があります。
REQUEST_CHATWORK = "[Chatwork APIのURL]"+urllib.parse.quote_plus(message, encoding="utf-8")

ret = urllib.request.Request(REQUEST_CHATWORK)
with urllib.request.urlopen(ret) as response:
	response.read()

いかがでしょうか?
意外と簡単にできます。
あとは既にだっちが紹介しているParameterized Trigger pluginを使って、URLを引数として渡してあげれば
汎用的なPythonスクリプトとして使えるのではないのでしょうか?

 

例)
①ジョブの状態を確認する「BuildStateCheck」ジョブへパラメーターを渡す
20150716_00param

 

②「BuildStateCheck」ジョブで状態を監視する先ほど作った「JobStateCheck.py」を呼び出す
20150716_01param

 

こういった形でちょっとしたコードで、
成果物の状態や周知度を上げることができます。

 

良かったらそういった運用をしてみてはいかがでしょうか?

 

ではまた~

RECRUIT

大阪・東京共にスタッフを募集しています。
特にキャリア採用のプログラマー・アーティストに興味がある方は下のボタンをクリックしてください

RECRUIT SITE