特にほかのCIサーバを使ったことないけど(!?)、なんで自分がJenkinsを好んで使うのか、考えてみた。
好きなところ
使い慣れているから
身も蓋もないけどこれが一番でかい。
開発サーバを表に出せないから
確かにGitHubとかでリポジトリ作ってると、そのまんまネット上で完結できるCIサーバが素敵に見えるのかもしれないですが、だいたいの人の仕事は、開発サーバをネットの世界に出せないというのが多いんじゃないでしょうか。
好きなマシンにインストールできるCIサーバしか選べないのです…。
フリーだから
サーバソフトウェアがフリーなのは大事。
だってフリーなら構築したJenkinsをどこにコピーしまくたって、誰にも文句言われないし、ライセンス管理も確認も一切いらない。
これはJenkinsに限らずフリーなソフトウェアが取り回しという点において値段以上の価値があるということを意味します。
プロプラなツールに縛られて、ビルドのためにどっかの端末のGUIのIDEを立ち上げさせられてボタンを押さないとビルドできないなんてハメにあった人は頷けると思うなあ。
ただ、Photoshopなどの末端のオーサリングツールは、特にそこまでフリーである必要も感じず。
Javaで動いているから
それ一本入れれば済むぐらい依存性がすっきりしているJavaが私は大好きです。
Jettyでスタンドアロンで動くのも好きです。
Webで共有できるから
これJenkinsが特にどうこういう話じゃないですが、CIサーバの大きな特徴として、ビルドの結果やワークスペース、コンソールログなどなにも工夫しなくても、URL一つでそのまんまWebでみんなで共有できるという利点があります。
で、共有したブツがブラウザでそのまんま動いて、ビジュアルであればあるほど、みんなよく見てくれるようになります。
どっかの端末で黒魔術ビルドするのとは大違いですねー。
プラグインいっぱいある
プラグインいっぱいあって選ぶのが楽しい。
と思ってたんですけど、やっぱりあの量( https://wiki.jenkins-ci.org/display/JENKINS/Plugins )はずっと上から見ていくの、つらい。
最終的に泥臭いやり方にドリルダウンして、どうとでもできる感がある
ビルドをうまく抽象化してくれるナイスなCIもいいんですけど、個人的にはうまくできないことをやる方法がきちんと用意されている方が安心できます。
Jenkinsの親マシンの首根っこひっつかんでいるので、やりたいことありゃ、最悪Jenkins上でシェルスクリプト動かしゃいいぐらいのいい加減さが好きですね。
SSHでJenkinsサーバにログインしてEmacsでワークスペースをビシバシ書き換えるぐらいの緩さで戦ってます。
DBがない
JenkinsはJENKINS_HOMEが指すディレクトリに設定を永続化するので、あんまり色々考えなくてよくて楽。
嫌いなところ
あんまりない。Jenkinsにはいっぱい感謝してる。
たまに致命的に不安定だったりした
1.5.17の周辺だったかな、なんかアップデートするごとにある機能(BuildPipelinePluginとか、ファイル指紋登録とか)が動かなくなったりとかあってかなり焦りました。
普通に考えれば、ちゃんとバージョンの切り戻しとかバージョン移行の検証考えろよってことだと思いますが、その通りです(涙)。
あそこらへんで新規参入した人は欲しい機能が動かなくて逃げちゃったりしなかったか心配。
ゆるーく保守フェーズにいずれか移行する開発にJenkins入れたい人は、適当に安定してそうなバージョンでアップデートとめていいと思います。
2014/03/18 追記:良心のある人はLTS版を使いましょう。LTS版を渡り歩きましょう。
悩むところ
ここに書いてないような、しょーもないことで、いっぱい悩みました。
これはJenkinsのプラグインでやるべきか、ビルドスクリプトを作成してやるべきか?
多種多様のJenkinsのプラグインが提供されていて、それが提供されていなければビルドスクリプト書いてやってただろうなーっていうのもプラグインで処理できたりするんですが、まあプラグインも、なにがしかの特定のファイルを処理するとかなら処理してくれるけど、ここのディレクトリのあるパターンがどうのとか、そういう細かい要求は苦手だなーとか、プラグインを見ているとそういう意識のせめぎあいを感じますね。
もちろん、Checkstyleのグラフを出すとか、そういうビジュアルなことはプラグインじゃないとできないんですけど。
ビルド保存期限
こんなの別に明確な基準なんかないと思うので、最初は一律30個保存にしておき、後悩んだら個別設定とかでもいいと思います。*1
際限なく増えるジョブの種類
なんかいろいろ状況にあわせて適当にジョブ作ってるといつのまにか50越えて、気づくと100越え始めるんですね。
そうなってくると作った本人しかどのジョブがなにをしている、的なことがわからないわけですね。引き継ぎが大変です。
そこらへんのまとめ方、あるいは需要が少なくなったジョブのリストラ方法とか悩みますね。
とりあえずそのジョブが何をしているのか、ジョブの説明欄にいろいろ書いておくのは有効ですが、全体的なカテゴライズとか見せ方、っていうのがうまい具合になんかないかなーって感じます。
(タブわけとか、たぶんやり方いろいろあるけど うーん…)
ビルドパイプラインの組み方
本人なりの価値観が育つまで、最初はかなり悩むと思います。
一つのジョブの中でいろいろやらせるか、徹底的にバラすか。
私はバラす派になりました。ジョブ間はClone Workspace SCM PluginとかCopy Artifact Pluginで必要なファイルを受け渡します。
大事なのは、そこにいる人達にとって、わかりやすくて便利なのが、正しいということです。
まとめ
Jenkinsはこれからも使い続けていくと思う。(小並感)
*1:巨大ファイル成果物保存除く