Maven,Jenkins,Sonarの導入手順

提供: Software Development Memo
移動先: 案内検索


本ページでは、Javaソフトウェア管理ツール群である、Maven・Jenkins・Sonarの導入手順を記述します。本ページのゴールは、取り上げる3つのツールを組み合わせることにより、複数人で開発しているソフトウェアの品質をリアルタイムで確認できる環境を得ることです。

Sonarを動作させるには、1GByteを超えるメモリ容量が必要になります。

※MavenでなくAntを使用する場合は、Ant,Jenkins,Sonarの導入手順を参照してください。

環境

  • OS : CentOS 5.5
  • Maven : 3.0.2
  • Jenkins : 1.396
  • Sonar : 2.5
  • Tomcat : 7.0.8
  • MySQL : 5.1.54

APサーバとDBサーバは、パフォーマンスと管理のしやすさの観点から、JenkinsとSonar内蔵されている物を使用せず、TomcatとMySQLを使用します。

インストール

Tomcat

入手先 : http://tomcat.apache.org/

$ tar zxvf apache-tomcat-7.0.8.tar.gz
# mv apache-tomcat-7.0.8 /usr/local/


Maven

入手先 : http://maven.apache.org/

$ tar zxvf apache-maven-3.0.2-bin.tar.gz
# mv apache-maven-3.0.2 /usr/local/

Sonar

入手先 : http://www.sonarsource.com/

$ unzip sonar-2.5.zip
# mv sonar-2.5 /usr/local/

WARファイル生成のために必要なライブラリが不足しているので、ant-nodeps-1.7.0.jarをダウンロードし、「 /usr/local/sonar-2.5/war/apache-ant-1.7.0/lib/」に保存します。

参考 : http://jira.codehaus.org/browse/SONAR-2109

MySQL

入手先 : http://www.mysql.com/

$ tar zxvf mysql-5.1.54.tar.gz
$ cd mysql-5.1.54
$ ./configure
$ make
# make install

Jenkins

入手先 : http://jenkins-ci.org/

# cp jenkins.war /usr/local/apache-tomcat-7.0.8/webapps/

設定

MySQL

ユーザ「mysql」を作成し、DBを初期化します。

# /usr/sbin/useradd mysql
# /usr/local/bin/mysql_install_db --user=mysql

DBを起動し、rootのパスワードを設定します。

# /usr/local/bin/mysqld_safe --user=mysql &
# /usr/local/bin/mysqladmin -u root password <password>

Sonarでアクセスするためのユーザ(sonar)とパスワード(sonar)を作成し、DBを作成します。

# mysql -u root -p
mysql> grant all privileges on *.* to sonar@localhost identified by 'sonar' with grant option;
mysql> create database sonar default character set utf8;

Tomcat

「conf/server.xml」の「Connector」要素に「URIEncoding="UTF-8"」を加えます。

<Connector port="8080" protocol="HTTP/1.1"
           connectionTimeout="20000"
           redirectPort="8443" URIEncoding="UTF-8" />

参考 : http://wiki.jenkins-ci.org/display/JA/Tomcat

Sonar起動時のOutOfMemory発生を防ぐため、Tomcatの起動オプションを追加します。「/etc/bashrc」等に以下を追記します。

export CATALINA_OPTS="-Xms1024m -Xmx1024m -Dorg.apache.jasper.runtime.BodyContentImpl.LIMIT_BUFFER=true -XX:MaxPermSize=256m"

参考 : http://docs.codehaus.org/display/SONAR/Install+Sonar#InstallSonar-Step4Startserver


Sonar

Tomcatで動作させるためのアーカイブファイルである「sonar.war」を作成します。

MySQLを使用するための設定を行います。「conf/sonar.properties」のDerbyの設定をコメントアウトし、MySQL用の設定行のコメントアウトを元に戻します。

Before :

sonar.jdbc.url:                            jdbc:derby://localhost:1527/sonar;create=true
sonar.jdbc.driverClassName:                org.apache.derby.jdbc.ClientDriver
sonar.jdbc.validationQuery:                values(1)

After :

sonar.jdbc.url:                            jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8
sonar.jdbc.driverClassName:                com.mysql.jdbc.Driver
sonar.jdbc.validationQuery:                select 1

WARファイルのビルドを実行します。必ずDB設定の後に実行してください。

# cd /usr/local/sonar-2.5/war/
# ./build-war.sh

ビルド時に以下のエラーが出た場合は、ant-nodeps-1.7.0.jarが「apache-ant-1.7.0/lib/」に存在することを確認してください。

BUILD FAILED
/usr/local/sonar-2.5/war/build.xml:63: Problem: failed to create task or type replaceregexp
Cause: the class org.apache.tools.ant.taskdefs.optional.ReplaceRegExp was not found.
        This looks like one of Ant's optional components.
Action: Check that the appropriate optional JAR exists in
        -/usr/local/sonar-2.5/war/apache-ant-1.7.0/lib
        -/root/.ant/lib
        -a directory added on the command line with the -lib argument

Do not panic, this is a common problem.
The commonest cause is a missing JAR.

This is not a bug; it is a configuration problem

ビルドが正常に終了すると、同一ディレクトリに「sonar.war」が生成されます。これを、Tomcatのwebappsにコピーします。

# cp sonar.war /usr/local/apache-tomcat-7.0.8/webapps/

Maven

MySQLに接続するための設定を行います。

以下を「/usr/local/apache-maven-3.0.2/conf/setting」の「profiles」要素の中に追記します。

<profile>
    <id>sonar</id>
    <activation>
        <activeByDefault>true</activeByDefault>
    </activation>
    <properties>
        <!-- EXAMPLE FOR MYSQL -->
        <sonar.jdbc.url>
          jdbc:mysql://localhost:3306/sonar?useUnicode=true&amp;characterEncoding=utf8
        </sonar.jdbc.url>
        <sonar.jdbc.driver>com.mysql.jdbc.Driver</sonar.jdbc.driver>
        <sonar.jdbc.username>sonar</sonar.jdbc.username>
        <sonar.jdbc.password>sonar</sonar.jdbc.password>

        <!-- SERVER ON A REMOTE HOST -->
        <sonar.host.url>http://<HOST_NAME>:8080/sonar</sonar.host.url>
    </properties>
</profile>

その他

「MAVEN_HOME」「JENKINS_HOME」の環境変数を設定します。

export MAVEN_HOME=/usr/local/apache-maven-3.0.2/
export JENKINS_HOME=/usr/local/jenkins/

JenkinsがMavenのコマンドである「mvn」を実行するために、「/usr/local/apache-maven-3.0.2/bin/」をPATHに加えます。「JENKINS_HOME」直下にJenkinsの作業用ファイルが作成されます。

起動

MySQL

# /usr/local/bin/mysqld_safe --user=mysql &

Tomcat

# /usr/local/apache-tomcat-7.0.8/bin/startup.sh

「http://<ホスト名>:8080/jenkins」でJenkinsのページにアクセスできます。

Install sonar02.png

「http://<ホスト名>:8080/sonar」でSonarのページにアクセスできます。

Install sonar01.png

初期起動時は、Sonar用のDB初期化処理が動くのでページにアクセスできるようになるまでに多少時間がかかります。

Sonarの品質管理画面を更新

Sonar初期起動時は、プロジェクトが何も登録されていません。ここでは、実際にプロジェクト作成する所から、Sonarでソースコードの品質を確認するまでの手順を記述します。ここでの手順はあくまで参考なので、この通りに実行しなくても良いです。

Subversionリポジトリを作成する

Tomcatが動作しているマシンに、Subversionリポジトリを作成します。

# mkdir /var/lib/svn/sonar-sample -p
# svnadmin create .
# svnserve -d --listen-port 8001 -r .

匿名ユーザでもコミットができるように「 /var/lib/svn/sonar-sample/conf/svnserve.conf」を編集します。

Before :

# anon-access = read

After :

anon-access = write

Mavenプロジェクトを作成してコミットする

ここでは、WindowsのEclipse 3.6(Pleades All in One)を使用して、MavenプロジェクトをSubversionにコミットする手順を記述します。

m2eclipseを使用して、Mavenプロジェクトを作成します。m2eclipseが導入されていない場合は、ここから入手してください。

Mavenプロジェクトを作成します。

Install sonar03.png

アーキタイプは適当に選択してください。(画像は省略しています)

値を適当に入力します。

Install sonar04.png

Mavenプロジェクトが作成されます。

Install sonar05.png

Subversionにインポートします。

Install sonar06.png

Install sonar07.png

Install sonar08.png

Install sonar09.png

Install sonar10.png

Install sonar11.png

Install sonar12.png

Jenkinsでジョブを設定する

先ほどコミットしたプロジェクトをジョブとして設定します。

最初に、「Jenkinsの管理」->「システムの設定」からMavenの設定を行います。


次に、「新規ジョブ作成」からジョブを作成します。

Install sonar13.png

「ソースコード管理システム」と「Maven」と「ビルド」の項目を変更します。

Install sonar14.png

Install sonar15.png

Install sonar16.png

「ビルド実行」を選択すると、ビルドが開始されます。

Install sonar17.png

コンソール出力の最後に「Finished: SUCCESS」と表示されていれば、正常に終了しています。

Install sonar18.png

再度、「http://<ホスト名>:8080/sonar」にアクセスると、「sonarsample」が追加されています。

Install sonar19.png

リンクから、ソフトウェア品質の状態が確認できます。

Install sonar20.png


トラブルシューティング

Jenkins実行時、「java.lang.IllegalArgumentException: mavenHome must exists」と表示される

JenkinsでMAVEN_HOMEの設定をしていないと以下のエラーメッセージが表示されます。MAVEN_HOMEの設定をすると正しく処理されます。

ERROR: Processing failed due to a bug in the code. Please report this to jenkinsci-users@googlegroups.com
java.lang.IllegalArgumentException: mavenHome must exists
	at hudson.maven.MavenEmbedderUtils.buildClassRealm(MavenEmbedderUtils.java:74)
	at hudson.maven.MavenEmbedderUtils.getMavenVersion(MavenEmbedderUtils.java:170)
	at hudson.maven.MavenVersionCallable.call(MavenVersionCallable.java:56)
	at hudson.maven.MavenVersionCallable.call(MavenVersionCallable.java:40)
	at hudson.FilePath.act(FilePath.java:785)
	at hudson.maven.MavenModuleSetBuild$RunnerImpl.doRun(MavenModuleSetBuild.java:568)
	at hudson.model.AbstractBuild$AbstractRunner.run(AbstractBuild.java:423)
	at hudson.model.Run.run(Run.java:1362)
	at hudson.maven.MavenModuleSetBuild.run(MavenModuleSetBuild.java:454)
	at hudson.model.ResourceController.execute(ResourceController.java:88)
	at hudson.model.Executor.run(Executor.java:145)
project=hudson.maven.MavenModuleSet@172d762c[sonar_sample]
project.getModules()=[]
project.getRootModule()=null
FATAL: mavenHome must exists
java.lang.IllegalArgumentException: mavenHome must exists
	at hudson.maven.MavenEmbedderUtils.buildClassRealm(MavenEmbedderUtils.java:74)
	at hudson.maven.MavenEmbedderUtils.getMavenVersion(MavenEmbedderUtils.java:170)
	at hudson.maven.MavenVersionCallable.call(MavenVersionCallable.java:56)
	at hudson.maven.MavenVersionCallable.call(MavenVersionCallable.java:40)
	at hudson.FilePath.act(FilePath.java:785)
	at hudson.maven.MavenModuleSetBuild$RunnerImpl.doRun(MavenModuleSetBuild.java:568)
	at hudson.model.AbstractBuild$AbstractRunner.run(AbstractBuild.java:423)
	at hudson.model.Run.run(Run.java:1362)
	at hudson.maven.MavenModuleSetBuild.run(MavenModuleSetBuild.java:454)
	at hudson.model.ResourceController.execute(ResourceController.java:88)
	at hudson.model.Executor.run(Executor.java:145)

※「Jenkins ver. 1.406」のスタックトレースです。

更新履歴