Ant,Jenkins,Sonarの導入手順

提供:Software Development Memo
2012年2月12日 (日) 10:11時点におけるAdmin (トーク | 投稿記録)による版 (→‎更新履歴)
ナビゲーションに移動 検索に移動


本ページでは、Javaソフトウェア管理ツール群である、Ant・Jenkins・Sonarの導入手順を記述します。Maven,Jenkins,Sonarの導入手順と異なるのは、ビルドツールにMavenではなくAntを使用している点です。

Mavenは、ディレクトリ構成といった各種ルールが予め定義されているため、標準に従えばビルド作業が効率よく行える反面、自由度が低いため融通が利かないという性質があります。Mavenを導入していないプロジェクトに対してSonarによる品質チェックを行いたい場合、Mavenのルールに無理やり適合させて既存の構成を変更してしまうことは得策とは言えません。Sonar 2.6からAntによるビルドでもSonarを使用でるようになりましたので、その手順を記述します。

参考 : Maven,Jenkins,Sonarの導入手順

環境

  • OS : CentOS 5.5
  • Ant : 1.8.2
  • Jenkins : 1.406
  • Sonar : 2.7
  • Tomcat : 7.0.12
  • MySQL : 5.1.54

インストール

Jenkins, Tomcat, MySQLのインストール方法は、Maven,Jenkins,Sonarの導入手順#インストールを参照ください。

Ant

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

$ tar zxvf apache-ant-1.8.2-bin.tar.gz
# mv apache-ant-1.8.2 /usr/local/

Sonar

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

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

Sonar Ant Task

入手先 : http://docs.codehaus.org/display/SONAR/Analyse+with+ANT

上記ページからSonar Ant Taskをダウンロードします。

ダウンロードした「sonar-ant-task-1.0.jar」ファイルを「/usr/local/apache-ant-1.8.2/lib/」に移動します。

設定

Jenkins, Sonar, Tomcat, MySQLのインストール方法は、Maven,Jenkins,Sonarの導入手順#設定を参照ください。

その他

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

export ANT_HOME=/usr/local/apache-ant-1.8.2/

JenkinsがAntのコマンドである「ant」を実行するために、「/usr/local/apache-ant-1.8.2/bin/」をPATHに加えます。

起動

起動方法はMaven,Jenkins,Sonarの導入手順#起動を参照ください。

Sonarの品質管理画面を更新

EclipseでJavaプロジェクトを作成し、Sonarの品質管理画面を更新する場合の手順を記述します。Subversionの使用方法はMaven,Jenkins,Sonarの導入手順#Subversionリポジトリを作成するを参考にしてください。

Javaプロジェクトの作成

Javaプロジェクトのルートディレクトリに「build.xml」ファイルを作成します。ファイルの作成例を以下に示します。

<?xml version="1.0" encoding="UTF-8"?>
<project name="sample" default="compile" basedir="." xmlns:sonar="antlib:org.sonar.ant">
	<description>Sonarサンプル</description>
	<property environment="env" />
	<property name="src" location="src"/>
	<property name="build" location="bin"/>

	<taskdef uri="antlib:org.sonar.ant" resource="org/sonar/ant/antlib.xml">
		<classpath path="${env.ANT_HOME}/lib/sonar-ant-task-1.0.jar" />
	</taskdef>

	<target name="init">
		<tstamp/>
		<mkdir dir="${build}"/>
	</target>

	<target name="compile" depends="init" description="compile the source">
		<javac srcdir="${src}" destdir="${build}" encoding="MS932" />
	</target>

	<target name="sonar" description="analyze project" >
		<sonar:sonar workDir="/tmp/sonar/test00" key="com.example.test00:test00" version="0.1">
			<property key="sonar.jdbc.url" value="jdbc:mysql://${env.SONAR_HOST_NAME}:3306/sonar?useUnicode=true&amp;characterEncoding=utf8" />
			<property key="sonar.jdbc.driverClassName" value="com.mysql.jdbc.Driver" />
			<property key="sonar.jdbc.username" value="sonar" />
			<property key="sonar.jdbc.password" value="sonar" />
			<property key="sonar.host.url" value="http://${env.SONAR_HOST_NAME}:8080/sonar" />
			<property key="sonar.sourceEncoding" value="MS932" />

			<sources>
				<path location="${src}" />
			</sources>

			<property key="sonar.projectName" value="Sonarサンプル" />
			<property key="sonar.dynamicAnalysis" value="false" />
		</sonar:sonar>
	</target>

	<target name="clean" description="clean up" >
		<delete dir="${build}"/>
	</target>
</project>

SonarとMySQLが動作するサーバを環境変数「SONAR_HOST_NAME」から取得します。「SONAR_HOST_NAME」の環境変数を設定します。

export SONAR_HOST_NAME=<HOST_NAME>

動的な値にする必要が無ければ、環境変数による設定でなくホスト名を直接入力しても問題ありません。

今回使用したプロジェクトのエンコードは「UTF-8」でなく「MS932」のため、javacのencoding属性、sonar:sonarのproperty要素に「MS932」の記述を追記しています。

Jenkinsでジョブを設定する

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

Install sonar ant 01.png

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

Install sonar ant 02.png

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

Install sonar ant 03.png

「ビルド実行」を選択すると、ビルドが開始されます。コンソール出力の最後に「Finished: SUCCESS」と表示されていれば、正常に終了しています。

Install sonar ant 04.png

「http://<ホスト名>:8080/sonar」にアクセスすると、「Sonarサンプル」が追加されています。

Install sonar ant 05.png

Install sonar ant 06.png

トラブルシューティング

Sonar実行時に「org.sonar.squid.api.AnalysisException: Got an exception - unexpected char: 0xXXXX」が表示される

ソースコードのエンコーディングが「MS932」の場合、以下のエラーメッセージが表示されることがあります。

sonar:
[sonar:sonar] Apache Ant(TM) version 1.8.2 compiled on December 20 2010
[sonar:sonar] Sonar Ant Task version: 1.0
[sonar:sonar] Loaded from: file:/usr/local/apache-ant-1.8.2/lib/sonar-ant-task-1.0.jar
[sonar:sonar] Sonar work directory: /tmp/sonar/test00
[sonar:sonar] Sonar server: http://127.0.0.1:8080/sonar
[sonar:sonar] Sonar version: 2.7
[sonar:sonar] [INFO]  Database dialect class org.sonar.jpa.dialect.MySql
[sonar:sonar] [INFO]  Execution environment: Ant Apache Ant(TM) version 1.8.2 compiled on December 20 2010
[sonar:sonar] [INFO]  -------------  Analyzing Sonarサンプル
[sonar:sonar] [INFO]  Selected quality profile : [name=Sonar way,language=java]
[sonar:sonar] [INFO]  Compare to previous analysis  (2011-04-16)
[sonar:sonar] [INFO]  Compare over 5 days (2011-04-11, analysis of 2011-04-16 21:02:18.0)
[sonar:sonar] [INFO]  Compare over 30 days (2011-03-17, analysis of 2011-04-16 21:02:18.0)
[sonar:sonar] [INFO]  Configure maven plugins...
[sonar:sonar] [INFO]  Sensor AsynchronousMeasuresSensor...
[sonar:sonar] [INFO]  Sensor AsynchronousMeasuresSensor done: 90 ms
[sonar:sonar] [INFO]  Sensor SquidSensor...
[sonar:sonar] [INFO]  Java AST scan...

BUILD FAILED
/usr/local/jenkins/jobs/sonar-ant-sample/workspace/sonar-ant-sample/build.xml:22: org.sonar.squid.api.AnalysisException: Got an exception - unexpected char: 0xFFFD, file : /usr/local/jenkins/jobs/sonar-ant-sample/workspace/sonar-ant-sample/src/test/Class00.java, line : 6
	at org.sonar.java.ast.CheckstyleAuditListener.addError(CheckstyleAuditListener.java:40)
	at com.puppycrawl.tools.checkstyle.Checker.fireErrors(Checker.java:513)
	at com.puppycrawl.tools.checkstyle.Checker.process(Checker.java:279)
	at org.sonar.java.ast.JavaAstScanner.launchCheckstyleEngine(JavaAstScanner.java:75)
	at org.sonar.java.ast.JavaAstScanner.scanFiles(JavaAstScanner.java:138)
	at org.sonar.plugins.squid.SquidExecutor.scanSources(SquidExecutor.java:166)
	at org.sonar.plugins.squid.SquidExecutor.scan(SquidExecutor.java:87)
	at org.sonar.plugins.squid.SquidSensor.analyzeMainSources(SquidSensor.java:78)
	at org.sonar.plugins.squid.SquidSensor.analyse(SquidSensor.java:62)
	at org.sonar.batch.phases.SensorsExecutor.execute(SensorsExecutor.java:59)
	at org.sonar.batch.phases.Phases.execute(Phases.java:75)
	at org.sonar.batch.ProjectBatch.execute(ProjectBatch.java:55)
	at org.sonar.batch.Batch.analyzeModule(Batch.java:158)
	at org.sonar.batch.Batch.analyzeModules(Batch.java:76)
	at org.sonar.batch.Batch.execute(Batch.java:62)
	at org.sonar.ant.Launcher.executeBatch(Launcher.java:121)
	at org.sonar.ant.Launcher.execute(Launcher.java:60)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at org.sonar.ant.SonarTask.delegateExecution(SonarTask.java:167)
	at org.sonar.ant.SonarTask.execute(SonarTask.java:151)
	at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:291)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106)
	at org.apache.tools.ant.Task.perform(Task.java:348)
	at org.apache.tools.ant.Target.execute(Target.java:390)
	at org.apache.tools.ant.Target.performTasks(Target.java:411)
	at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1399)
	at org.apache.tools.ant.Project.executeTarget(Project.java:1368)
	at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:41)
	at org.apache.tools.ant.Project.executeTargets(Project.java:1251)
	at org.apache.tools.ant.Main.runBuild(Main.java:809)
	at org.apache.tools.ant.Main.startAnt(Main.java:217)
	at org.apache.tools.ant.launch.Launcher.run(Launcher.java:280)
	at org.apache.tools.ant.launch.Launcher.main(Launcher.java:109)

Total time: 6 seconds
Finished: FAILURE

原因は、CheckStyleが文字コードを正しく認識していないためであると想定します。CheckStyleに文字コードを認識させるためには、「build.xml」で「sonar.sourceEncoding」を指定する必要があります。

ちなみに、本エラーはWindows 7でAntビルドを手動で行った時には発生しませんでした。CentOS 5.5の標準文字コードがUTF-8であるので、標準文字コードとソースコードの文字コードが異なる場合に本事象が発生すると想定します。

参考 : Advanced parameters - Sonar

FindBugs指摘項目の文字化けを回避する

FindBugsの日本語向けメッセージファイルである「message_ja.xml」がSHIFT_JISであるためか、Sonarの画面では、FindBugsの指摘項目が文字化けして表示されます。警告箇所をクリックすると、英語で解説が表示されますので大体の問題点は把握できますが、このままでは使いづらいので暫定回避策を記述します。

Sonarのバージョンは2.13前提です。

  • Sonar展開先のFindBugsプラグイン「sonar-findbugs-plugin-2.13.jar」を取得する
    • 例 : /usr/local/sonar-2.13/lib/core-plugins/sonar-findbugs-plugin-2.13.jar
  • sonar-findbugs-plugin-2.13.jar を展開し、FindBugs本体「findbugs-1.3.9.jar」を取得する
  • findbugs-1.3.9.jar を展開し、メッセージファイル「message_ja.xml」の文字コードをSHIFT_JISからUTF-8に変換する
    • 同時に、ルート要素のencordingプロパティを「UTF-8」とする
  • 「sonar-findbugs-plugin-2.13.jar」を作成し直し、元のファイルと置き換える
  • Sonarタスクを再実行する (再実行しないと文字化けしたままです)

少々手間がかかりますが、これで文字化けせずに日本語の指摘項目が表示されます。Sonar側で簡単に回避できる方法が分かれば追記します。

-- 2012年2月12日 (日) 19:10 (JST)

参考

更新履歴