― Web Technology and Life ―

PerlのUkigumoでCIをはじめようとしてみた

2011-10-22
UkigumoというPerl製の継続的インテグレーション環境構築ツールをさわってみた話。継続的インテグレーションはなかなか重要だし、Ukigumoをきっかけに、継続的インテグレーションを導入するものいいかもですね。

はじめに

最近ちょっとTwitterのタイムラインでやたらとUkigumoって見かけて、このデモサーバみてたら、「あぁ、dotcloud使うなんかねー。」ぐらいに思っていたんだけど、なんかtokuhiromさんのYAPC::Asiaのプレゼンリストみてたら、# 20111015 Ukigumoっていうのがあって、「こんな発表なかったなー」とみていたら、またTwitterのタイムライン上でUkigumoと一緒に「CI」って言葉出てきて、「うーん、Ukigumoといい、CIといい何なんだー!」といろいろ調べてみようとと思ったのが、この記事を書くに至った経緯です。

そもそもCIとは

使うきっかけとなった「CI」ですが、ググったら以下のように出てきました。

CIサーバー

CIサーバーとは、CI(継続的インテグレーション)を実行するためのサーバーのことである。CIサーバーの主な役割として「ビルド」と「テスト」がある。これらを自動化することによって、開発の効率的が促進できる。CIサーバーの構築には多くの技術を必要とする。多種多様なツールをどのように組み合わせて利用するかを、開発プロジェクトに合わせて選択することが、CIサーバーを有効に活用するために必要となる。 CIサーバーとは 「CIサーバ」 (Continuous Integration Server): - IT用語辞典バイナリ

「なるほど。しかし、継続的インテグレーションってなんぞや?」と思ったので、さらにリンクを飛んでみました。

継続的インテグレーション

継続的インテグレーションとは、ソフトウェア開発手法において、プロジェクトメンバーがそれぞれ開発した結果を頻繁に結合し、定期的にビルドやテストを行うことである。問題点を早期に摘出することができ、効率的な開発に役立つ。

不具合は早く見つける方が対策費用が抑えられるため、ソフトウェアのビルドを頻繁に行うのが好ましく、ビルド結果が正しいことを検証するためにすぐにテストを行う。このような手続きは出来る限り自動化するのが好ましい。そのため、継続的インテグレーションを実践するためには、結合のためのビルドとテストの自動化のために「CIサーバー」などと呼ばれる専用コンピュータを用意することが推奨されている。

ちなみに、ソフトウェア開発手法のひとつである「エクストリームプログラミング」では、継続的インテグレーションは実践すべきこととされている。 継続的インテグレーションとは 「継続インテグレーション」 (Continuous Integration): - IT用語辞典バイナリ

【まとめ】CIサーバーとは

「おぉ、なんかSIer的な感じで難しい・・・」と思いましたが、一応以上を整理すると次のようになります。

  • 複数人開発時に使用する便利ツール
  • 定期的にビルド/テストを繰り返す用途
  • バグや不整合を早期発見可能で効率的な開発ができるメリット
  • ツールだから完全自動化されて実践可能
  • 普通はたくさんの技術を組み合わせて構築しなくてはいけない

うーん、なんか良さげだけど、めんどくさそうですね。

Ukigumoとは

とりあえず、上述の継続的インテグレーションするためにサーバーを作る一式を提供してくれているもののようです。Perlに限って言えば、複数人で開発するとき、「専用のテストサーバー用意して、cronで定期的にテストサーバーでproveすれば、とりあえず、個々人は個々人が書いたコードのテストだけしながら開発して、さくさく行こう。そんで、Ukigumo使えばそれが楽チン」ってことだと思います。私自身も「そんな感じなのちょうどcronでproveしていたので、ちょっといいかも」という思ってさぁいざ実践。

Ukigumoを使ってみる

「ふむふむ、どうやらとてもいいツールのようだ」ということが分かったところで、実際に使ってみようと思ったのですが、CPANをみてもUkigumo::Cleintというのはあるんですが、肝心のCIサーバー用のUkigumo::Serverがありません・・・。じゃあ、githubかなということでみてみたら、ありました。Ukigumo::Server

今までの調査によれば、CIサーバーを利用するには以下のことをしなくてはけなさそうで、それぞれ()のツールで実現できそうです。

  • CIサーバーの構築(Ukigumo::Server)
  • CIサーバーにプロジェクトを登録(Ukigumo::Client+cron or 独自実装)
  • CIサーバーで定期的にビルド/テストする設定(Ukigumo::Client+cron or 独自実装)

【Step1】CIサーバーの構築 ~Ukigumo::Serverのインストールと実践~

とりあえず、一般的な方法でオッケで、以下のように行けばサーバーはできます。

git clone https://github.com/ukigumo/Ukigumo-Server
cpanm --installdeps . #最近はcpanmということで
plackup

これで、tokuhiromさんのUkigumoのdemoサーバーと同じような物が出来ました。

【Step2.1】CIサーバーにプロジェクトを登録しCIの実践 ~Ukigumo::Clientのインストールと実践~

Ukigumo::ClientはCPANにあったのでさくっとインストールです。ちなみに、CPANにはUkigumoというものがありますが、Ukigumo::Clientのほうが更新日が新しいし、内容物はほぼ同じなので、2011-10-22現時点ではUkigumo::Clientが最新だと思います。まぁ、「Warning!! Under Development!」というところでしょう。

サンプル

環境変数とかパスは適当に読み替えてください。

cpanm Ukigumo::Client
crontab -e #「Ukigumo::Clientの実行スクリプトの登録」参照
#cronによるUkigumo::Clientの実行スクリプトの登録

# m h  dom mon dow   command
MAILTO="user@example.com"
SHELL=/usr/bin/zsh
PATH=/home/hirobanex/perl5/perlbrew/bin:
PERL5LIB=./lib

0 2,8,14,20 * * * /home/hirobanex/perl5/perlbrew/perls/current/bin/ukigumo-client.pl --repos=git@localhost:repos/MyApp.git --server_url=http://localhost:5000 --workdir=MyApp

解説とか

Ukigumo::Clientにはukigumo-client.plというのがついているので、これを使うと、find_or_create的な感じで「プロジェクトの登録」、「ビルド/テストの実行」ができるみたいです。ソースみてそれと同じような使い方でよければukigumo-client.plを利用して、ちょっと変えたければ(エラーの場合は、Ikachaに飛ばすんじゃなくてとりあえずメールで、とか)、ukigumo-client.plを参考に自分で書けばいいみたいですね。もちろん、CIは「継続的」なので、この実行スクリプトの実行はcronに登録する必要があるみたいです。「サンプル」では1日4回「ビルド/テストの実行」をしています。アクティブなプロジェクトなら、数を増やして、あまりにアクティブでなければ、1日1回とか減らすのがいいでしょうね。

【Step2.1】CIサーバーにプロジェクトを登録しCIの実践 ~独自実装~

ukigumo-client.plを使わずに、Ukigumo::Client経由で独自実装していいみたいですが、そうじゃなくてもできるよっていうのが、『ゆるふわ CI サーバー Ukigumo ちゃんのつかいかた、かいたよー』に載っていますね。(なかなかお手軽ですねー、ちょっとしたAPIの利用方法とServer側は実装の参考にもなりますね。)いろいろ環境に合わせてゴニョゴニョやる必要のある人は、まずはお手軽にコチラで実践という感じでしょうか。まぁ、特にこだわりがなければ、ukigumo-client.plとかっぽくやるのがわかりやすくていいんじゃないかなーと思いました。

最後に ~PerlにおけるCIはMakefile.PLの管理とか重要~

まぁ、当然のことででしょうが。私は、このあたりは適当にやっているのですが(テスト環境も本番もperbrewを使って、テスト環境のユーザー名と本番環境のユーザー名を同じにすればdeployはperl5をコピーすれば依存モジュールの問題はだいたい解決)、Cartonとか、『OrePANとcpanmでCPANの部分ミラーを作ってCPANモジュールを管理する』とかで、しっかりとMakefile.PLとか依存モジュールとかを管理しないと、CIの実践は難しそうですねー。私は、Makefile.PLとかプロジェクト毎に作っていなかったし、まぁまずは、Makefile.PLを管理する習慣と、依存管理ツール決め(CartonにしようかOrePANにしようか)から、はじめようということで、それまでUkigumo::ServerがCPANにあがっていたらいいなーという感じです!

なお、Ukigumo::ServerはAmon2で書かれているから、実装の参考にもなってとてもいいですね!あと、Serverの方は好きなように編集すればいいから、プロジェクト別のドキュメントをここに突っ込んでもいいかもしれないですねー。あと、「CIって実はふんふん」とか上述した内容に変なところとかなんか注意したほうがいいこととかがあったら、ぜひぜひ、誰でもいつでもお気軽に、@hirobanexとかでご指摘くださいー。Have a nice ci.

Perl update_at : 2011-10-22T19:17:56
hirobanex.netの更新情報の取得
 RSSリーダーで購読する   
blog comments powered by Disqus