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
<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ファイルを格納。
<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
<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で
のようなjobを組んだら、ビルド処理が全て終了した後、Tomcatが終了してしまう。
nohupをつけても終了してしまうので調べた。
ProcessTreeKiller - Jenkins - Jenkins Wiki
jenkinsにオプションをつけて実行したらTomcatは終了しなくなった。
java -Dhudson.util.ProcessTree.disable=true -jar jenkins.war
シェルで配置とかはあまり一般的でないのかな?
playのseleniumテストでqunitの実行結果を判定する
- 画面描画のテストはseleniumでやるつもり。
- javascriptの単体テストはqunitを使ってサクっとやってしまいたい。
- テストはplay!の仕組みを使ってjavaとjavascriptを全部実行したい。
というわけで、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('✔ 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 ./ ...
楽ちんだな。