2013-08-30

Jenkinsのプラグインを作ってみる。(Redmine Build Notifier Plugin)


今回は、夏休みの自由研究?で、Jenkinsプラグインの作成をしてみたお話です。
すでに似たようなプラグイン、高機能なプラグインがありますが、ご興味を持っていただけたら、ソース/バイナリを評価いただけると幸いです。

ちょっと長いので、見出しのみ先に書かせていただきます。
  • プラグイン作成の背景
  • IntelliJさん、出番です!
  • GitHubに上げてみました!
  • DEV@cloudを使ってみました!
  • 今回のまとめ

プラグイン作成の背景


ただいまお仕事にて、DBのちょっとしたデータ変換作業をしています。

ただし、一気に作業するのではなくて、対象を決めて『今日はこの範囲の作業するよー』という感じで処理しています。また、作業に関しては、Redmineにチケットを作成し、『この範囲を処理、作業者はxxx、終了はxx時、変換結果はxxx』という情報を記録しています。

この変換処理ですが、ある程度定型化できるため、Jenkinsのジョブとして作成しています。たとえば、こんな感じです。

  • 切り戻しのためのデータのバックアップ
  • テスト(テストサーバ&ロールバックを使った、ある意味Dry Run) 用の処理
  • 実行記録の書き出し
  • 作業範囲を切り替えできるように、ジョブのパラメータ化
  • ビルドパラメータ-> シェル -> ストアドプロシージャの変数という形で処理
  • バックアップ用データファイル、変換前後の差分レポートを成果物として保存
この方法はなかなか上手く行っており、チケットとビルドの間には非常に関連性が高いのですが、『リポジトリにソースをコミットしたら処理が走る』タイプではありません。
このため、Jenkins Redmine Plugin や、Redmine Hudson Plugin を利用してのチケットとジョブの自動関連付けができず、数回ジョブのURLと結果をRedmineのチケットに手で貼付けて、記録を残していました

でも、人がWebから入力するので、間違いもあったりしますし、証跡とするにもちょっと説得力が弱いです。

No Ticket, No Commit. / No Ticket, No Work. ならぬ、No Ticket, No Build. な利用シーンが多いので、できれば自動で連携して欲しいところ...。

なんとか自動で結果をRedmine側にリンクさせたい、できればジョブの実行者や実行時間、成果物へのリンクはチケットに勝手に貼付けたい...という思いは前々からあったので、最初はシェルからRedmineのREST APIを叩いてPOSTしようかと考えました。

ですが、この方法だと、別なジョブには応用しにくくなります。ジョブのcopyをすれば良いのですが、Windows Slave上で動かす場合は利用できません.....(><)

ということで、Jenkinsのプラグインとして作れないか...?と考えた次第です。

IntelliJさん、出番です!


とは言え、私にとってはあこがれのJenkinsのプラグイン...。
ずっと前から、いつか作ってみたいなと思っていましたが、そんなスキルはありません。

そうこうしているうちに、Jenkinsの活用やプラグイン作成されたみなさんの情報が増えてきて、『もしかしたら作れる?』という淡い期待を抱くようになりました。

こちらを参考にやってみると、プラグインのひな形作成は、思った以上に簡単....。
わたしのやったことなんて、settings.xml と pom.xmlの作成くらいじゃなかろうか、という感じです....。

その上で、幸運にもIntelliJを使える機会がやってきたので、何はともあれMaven Projectとしてインポートし、サンプルのHello Worldを修正していくことから始めました。

やっとIntelliJらしい使い方が!

コマンドライン & Viでの作業と違って、Jenkins本体のソースも全部参照できる& デバッグできるので、Javaもフレームワークもよくわかっていないわたしでも、変数を頼りになんとか『この辺り変えればいいのかも』という見当を付けることができました。

あとは、近そうな動作をするプラグインのソースを眺めて、(恥ずかしながら)コピペと修正を実施。

一番問題のRedmineにPOSTをする処理は、自分でHTTPの処理を実装しないといけないかな〜と悩んでいたところ、Redmine Java APIなるものを発見し、これに乗っかることにしました(^^;

#ちなみに、すでにあるJenkins Redmine Pluginも、だいぶ機能がアップしているのですが、上記のRedmine Java APIを利用していました。


GitHubに上げてみました!

まさに皆さんのおかげで、それなりに使えそうな形になってきたので、GitHubにソースをアップ。わたしにとっては初Javaなリポジトリです。

とは言え、やっぱりこうした類いはどんな使い方をするのかイメージしてもらうのが重要。Wikiにもキャプチャをアップ&怪しい英語で説明文を付けていきました。
(本当に、名前からして『ズバリ』な機能を持っているなら、説明は少なくて済むのでしょうけれど...)

Post Build Taskに追加されました!

ビルド側からRedmineチケットへのリンクが出来ました!
Redmineへも簡単な結果をPOSTできました!


ここで考えたのが、『果たして自分のローカルの環境、IntelliJ以外でビルドできるのか?』ということでした。Redmineのプラグインについては、r-labsの方のご好意で、Jenkinsを使ってのテストをさせていただいているのですが、今回はJavaなので、全く別の環境のほうが良い気がしました。

かつ、奥様のお財布にも優しいビルド環境が欲しい...。

そこで、DEV@cloud (CloudBeesのJenkins)を利用してみることにしました。

DEV@cloudを使ってみました!

実は、1年くらい前にアカウントを作成し、Jenkinsのサービスは利用登録をしていたのですが、適当なビルドが思いつかず、活用できていませんでした....。

久しぶりにログインすると、サービスが増えているし、UIもドキュメントもだいぶ変わっていました。わたし専用のJenkinsは、1年の眠りから覚めるのにちょっとの時間を要しましたが、問題なく起動。

Maven Projectとしてジョブを作成し、GitHubのリポジトリの指定と、mvn clean install を指定するといった、ほんの少しの作業で、いよいよビルド実行...。

ビルドできましたー! on DEV@cloud

WARNINGが出たものの、めでたく *.hpi 形式のバイナリが作成されました!

なお、CloudBeesのサービスでは、GitリポジトリやMaven リポジトリも提供されているので、ビルドの成果物をそちらにアップできるようになっていました。

Maven Repositoryの設定画面。アクセス制限が設定できます。

ブラウザ & DAVからアクセス可能になっています。
さて、Jenkins CI利用のフリープランは、300分/月となっています。気がつかなかったものの、設定のミスとか、DEV@cloud専用のプラグインを試しているうち、50分くらい使っちゃっていました。

300分なんてもしかしてすぐかも....と不安になったのですが、実はCloudBeesの環境を利用した、BuildHiveというサービスがリリースされており、オープンソースならこっちも使えることが分かりました!

今回のまとめ


プライベートではありますが、プラグインリストに自分の作ったものが上がってくると、感無量です。

IntelliJを使った点で良かったことの一つが、日本語のメッセージプロパティファイルの編集がしやすかったことです。このおかげで、ついでに表示も日本語/(怪しい)英語の両方サポートしてしまう気力が出ました。(以前にこの手のファイルをいじってた頃は、native2asiiでの変換をかけないといけなかったのです)

また、UIについては、Jenkinsとして統一感を持ったヘルプの作成がしやすいのにビックリでした。(Jenkinsのヘルプの出し方は気に入っていて、Redmineのプラグイン作成時にもちょっと参考にさせていただいてます)

このあたり、もう少し上手くお伝えできれば良いのですが、ひとまずこの辺で。

0 件のコメント:

コメントを投稿