JenkinsでFindBugsを実行するまでの環境設定

Jenkinsを導入したので、FindBugsを使ってソースコードを静的解析し、潜在的なバグの可能性のある箇所を指摘してもらうまでの手順です。

インストール環境

今回のサーバ環境は、以下のとおりです。

$ less /etc/redhat-release
CentOS release 5.8 (Final)

Antをインストール

Apache Ant - Binary Distributions から最新版をダウンロードして転送するか、Jenkinsサーバからwgetでダウンロードします。解凍して /usr/local/ に置きました。

# tar zxfv apache-ant-1.8.4-bin.tar.gz
# mv apache-ant-1.8.4 /usr/local/ant

環境変数の設定

Antの環境変数と、Antにパスを通します。

# vi /etc/profile

以下を追記。

export ANT_HOME=/usr/local/ant
export PATH=$PATH:$ANT_HOME/bin

設定を反映しましょう。

# source /etc/profile

FindBugsをインストール

FindBugs Downloads から最新版をダウンロードしてjenkinsサーバに転送します。解凍して /usr/local/ に置きました。

# tar zxfv findbugs-2.0.1.tar.gz
# mv findbugs-2.0.1 /usr/local/findbugs

環境変数の設定

FindBugs環境変数と、FindBugsにパスを通します。

# vi /etc/profile

以下を追記。

export FINDBUGS_HOME=/usr/local/findbugs
export PATH=$PATH:$FINDBUGS_HOME/bin

設定を反映しましょう。

# source /etc/profile

Antタスクのインストール

$FINDBUGS_HOME/lib/findbugs-ant.jar を $ANT_HOME/lib/にコピーします。

# cp $FINDBUGS_HOME/lib/findbugs-ant.jar $ANT_HOME/lib/

build.xmlを修正

FindBugsのタスクを追加します。この辺はプロジェクトで違ってくるので参考までに例として載せます。
ここでポイントは、auxClasspathに解析が必要ないライブラリを追加しておくことです。pathタグで除外するファイル群を指定して、auxClasspathのrefidに設定しましょう。

<!-- ビルドに必要なファイル群 -->
<path id="build.classpath">
    <fileset dir="lib">
        <include name="*.jar"/>
    </fileset>
    <fileset dir="${build.webinf}/lib">
        <include name="*.jar"/>
    </fileset>
    <fileset dir="/usr/local/tomcat/lib">
        <include name="*.jar"/>
    </fileset>
</path>

<property name="build.OutputDir" value="src/main/webapp/WEB-INF/classes"/>
<property name="build.SourceDir" value="src/main/java"/>

<!-- - - - - - - - - - - - - - - - - -
          findbugsを実行     
   - - - - - - - - - - - - - - - - - -->
<property environment="env" />
<condition property="have.findbugs">
    <and>
        <available classname="edu.umd.cs.findbugs.anttask.FindBugsTask" />
        <available file="${env.FINDBUGS_HOME}" />
    </and>
</condition>
<target name="Findbugs" if="have.findbugs">
    <taskdef name="findbugs" classname="edu.umd.cs.findbugs.anttask.FindBugsTask" />
    <findbugs home="${env.FINDBUGS_HOME}" effort="max" output="xml" outputFile="findbugs.xml" >
        <auxClasspath refid="build.classpath" />
        <sourcePath path="${build.SourceDir}" />
        <class location="${build.OutputDir}" />
    </findbugs>
</target>

プロジェクトの設定

「ビルド後の処理」に「FindBugs警告の集計」を追加します。
https://lh4.googleusercontent.com/-ULu4b9KTvaI/UEYL3JfpotI/AAAAAAAANSE/C1l032ku1m4/s800/01_radiationMap_Config_%255BJenkins%255D.jpg


すると左メニューに「FindBugs警告」が追加されます。
https://lh6.googleusercontent.com/-u2YSL5YXEAk/UEYL3GXXo1I/AAAAAAAANR8/_i3A5FJESnU/s800/02_radiationMap%2520%255BJenkins%255D.jpg


ビルド実行後には、「状態」画面にも「FindBugs警告の推移」グラフが表示されるようになります。
https://lh5.googleusercontent.com/-73c7YmVVx9U/UEYL3AT2pHI/AAAAAAAANSA/ujp2AcuW0M4/s800/03_FindBugs%25E8%25AD%25A6%25E5%2591%258A%25E3%2581%25AE%25E6%258E%25A8%25E7%25A7%25BB%2520%255BJenkins%255D.jpg

まとめ

FindBugsでコードの静的解析結果を視覚的に把握できるようになり、ケアレスミスによるバグを未然に把握し修正することができます。

今までは、各開発環境上で確認する運用だったものが、Jenkinsで実行することで、いつ時点のビルドで、どのような状態であったかを記録することができ、開発者の間で共有できるようになりました。これによって、またひとつ、煩雑な手作業を自動化でき、属人的な作業から開放されますね(・∀・)