こんにちは、松田です。
今回はJenkinsを使ってみました。その機能や使い方をご紹介します。
Jenkinsとは
* 継続的インテグレーション:ソフトウェア開発において、ビルドやテストを頻繁に繰り返し行なうことにより問題を早期に発見し、開発の効率化・省力化や納期の短縮を図る手法。特に、専用のツールを用いてこのプロセスを自動化あるいは半自動化し、効率的に実施する方式。[IT用語辞典 e-Wordsから引用]
Jenkinsでできること
Jenkinsはソフトウェア開発時に行う様々な作業を自動化できます。
ビルドの自動化
Jenkinsの最もポピュラーな使い方はビルドの自動化です。
バージョン管理システム(SVNやGit)と連携し、ソースがコミットされたタイミングでビルドが実行されます。
デプロイの自動化
Jenkinsはビルドしたプログラムを開発サーバや本番サーバにデプロイすることができます。
テストの自動化
JenkinsはJUnit等のテストフレームワークを使ったテストができます。
静的コード解析の自動化
JenkinsはCheckstyle、FindBugs、Step Counter等の静的コード解析ができます。
実際にやってみよう
まずはJenkinsのインストールです。JenkinsはWindowsでもLinuxでも動作します。この記事ではCentOS 6.7を例に記述します。
JenkinsはJavaが必要なため、Javaをインストールします。
1 |
yum install java-1.7.0-openjdk |
Jenkinsをインストール・起動します。
1 2 3 4 |
wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.repo rpm --import http://pkg.jenkins-ci.org/redhat/jenkins-ci.org.key yum install jenkins service jenkins start |
起動するとデフォルトでは8080番ポートで立ち上がります。http://サーバのIP:8080/ でアクセスすると以下のようにJenkinsのホーム画面が見えるはずです。
Subversionの用意
Jenkinsはバージョン管理システムと連携しソースのコミットをトリガーとしてビルド等の処理を実行します。
今回はSubversionと連携します。Subversionには以下をコミットしておきます。
【Tax.java】
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
package sample; public class Tax { public String test; public static void main(String[] args) { int price = Integer.parseInt(args[0]); int consumptionTax = calcConsumptionTax(price); System.out.println(consumptionTax); } public static int calcConsumptionTax(int price) { return (int) (price * 0.08); } } |
【TaxTest.java】
1 2 3 4 5 6 7 8 9 10 11 12 |
package sample; import static org.junit.Assert.*; import org.junit.Test; public class TaxTest { @Test public void test() { assertEquals(Tax.calcConsumptionTax(100), 8); assertEquals(Tax.calcConsumptionTax(500), 40); assertEquals(Tax.calcConsumptionTax(1000), 80); } } |
Jenkinsでテスト結果等のグラフを表示するにはAntやMaven等のビルドツールから出力されるレポートが必要になるため、build.xmlにJUnit/Checkstyle/FindBugsの処理を記述しておきます。
【build.xml】
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
<?xml version="1.0" encoding="UTF-8"?> <project name="build" basedir="." default="compile"> <!-- クリーン --> <target name="clean"> <delete dir="./bin" /> </target> <!-- コンパイル --> <target name="compile"> <mkdir dir="./bin/main" /> <javac srcdir="./src/main" destdir="./bin/main" encoding="UTF-8" includeantruntime="false"> </javac> </target> <!-- テストコードコンパイル --> <target name="test-compile"> <mkdir dir="./bin/test" /> <javac srcdir="./src/test" destdir="./bin/test" encoding="UTF-8" includeantruntime="false"> <classpath location="./bin/main" /> <classpath location="./libs/junit-4.10.jar" /> </javac> </target> <!-- JUnitテスト --> <target name="test" depends="compile,test-compile"> <delete dir="./ant/report" /> <mkdir dir="./ant/report" /> <junit fork="yes" haltonfailure="no"> <classpath location="./libs/junit-4.10.jar" /> <classpath location="./bin/test" /> <classpath location="./bin/main" /> <formatter type="xml" /> <batchtest todir="./ant/report"> <fileset dir="./bin/test" /> </batchtest> </junit> </target> <!-- FindBugs --> <taskdef name="findbugs" classname="edu.umd.cs.findbugs.anttask.FindBugsTask" classpath="./ant/findbugs/lib/findbugs-ant.jar" /> <target name="findbugs" depends="compile"> <findbugs home="./ant/findbugs" output="xml" outputFile="./ant/report/findbugs-report.xml"> <sourcePath path="./src/main" /> <class location="./bin/main" /> </findbugs> </target> <!-- CheckStyle --> <taskdef resource="checkstyletask.properties" classpath="./ant/checkstyle/checkstyle-5.5-all.jar" /> <target name="checkstyle"> <checkstyle config="./ant/checkstyle/sun_checks.xml" failOnViolation="false"> <formatter type="xml" tofile="./ant/report/checkstyle_report.xml" /> <fileset dir="./src/main" includes="**/*.java" /> </checkstyle> </target> <target name="all" depends="clean,compile,test-compile,test,findbugs,checkstyle" /> </project> |
Antのインストール
前述の通りAntが必要ですのでインストールします。
1 2 |
yum install ant yum install ant-junit |
ジョブの作成
Jenkinsはジョブという単位で処理が実行されます。それではJenkinsの画面からビルド・テスト・静的コード解析を実行するジョブを作成してみます。
1. 基本設定
- 新規ジョブ作成をクリック
- 任意のジョブ名を入力
- フリースタイル・プロジェクトのビルドにチェック
- OKをクリック
2. ソースコード管理の設定
連携するSubversionの情報を入力します。ローカルモジュールディレクトリはリポジトリからチェックアウトしたファイルが保存されるディレクトリへの相対パスになります。この例では /var/lib/jenkins/jobs/ビルドジョブ/svn に保存されます。
- ソースコード管理でSubversionを選択
- リポジトリURLを入力
- ローカルモジュールディレクトリに./svnを入力
3. ビルドトリガの設定
ジョブの実行タイミングを設定します。
今回はSubversionへコミットされたタイミングで処理を実行したいので、JenkinsからSubversionへ定期的なポーリングを行ってコミットを検知するよう設定します。
ポーリング間隔はcronと似た書式で設定します。(画像の例は毎分)
- SCMでポーリングにチェック
- リスケジュールにポーリング間隔を入力
4. ビルドの設定
ビルド処理にはAnt、Maven、シェルスクリプトが指定できます。今回はAntを選択しbuild.xmlでJavaコードのコンパイル・JUnit・CheckStyle・Findbugsを実行するtargetのallを設定します。
- ビルド手順の追加でAntを追加しallを入力
5. ビルド後の処理の設定
JenkinsはAntによって出力されたJUnitやCheckStyleのレポート(xml)をビルド後に集計してグラフを生成してくれます。
- ビルド後の処理の追加でJUnitテスト結果の集計を追加しレポートのパスを入力
- Checkstyle警告の集計を追加しレポートのパスを入力
- FindBugs警告の集計を追加しレポートのパスを入力
- Step Counterを追加しソースのパスを入力
設定完了
以上で設定は完了です。
Subversionにコミットするとジョブが起動され、Jenkinsサーバにソースがチェックアウトされ、ビルド・JUnitテスト・静的コード解析が実行されます。
確認
Subversionにコミットすると以下のようにclassファイルができていることが確認できました。
Jenkinsの画面ではJUnitテスト結果や静的コード解析の結果がグラフで表示されます。
(今回はあまり変化のないグラフになってしまっています。)
グラフをクリックすると結果の詳細も確認できます。
まとめ
Jenkinsを使うことでソースをコミットするだけでビルド/テスト/静的コード解析が自動で実行され、結果もグラフで確認できました。
ここまで自動化できるとソースをコミットするのが楽しくなりそうです。今回はご紹介しなかったですが、この他にもSeleniumによるUIテスト自動化、JaCoCoによるテストカバレッジレポート取得の自動化、バグトラッキングシステムとの連携など、様々な自動化ができるようです。
開発現場でビルドやテストの作業を手動で行っていて手間だと感じている方は、Jenkinsを導入してみてはいかがでしょうか。