概要
Dead Man's Snitch というシンプルな死活監視サービスをJenkins Jobの監視に使っていて、今まではJobが成功したらcurlで通知するという処理を ./job.sh && curl https://nosnch.in/abcde12345
みたいに書いてたんですが、監視はJobと独立させたかったので、pluginとしてビルドが成功した時にDead Man's Snitchに通知するpluginを作りました。そのプラグインの実装から jenkins-ci.org でホスティングしてもらうまでの道のりです。
結論から言うとけっこう大変でした...w
実装
基本はJava + Mavenです。 JVM系の他の言語やGradleでも出来るっぽいです、たぶん。
Plugin tutorial
まずはこちらを参考にJava, Mavenの環境設定をして雛形のプロジェクトを作ります。HelloPlugin的なプラグインができているはずです。この状態で mvn hip:run
を打てばすぐにローカルでJenkinsが動きます、思ったよりかなりお手軽でした。
ExtentionPoint
Jenkins上の何かしらの処理を拡張するためにhudson.ExtentionPoint
というマーカーインタフェースを実装します。一覧ページを見て分かるように先人たちが色んな処理に対してExtensionPointを実装した抽象クラスを作ってくれているので、何となく自分がやりたいことと同じような処理をやっているPluginのソースコードを読んで真似ることをおすすめします。多すぎて適切な抽象クラスを自分で見つけ出すのは大変なので...
自分の場合はビルド後の通知処理なのでhudson.tasks.Notifier
というクラスを継承して作りました。
Jelly
設定のUIは.jelly
という拡張子のテンプレートエンジンを使います。
基本は上記で作ったExtentionPointのインスタンスが一つのビルドに対しての設定になるっぽいので、インスタンス変数として設定したいフィールドを定義します。で、そのクラスと同じパッケージ構造ディレクトリをsrc/main/resources
に作ってそこにconfig.jellyという名前のファイルを作ると、それがそのプラグインの設定用のUIだと判定されるようです。(もっと詳しいことを知りたい場合は公式で、、Global settingとかHelpの出し方とかi18nについてとか)
リリース
Hosting Request
で、一通り実装が終わったらJenkinsのJIRAのアカウントを作ってHosting Requestというissueを出します。ここでコードレビューとか既存の~~プラグインでも出来るんじゃない的なレビューとかをしてもらいます。自分はRequestを出してから最初の返信が来るまで10日かかったので急いでる人は注意してください。
このリクエストが通ったらこんな感じでPluginのGitHubのレポジトリがForkされて自分のGitHubアカウントがorg: jenkinsci
のメンバーに招待されます。(GitHub以外にレポジトリを置いてた場合どうなるかはよく分かりません)
Wikiを書く
wikiのPluginsのページに自分のpluginのページを作成します。最低限plugin-information
とexcerpt
と、どのカテゴリに属するかのTag付けが必要です。
Release
この状態で、forkされた方のリポジトリをreleaseします。cloneしてローカルでmvn release:prepare release:perform
すればOK。認証情報はJenkins JIRAのものと同じです。
成功したらリリース完了です。ここに自分のプラグインのディレクトリが出来ているはずです。
また、4時間周期でPlugin一覧リストはリフレッシュされるようなので、4時間後にJenkinsのPlugin一覧ページに出ててたらようやく実際Jenkinsにインストールが可能になります。
お疲れ様でした。。!