Jenkins X'mas プラグインを改善しました

@kiy0takaさんがバイナリの実用性とソースコードの実用性が素晴らしく乖離したJenkins X'masプラグインを書いてくれました。


このプラグインは非常に簡潔に書かれていながら幾つかのあまり使われない拡張ポイントを使っていて、プラグイン開発者には非常に参考になる逸品に仕上がっています。そこで、Jenkinsコミュニティの互助精神と他人の褌プログラミングの心を紹介するために、またクリスマスにいつもLEGOをリクエストしても嫁さんが買ってくれない僕も、早速pull requestを送って新しい機能を追加してみました。


この変更によって、以下のように、「爆発しろ」のテキストに加えてクリスマス中止のお知らせが表示されます。また、「爆発しろ」はとあるYouTubeビデオへのリンクになります。

このように、最近のバージョンのJenkinsではコンソール出力にマークアップを利用して多くの情報を付加することが可能です。活用してみてください。また、このようにJenkinsプロジェクトではお互いのプラグインをよってたかって改善しあう文化があります。皆さんもぜひ他人の始めたプラグインを改良してみてください。

プラグインを再起動無しでインストールする

今日からJenkins アドベントカレンダー企画が始まります。今日から25日間、コミュニティの皆さんで一日一人一つの記事を順番に書いていくという企画です。そのトップバッターになるこの記事では、今週末登場予定のJenkins 1.442での新機能、「再起動しないでプラグインをインストール」を紹介しようと思います。


後述するように内部的には色々大変なことがあるのですが、ユーザーの方には簡単に使えます。まず、今まで通りにプラグインの管理から一覧を表示し、インストールするプラグインを選びます。画面最下部にスクロールすると「Install without restart」ボタンと「Download now and install after restart」ボタンの2つが出ます。前者が再起動無しでインストールするモードで、後者が今までのように再起動後にインストールをするモードです。暫くしたら後者のボタンは削ってしまってもいいかなと思っています。





左のボタンをクリックするとダウンロード&インストールが始まります。





インストールが完了すると、今までなら再起動するところなのですが、今回からは「Go back to the top page」をクリックしてさっさとトップページに戻ってしまって構いません。インストールしたばかりのプラグインがもう使えるようになっているはずです。簡単でしたね。

アップデートは?

残念ながら、内部的な設計の制約上、この方式を使って既にインストールされたプラグインをアップデートするのは難しいと思います。詳細は内部的な話のところで説明します。

アンインストールは?

同様に、正確な意味でのアンインストールを実現するのも難しいと思います。ですが、ある種の限定的なものなら不可能ではないかもしれないと思っています。既にプラグインが使われているジョブの設定には再起動まで影響を及ぼさないけれども、設定画面には表示されなくなる、みたいな感じで。

内部的な話

歴史を遡ること約400リリース前、1.44でプラグインがサポートされた時からずっと、Jenkinsではプラグインのインストール後には再起動が必要でした。Jenkinsはスタートアップ時にプラグインに対して色々な計算をして、プラグインに関するimmutableなデータ構造を作っていくわけです。このあたりの処理がそもそもは逐次的に書かれていたので、これを動的に実行できるようにするのは結構面倒くさい仕事でした。アップデートセンターを書くとか他にプライオリティの高い作業があって、動的インストールまではなかなか手が回らなかったわけです。


その後Jenkinsの起動速度の改善のために、Jenkinsの初期化を細かいタスクに分解し、その依存関係をトポロジカルソートして並列に実行...みたいな機能が入ってから、追加の初期化タスクを実行するのが現実的になってきました。その時実装しておけばよかったのですが、その後、Guiceを使って内部的にコンポーネントを結線するようになると、動的にコンポーネントを追加するのがまた難しくなってしまったのです。現在のバージョンでは、Guiceのchild injectorを使って追加されたプラグインから貢献された実装をホストするようにしています。これでほとんどのプラグインはごまかされてくれています。


では、なぜアップデートは難しいのでしょうか?Jenkinsの設計では、通常のデータベースアプリケーションとは異なり、モデルオブジェクトはメモリ内に長期間とどまるように設計されているからです。このデザイン自体は自分は気に入っているのですが、欠点の一つとして、動的に定義を変更するのが難しいことになってしまうというわけです。Javaではメモリ上のインスタンスをリロードすることはできないので。なので、これはHAみたいな方向で解決するのがいいのかなと思っています。

まとめ

そんなわけで、内部的には結構頑張ったので、ぜひこれを使って、どんどんプラグインを試してやってください。

プラグインをコミュニティにホストするには

オフラインで質問を受けたのでここに書きます。


公開されているJenkinsのプラグインhttp://github.com/jenkinsci/ にできるだけ集めてメンテしたいと思っています。 これによって、オリジナルの開発者が去っても他の人が開発を継続できますし、コミュニティの他の人が開発に参加するのが容易になるからです。では、どうやってリポジトリを作ったらよいでしょうか。


一つ二つしかプラグインを書く予定がない場合には、メーリングリストGitHub IDとプラグインの名前を言って、既存の開発者に必要な操作をやってもらってください。これが一番簡単です。


他人任せではなく自分で作れるようにするためには、もうちょっと面倒な操作手順を踏む必要があります。でも、これをやってくれる人が一定数以上いないと新しい開発者が困ってしまうので、われこそはと思う人はよろしくお願いします。


GitHubの仕組みでは、リポジトリを作成するには管理者権限が必要なのですが、Jenkinsプロジェクトの「コミュニティに参加する敷居を下げる」のモットーに沿って、誰でもリポジトリを作れるように、JenkinsプロジェクトではIRC上のボットを利用しています。

  • プラグイン開発者はIRCチャンネル #jenkinsにたむろしています。これに参加してください。常駐する必要はありませんが、英語が苦でないならば、常駐していると楽しいと思います。コミュニティに参加する取っ掛かりがより増えます。
  • IRCに参加したら、ニックネームを登録してください。これが認証に使われます。
  • #jenkinsチャンネルで、「I'm a plugin committer and I'd like to have voice to be able to talk to jenkis-admin」とか何とか言って、「ボイス」フラグをもらってください。kohsukeがいればkohsuke宛に送ってもらえればすぐやります。
  • ボイスフラグがつくと、jenkins-adminボットに命令が出来るようになります。コマンド一覧を参照してください。このボット経由で既存のリポジトリをjenkinsci上にフォークしたり、新規のリポジトリを作成できます。


以上で完成です。


ボットを使っている理由は、リポジトリに対する操作がみんなに見えるようにすることでabuseを避けるためなのですが、よく考えると、OAuthかなんかでGitHubと認証すればウェブアプリとしてもできそうですよね。「誰かがあれこれこういう操作をしているよ」という記録がリアルタイムにIRCに送られれば透明性も確保できそうだし。時間があれば書いてみたい気がします。

日本でJenkinsづくしの一週間

JavaOneもようやっと終わり、明日からは日本へ行きます。Jenkins関係の色々な活動づくしの一週間の予定です。

お会いできる方とは、お会いする機会を楽しみにしています。

ひとり勉強会やります!

きょんさんの一人勉強会があまりに楽しそうだったので、それにインスパイアされて、僕もハックセッションをやろうかと思いたちました。


本当は東京のどこかのco-working spaceとかに集まってやって、その後飲みに行きたいのですが、物理的にそれは無理なので、WebExを使ってデスクトップを共有しながら、何かをまったりとハックしようかと思います。ちょうどJenkinsのプラグインをrubyで書けるようにするというプロジェクトが進行中なので、この辺をハックしつつ自分のruby初心者っぷりを公開羞恥プレイ、みたいな感じをやろうかと。ちょうどこないだTravis CIをいじってみたので、ああいうのをささっとJenkinsのプラグインとして実装してみたりとか。ちょっとRuby周りで色々できたらいいなと思っているんです。普段cowboydがやっているのの日本語版というか。


だから勉強会とはちょっと違うような気もしますが、まぁ思いつきのアイディアなんで勘弁してください。


というわけで!


題名:Jenkinsのためのrubyひとり勉強会
内容:Jenkinsをrubyで開発できるようにするべく色々まったりハックします
日時:2011年8月25日(木) 10pmから一時間
会場:Cisco WebEx (ミーティングパスワードはjenkinsです)

内容はtweetしたり後でデスクトップの録画を公開する予定です。

[japan] 日本旅行まとめ

週の前半はトレーニング関係の準備を色々しました。事前の手配はアメリカからやったのですが、やはり現地でないとできないことも色々あります。また、ふと突然資料の一部を日本語に翻訳する気になって何時間かかけたり印刷したりと、自分で余計な仕事を増やした気もします。参加していただいた皆さんには有用だったとよいのですが、ぜひ率直なご感想をお願いします。


2/24はJGGUGのGroovyイベントに参加してきました。Jenkinsの中でどんな風にGroovyを使っているかという話を色々しました。

その後の懇親会では、日本アンドロイドの会の宮田さんに小さな素敵アンドロイドデバイスを見せていただいたり、JRubyの有名人nahiさんとお話させていただいたりしました。自分の中ではまたGroovy熱が盛り上がってきたので、何かぜひやりたいと思っています。


翌日は、Jenkins勉強会です。いつもイベントを組織してくださっているikikkoさんをはじめとする幹事の皆さんには本当に頭が下がります。日本でJenkinsユーザーのコミュニティが育つのもこうした方のおかげであります。


イベント自体は、大阪やはてはドイツからまで参加者が押し寄せ、大盛況でした。


今回も前回も温泉に行きそびれたので、懇親会ではぜひ次回は温泉合宿をやりたいという話をしました。ちょうど次回の訪日は週末にかけられそうな感じなので、自分のスケジュール的には可能かと思っています。高まったGroovy熱を利用して、UIのJellyをGroovyで書けるように、みたいなプロジェクトに挑戦してもいいですし、ローカライゼーション関係の企画というのもありかなと思います。IRC/Twitterか何かを使って合宿参加者とおうちにいる人達とでよってたかって翻訳に挑戦!(か翻訳用のインフラを立てる!)というのはどうでしょうか。後はプラグインの書き方伝授しますとか。


あるいは、Androidの人達を誘ってAndroid+Jenkins関係のハックや情報交換というのも楽しそうだな。うーむ、夢が広がる...。

2/21の週に日本へ行きます。

あちこちで発表などする予定です。

2/22 CloudBees主催のJenkinsトレーニング(一日)
まる一日使って、Hudson Jenkinsの導入から自動テスト・自動コード品質検査など、使い倒し方を伝授します。まだ定員に空きがあるので、ぜひ参加してください。
2/24 JGGUG 第15回 G*ワークショップ
Hudsonではここ数年来Groovyをコアにバンドルして、色々な場面で積極的に活用しています。さらに、その周辺にはGroovyを利用したYouDebugやDroovyなどの関連プロジェクトがゴロゴロしています。このトークでは、こうした利用例を幾つも紹介します。
2/25 第二回Jenkins勉強会
Hudson→Jenkinsの名称に関わる経緯の説明と、あと当初の予定通りSunのJava EE部隊での運用例について説明したいと思っています。

昼間など空いている時間もかなりあるので、うちのJenkinsを見に来てくださいといったような方がいらっしゃればぜひお邪魔させてください。