ant taskでfindbugsを実行する際のRANK設定

findbugsをantで実行する際にeclipse pluginで設定している「Minimum rank to report」の値と合わせる。

findbugs-2.0.0をダウンロード
http://prdownloads.sourceforge.net/findbugs/findbugs-2.0.0.tar.gz?download

build.xmlのfinndbugs定義に「maxRank」を1から20の間で設定する。
(eclipse pluginの初期値は15であったため、15を設定)

<findbugs home="${findbugs.lib.dir}" output="xml"
outputFile="${report.findbugs.dir}/findbugs.xml" maxRank="15">

実行すると結果には影響がないがエラーになった。

findbugs:
    [findbugs] Executing findbugs from ant task
    [findbugs] Running FindBugs...
    [findbugs] java.text.ParseException: Unparseable date: "12/20/2011
09:17 PM EST"
    [findbugs] 	at java.text.DateFormat.parse(DateFormat.java:337)
    [findbugs] 	at edu.umd.cs.findbugs.Version.<clinit>(Version.java:175)
    [findbugs] 	at
edu.umd.cs.findbugs.PluginLoader.init(PluginLoader.java:595)
    [findbugs] 	at
edu.umd.cs.findbugs.PluginLoader.<init>(PluginLoader.java:280)
    [findbugs] 	at
edu.umd.cs.findbugs.PluginLoader.loadCorePlugin(PluginLoader.java:1304)
    [findbugs] 	at
edu.umd.cs.findbugs.PluginLoader.loadInitialPlugins(PluginLoader.java:1259)
    [findbugs] 	at
edu.umd.cs.findbugs.PluginLoader.<clinit>(PluginLoader.java:146)
    [findbugs] 	at
edu.umd.cs.findbugs.DetectorFactoryCollection.getCoreResource(DetectorFactoryCollection.java:360)
    [findbugs] 	at
edu.umd.cs.findbugs.SystemProperties.loadPropertiesFromConfigFile(SystemProperties.java:72)
    [findbugs] 	at
edu.umd.cs.findbugs.SystemProperties.<clinit>(SystemProperties.java:55)
    [findbugs] 	at edu.umd.cs.findbugs.FindBugs2.<clinit>(FindBugs2.java:87)
    [findbugs] Warnings generated: 56
    [findbugs] Calculating exit code...
    [findbugs] Setting 'bugs found' flag (1)
    [findbugs] Exit code set to: 1
    [findbugs] Java Result: 1
    [findbugs] Output saved to C:\eclipse\findbugs/findbugs.xml
BUILD SUCCESSFUL
Total time: 31 seconds

エラーを消すため、最新のソースからjarファイルを作成して入れ替え。

エクスポート。

svn export http://findbugs.googlecode.com/svn/trunk/findbugs

findbugs.jarを生成する。

c:\apache-ant\1.8.1\bin\ant jars

lib配下にfindbugs.jarができるのでそれを使用する。

ソースチェック系プラグインの追加

Jenkins実践入門WEB+DB PRESS Vol.67を読んだ。
PMD,CPD,jslint,csslintもついでに設定してみた。
プロジェクトは
Jenkins実践入門のサンプルプロジェクトを利用。


PMD,CPD

ライブラリをRedirecting...からダウンロード。
build/lib/pmd配下にjarファイルを格納。

ls -1 lib/pmd/
asm-3.2.jar
jaxen-1.1.1.jar
junit-4.4.jar
pmd-4.2.6.jar

build.xml

<property name="lib.pmd.dir" location="./lib/pmd" />
<path id="pmd.classpath">
	<fileset dir="${lib.pmd.dir}">
		<include name="*.jar"/>
	</fileset>
</path>
<target name="pmd">
	<taskdef name="pmd" classname="net.sourceforge.pmd.ant.PMDTask" classpathref="pmd.classpath" />
	<mkdir dir="${report.dir}/pmd" />
	<pmd shortFilenames="true">
		<ruleset>basic</ruleset>
		<formatter type="xml" toFile="${report.dir}/pmd/pmd.xml"/>
		<fileset dir="${java.src.dir}">
			<include name="**/*.java" />
		</fileset>
	</pmd>
</target>
<target name="cpd">
	<taskdef name="cpd" classname="net.sourceforge.pmd.cpd.CPDTask" classpathref="pmd.classpath" />
	<mkdir dir="${report.dir}/cpd" />
	<cpd minimumTokenCount="10" format="xml" outputFile="${report.dir}/cpd/cpd.xml">
		<fileset dir="${java.src.dir}">
			<include name="**/*.java"/>
		</fileset>
	</cpd>
</target>

PMD Plug-in と Duplicate Code Scanner Plug-in をインストール
プロジェクトの設定で
「PMD警告の集計」-「集計するファイル」build/report/pmd/pmd.xml
「重複コード分析の集計」-「集計するファイル」build/report/cpd/cpd.xml
を指定。


jslint
Google Code Archive - Long-term storage for Google Code Project Hosting.からjslint4java-[version].jarをダウンロード。
build/lib/junit配下にjarファイルを格納。

build.xml

<taskdef name="jslint"
		 classname="com.googlecode.jslint4java.ant.JSLintTask"
		 classpath="${lib.junit.dir}/jslint4java-2.0.2.jar" />
<target name="jslint" description="Run the JSLint tool on JS files">
	<mkdir dir="${report.dir}/jslint" />
	<jslint options="white,undef,plusplus,newcap,vars,indent=4,sloppy" haltOnFailure="false">
		<predef>jQuery, setTimeout, history, window, document</predef>
		<formatter type="xml" destfile="${report.dir}/jslint/jslint.xml" />
		<fileset dir="./web/js">
			<include name="**/*.js" />
			<exclude name="**/*.min.js" />
		</fileset>
	</jslint>
</target>

Jenkins Violations pluginをインストール。
プロジェクトの設定で
「Report Violations」-「jslint]の「XML filename pattern」にbuild/report/jslint/jslint.xml
を指定。


csslint
GitHub - CSSLint/csslint: Automated linting of Cascading Stylesheetsからcsslint-rhino.jsとjs.jarをダウンロードしbuild/lib/csslint配下に格納。

ls -1 csslint/
csslint-rhino.js
js.jar

build.xml

<property name="lib.csslint.dir" location="./lib/csslint" />
<target name="csslint" description="Run the CSSLint tool on CSS files">
    <fileset dir="./web/css" id="cssfiles.raw">
		<include name="**/*.css" />
    </fileset>
    <pathconvert pathsep=" " property="cssfiles.clean" refid="cssfiles.raw"
				 />
	<mkdir dir="${report.dir}/csslint" />
    <exec executable="java" output="${report.dir}/csslint/csslint.xml">
		<arg line="-jar ${lib.csslint.dir}/js.jar ${lib.csslint.dir}/csslint-rhino.js --rules=errors --format=lint-xml  ${cssfiles.clean}" />
    </exec>
</target>

プロジェクトの設定で
「Report Violations」-「csslint]の「XML filename pattern」にbuild/report/csslint/csslint.xml
を指定。

ビルドの実行にシェルスクリプトでTOMCATを起動

jenkinsで

  1. antでwarファイルをつくる
  2. シェルで起動中のTomcatを停止し、webapps配下に上記で作ったwarを配置しTomcatを実行
  3. antでjunitテストや、チェックスタイルを実行

のようなjobを組んだら、ビルド処理が全て終了した後、Tomcatが終了してしまう。
nohupをつけても終了してしまうので調べた。
ProcessTreeKiller - Jenkins - Jenkins Wiki
jenkinsにオプションをつけて実行したらTomcatは終了しなくなった。

java -Dhudson.util.ProcessTree.disable=true -jar jenkins.war

シェルで配置とかはあまり一般的でないのかな?

playのseleniumテストでqunitの実行結果を判定する

というわけで、qunitの実行結果をseleniumで判定することにした。
(play! には qunit module があったが、それは試していない。)

selenium ide の play! plugin(Selenium IDE plugin for the Play! framework)を導入してqunit用のhtmlを開いてキャプチャした。

今回は、タイトルが「✔ QUnit Test Suite」であればテスト成功とした。

「open」->「assertTitle」の順で実行すると、selenium ideでは成功するが、
selenium test runnerから実行すると、タイトルが変わる前にassertTitleが実行されるため失敗する。
なので、html内の最下部の要素「qunit-fixture」を「waitForElementPresent」に指定した。

「Application.test.html」に指定した内容は以下のとおり。

#{selenium 'qunit'}
    clearSession()
    open('/public/javascripts/test/test.html')
    waitForElementPresent('id=qunit-fixture','test markup')
    assertTitle('&#10004; QUnit Test Suite')
#{/selenium}

成功時

失敗時

herokuで使用しているDBのデータをエクスポートしてローカルのDBにインポート

tapsを使用して、エクスポート、インポートを行う。
今回はsqlite形式でデータをエクスポートし、それをローカルのPostgreSQLにインポートした。

1.エクスポート
まずherokuからデータをエクスポートする

$ heroku db:pull sqlite://20111220.sqlite --app <アプリケーション名>

2.tapsサーバー起動
localのpostgresにtaps経由でアクセスできるようにする。
次のコマンドで、サーバーを起動する。
構文

taps server <インポートするDB_URL> <login> <password>

実行例

$ taps server postgres://localdbuser:localdbpass@localhost/localdb tapuser tappass

3.インポート
別のコンソールを開いて、herokuからpullしたデータを上記で起動したserverにアクセスしてインポートする
構文

taps push <エクスポートしたデータのSQLITEのパス> http://<login>:<password>@localhost:5000

実行例

$ taps push sqlite://20111220.sqlite http://tapuser:tappass@localhost:5000

herokuでplay1.2.4を使う

dependencies.ymlにversionを設定すれば使える。
1.2.3

# Application dependencies

require:
    - play

1.2.4

# Application dependencies

require:
    - play 1.2.4

pushした時のログ

-----> Heroku receiving push
-----> Play! app detected
-----> Updating Play! version. Previous version was 1.2.3. Updating to 1.2.4...
-----> Installing Play! 1.2.4.....
-----> done
-----> Installing ivysettings.xml..... done
-----> Building Play! application...
       ~        _            _ 
       ~  _ __ | | __ _ _  _| |
       ~ | '_ \| |/ _' | || |_|
       ~ |  __/|_|\____|\__ (_)
       ~ |_|            |__/   
       ~
       ~ play! 1.2.4, http://www.playframework.org
       ~
       1.2.4
       Building Play! application at directory ./
...

楽ちんだな。