Kengo's blog

Technical articles about original projects, JVM, Static Analysis and TypeScript.

Jenkinsプラグイン実装初心者が参考にしたリンク集

未だにJenkins実践入門を読めていないeller86です。入手は来月半ばになるでしょうか。Jenkinsの基本的な使い方は知っているつもりですが、プラグインの実装方法などちょっと突っ込んだ内容も載っているようなので楽しみです。
さてここ2日間ほどJenkinsプラグインの実装方法をキャッチアップしていましたので、その際参考になったリンクを紹介いたします……といっても公式Wikiがほとんどなんですが。ドキュメントが充実しているのはOSSにとって現実化しにくい理想のひとつだと思うので、ただただ感心するのみです。

ざっくり導入

こちらのスライドが参考になりました。

検索エンジン

Googleなどで検索するよりも、公式Wikiの検索を使うほうが精度の高い情報を得られるようです。基本英語です。

どの拡張ポイントを使えばいいか

公式Wikiに拡張ポイントのリストが載っています。また、このリストは使うべき拡張ポイントを選別するのにも役立ちます。

例えば「Jenkinsの設定画面(http://ホスト名/manage)にメニューを追加したい」場合、ページを「manage」で検索するとManagementLinkという拡張ポイントが見つかります。こんな感じで調べるといいでしょう。

サンプルコードがほしい

hpi:createコマンドでサンプルコードが出てきますので、ざっと目を通すと良いでしょう。

また使いたい拡張ポイントが決まっているなら、先述のExtension points - Jenkins - Jenkins Wiki拡張ポイント一覧ページに「この拡張ポイントはこんなプラグインで使われています!」というリストがありますので、こちらを参照すると良さそうです。私はNotifierの実装方法をBacklogプラグインから学びました。

ユニットテストはどう書くか

画面遷移を含め、テストするための環境が用意されています。これはすごい。

Staplerって何ですか

URLとクラスをマッピングするフレームワークのようです。

その他注意点

試行錯誤の結果を備忘録的にまとめています。初心者のまとめなので警戒してご覧ください。

Messagesクラスが見つからない

src/main/resourcesにMessages.propertiesを置いておくことで、target/generated-sources/localizerにクラスが生成されます。
例えばsrc/main/resources/p/k/g/Messages.propertiesを置くと、target/generated-sources/localizer/p/k/g/Messages.javaが生成されます。Messages_ja.propertiesも置いておくといい感じに多言語対応できるかもしれません。

よくわかんないけど期待通りにperform()が呼び出されない、設定画面にチェックボックスが出てこない

src/main/resources以下がきちんと書かれているか確認してください。設定画面に出てくるチェックボックスにチェックを入れないと、(Publisherを継承したような)ほとんど全てのプラグインは実行されないようです。
設定を特に持たないプラグインの場合は、src/main/resources/【パッケージ名】/【クラス名】/config.jellyに以下をコピペすればOKです。Discriptor#getDisplayName()の戻り値をラベルとして持つチェックボックスが作成され、これにチェックを入れることでプラグインが実行されるようになります。

backlog-plugin/src/main/resources/hudson/plugins/backlog/BacklogNotifier/config.jelly at master · jenkinsci/backlog-plugin · GitHub

あとはコンストラクタに@DataBoundConstructorを、Descriptorに@Extensionをつければ大丈夫だと思われます。

hpi:runしたらなぜかHudsonが出てきた

hpi:createで作ったpom.xmlを使ってhpi:runするとHudson(Jenkins氏とはあまり似ていない細身の紳士)が出てきます。
もし気になるなら、pom.xmlに書いてある対応バージョン番号を上げるとJenkinsに変わってくれます。

  <parent>
    <groupId>org.jenkins-ci.plugins</groupId>
    <artifactId>plugin</artifactId>
    <version>1.440</version><!-- which version of Jenkins is this plugin built against? -->
  </parent>

基本的には今自分が使っているJenkinsのバージョンを対応バージョンとすればいいはずです。LTSに合わせるという方法もありそうですが、ユーザーがめちゃめちゃ多いプラグインでもない限り、必要性は薄い気がします。