<~2015>Jenkinsプラグイン開発で迷わないコツ

Jenkinsのプラグインのお話第二弾です。

Jenkinsのプラグイン開発の方法については本家のWikiが詳しいので、ここで全て解説はしません。
ただ、Jenkinsのソースコードは膨大ですので、ある機能を拡張したいときにどういう道筋をたどれば良いか分からなくなってしまうことがあるかと思います。今回は、実際にプラグインを作ったときの進め方を追いながらJenkinsの中を探検する方法を紹介したいと思います。

まず、作りたい機能を決めます。
今回の場合は、「古いビルドの破棄」機能を拡張してステータス指定のオプションを付けられるようにします。また、高度な設定では従来破棄されていた古いビルドに対しても間隔を指定して保存できるようにします。

画像1

では、この機能はどうすれば実現できるのでしょうか?
実際にJenkinsのソースコードで該当部分を見てみたいですが、このままではどこから調べれば良いかがちょっとわかりません。

そんなとき便利な方法は、ブラウザの言語設定を英語にしてみることです。JenkinsのUI上の文言は(多言語化対応されていれば)ブラウザの言語設定に合わせて変化しますので、設定を変えるとメニューの名前も英語になります。

画像2


「古いビルドの破棄」は「Discard Old Builds」になりましたので、これをヒントにソースコードを検索してみます。JenkinsのソースコードはGitHub上で公開されていますので、GitHubの検索機能を使ってみましょう。
検索窓に「Discard Old Builds repo:jenkinsci/jenkins」と入力し、検索対象を「Code」にするとJenkinsのコードの中から該当する箇所を検索することができます。

画像3

多言語化対応用のファイルが続きますが、しばらく見ていくとconfigure.jellyというファイルが見つかります。これが、JenkinsのJOBの設定画面を定義しているファイルです。

画像4

さらに、関連するJavaのコードを探します。少々強引ですが、ここではjellyファイルに書いてあるLogRotatorというのが怪しいのではないかと見当をつけて再度検索してみます。

画像5

それらしいファイルが見つかりましたので、Javaファイル本体を見てみます。確かに、ビルド履歴を削除しているらしきコードが見つかりましたのでこの部分を参考にできることがわかります。

では、この機能をそのまま拡張することは可能なのでしょうか?Jenkinsには拡張ポイントと呼ばれるプラグインで変更可能なポイントがいくつも定義されており、拡張ポイントとなっているクラスはExtensionPointインタフェースを実装しています。今回はどうやら拡張できなさそうということがわかりましたので、全くの別機能として組み込むことにします。

古いビルドの破棄はJobのビルドが終わったタイミングで行えば十分なので、「ビルド後の手順」として組み込むためにRecorderクラスをextendしたクラスを作成します。perform()メソッドで実際にビルドを破棄する処理を行いますが、ここで書く具体的な処理は先程のLogRotatorクラスを参考にすることができます。同様に画面側の処理を書くconfig.jellyも先ほど最初に検索したジョブ画面のconfigure.jellyを参考に作れば一通り動くプラグインの完成です。あとは、文言を多言語化したり単体テスト(重要です!)を書いたりして全体を整え、リリースします。

このように、既存コードや既存のプラグインから似ている処理を見つけることさえできれば後はサクサクとプラグインを作成することができます。

いかがでしたでしょうか?
今後も、このブログでは新しく作成したプラグインやJenkinsのTipsなどを随時お伝えしていきます。

お問合せはお気軽に
https://service.shiftinc.jp/contact/

SHIFTについて(コーポレートサイト)
https://www.shiftinc.jp/

SHIFTのサービスについて(サービスサイト)
https://service.shiftinc.jp/

SHIFTの導入事例
https://service.shiftinc.jp/case/

お役立ち資料はこちら
https://service.shiftinc.jp/resources/

SHIFTの採用情報はこちら
https://recruit.shiftinc.jp/career/