先日FlexPMDが出たと話題になっていましたが、
これ幸いと思い、Hudsonと一緒にCI環境を構築する事にしました。
# 今回のエントリはメモ的要素が非常に大きいです。
# 会社に持っていってそのまま使いたかったので…
具体的には、基本的な項目のみで以下のように行っています。
- コンパイル
- ASDocの出力
- FlexPMDの実行
なお、今回とりあえず放置したことも多々あります。
- パブリッシュ(.air化)
- 自動テストの実行(FlexMonkey & Flexcover & FlexUnit4)
以下は実際の手順になりますが、
今回試したのはAir環境なので必要に応じてFlexと読み替えてください(aasdocがasdocとか)。
また、基本的な方針として出来る限り1プロジェクト内にすべてのbuildファイルを含める方針でいきたいと思います。
ディレクトリ構成は以下の通り。
.
|-- report APPLICATION_ROOT
|-- AIR_readme.txt FlashDevelopにより生成されたファイル
|-- CreateCertificate.bat FlashDevelopにより生成されたファイル(証明書付与用)
|-- Report.as3proj FlashDevelopにより生成されたファイル(FD用の設定ファイル)
|-- PackageApplication.bat FlashDevelopにより生成されたファイル(パッケージ化用)
|-- SelfSigned.pfx 証明書ファイル
|-- air PackageApplication.batにより生成されるリリース用ディレクトリ
| `-- Report.air パッッケージ化されたAirファイル
|-- bin swfファイルの保存場所(Antにより生成)
| `-- Report.swf コンパイルされたswfファイル
|-- bin-debug デバック用ディレクトリ(FlexBuilder及びFlashDevelopにより生成)
|-- build hudson用の各種ビルドファイル
| |-- build-doc.xml ASDocビルド用
| |-- build-pmd.xml FlexPMD実行用
| |-- build.xml コンパイル用
| |-- ruleset.xml FlexPMD用のルールセット(今回は利用しない)
| `-- output ビルドファイルの実行結果格納先
| |-- AppDocs build-doc.xmlによって書き出されたASDoc
| `-- pmd.xml FlexPMDの出力結果
|-- libs
| `-- ext
| |-- flexpmd FlexPMDで利用されるライブラリ。
| | |-- LICENSE.txt
| | |-- ant-1.7.0.jar
| | |-- as3-parser-1.0.RC3.jar
| | |-- as3-parser-api-1.0.RC3.jar
| | |-- as3-plugin-utils-1.0.RC3.jar
| | |-- commons-lang-2.4.jar
| | |-- flex-pmd-ant-task-1.0.RC3.jar
| | |-- flex-pmd-core-1.0.RC3.jar
| | |-- flex-pmd-files-1.0.RC3.jar
| | |-- flex-pmd-ruleset-1.0.RC3.jar
| | |-- flex-pmd-ruleset-api-1.0.RC3.jar
| | |-- plexus-utils-1.0.2.jar
| | `-- pmd-4.2.2.jar
| `-- flexunit4 FlexUnit4関連のライブラリ(今回は利用しない)
|-- obj FlashDevelopにより生成される
|-- src ソースディレクトリ
| |-- Report-app.xml 設定ファイル
| |-- Report.mxml メインクラス
| `-- com
| `-- wordpress
| `-- prepro
`-- test テストディレクトリ
|-- com
`-- wordpress
`-- prepro
OS |
CentOS5.3 |
VMWareの仮想アピアランスを利用 |
SCM |
Subversion1.4.2 |
yumにてインストール |
CI |
hudson1.3.23 |
ViolationsPluginをインストール済み。 |
Ant |
1.7 |
Hudson上の自動インストールを用いてインストール |
FlexSDK |
3.3.0.4852 |
/usr/local/flexはシンボリックリンクで定義しており、実体は/usr/local/flex3.3/ |
0. Subversion & Hudson & Ant & FlexSDKのインストール
省略。SubversionとHudsonは同一PC上にあるものとします。
SubversionはApache上で動かし、Hudsonはとりあえずjava -jar hudson.warで起動します。
また、Antに関しても、Hudsonの自動インストールを利用するものとします。
なお、FlexSDKに関しては/usr/local/flex以下にFlex3.3系の最新版を/usr/local/flexにインストールします。
1. コンパイル
FlexSDK3.3系ではFlexAntは既にSDkに内部に含まれていますのでFlexSDKをインストールしていれば不要です。
mxmlcをもちいてswfファイルを出力しているのは、後にFlexcoverやFlexmonkeyで読み込ませてテストを行う場合に必要になることを考えての事です(今回は意味ない..)。
<?xml version="1.0" encoding="UTF-8"?>
<project name="flexAnt" default="main" basedir="./">
<description>
FlexAntを用いてAirのコンパイルを行います
</description>
<!-- Hudsonの提供する環境変数を設定(実際にはこのbuild.xmlでは使われない) -->
<property environment="env" />
<!-- 各種プロパティ定義 -->
<!-- FlexSDKのホーム -->
<property name="FLEX_HOME" value="/usr/local/flex"/>
<!-- アプリケーションのルート -->
<property name="APP_ROOT" value="../"/>
<!-- flex用Antタスクを読み込む -->
<taskdef resource="flexTasks.tasks" classpath="${FLEX_HOME}/ant/lib/flexTasks.jar"/>
<!-- mxmlcの実行 -->
<target name="main">
<mxmlc file="${APP_ROOT}/src/Report.mxml" output="${APP_ROOT}/bin/Report.swf">
<!-- mxmlc file="${APP_ROOT}/src/Report.mxml" keep-generated-actionscript="true" -->
<!-- load-config filename="${FLEX_HOME}/frameworks/flex-config.xml"/ -->
<load-config filename="${FLEX_HOME}/frameworks/air-config.xml"/>
<source-path path-element="${FLEX_HOME}/frameworks"/>
</mxmlc>
</target>
</project>
2. ASDocの出力
ASDocを出力するためには、FlexSDK配下のbin/asdocを利用します。
が、FlexはasdocですがAirの場合aasdocを利用することになりますので注意してください。
また、ここでも指摘されていますが、linuxやmacでaasdocを利用する場合改行コードの
CRLFになっており正常に実行できませんので、改行コードを置き換える必要があります。
以下がasdocを出力するためのantになります。基本的にはここのテンプレート利用して任意に修正してください。
<?xml version="1.0" encoding="UTF-8"?>
<project name="asdoc" default="main" basedir=".">
<description>
AsDoc出力用のAntファイルです
</description>
<!-- Hudsonの提供する環境変数を設定(実際ここでは利用されない) -->
<property environment="env" />
<!-- 各種プロパティ定義 -->
<!-- FlexSDKのホーム -->
<property name="FLEX_HOME" value="/usr/local/flex"/>
<!-- アプリケーションのルート -->
<property name="APP_ROOT" value="../"/>
<!-- aasdocへのパス -->
<property name="ASDOC_EXE" location="${FLEX_HOME}/bin/aasdoc"/>
<!-- ASDoc出力対象のソースディレクトリ -->
<property name="AppClasses.dir" location="${APP_ROOT}/src/"/>
<!-- ASDocの出力対象のディレクトリ -->
<property name="Output.dir" location="${basedir}/output/AppDocs" />
<!-- flex用Antタスクを読み込む -->
<taskdef resource="flexTasks.tasks" classpath="${FLEX_HOME}/ant/lib/flexTasks.jar"/>
<!-- デフォルトの実行クラス -->
<target name="main" depends="clean,compile" description="full build of asdocs"/>
<!-- 既存のOutputを削除して新規作成するCleanUp -->
<target name="clean">
<delete dir="${Output.dir}" failOnError="false" includeEmptyDirs="true"/>
<mkdir dir="${Output.dir}"/>
</target>
<!--
- ASDocの実行。FlexAntタスクなどで定義されているわけではないので、execタスクを利用して直接aasdocを実行する。
-->
<target name="compile">
<exec executable="${ASDOC_EXE}" failonerror="false">
<arg line='-source-path ${AppClasses.dir} ${FLEX_HOME}/frameworks/'/>
<arg line='-doc-sources ${AppClasses.dir}/com/wordpress/prepro'/>
<arg line='-window-title "Report"'/>
<arg line='-output ${Output.dir}'/>
</exec>
</target>
</project>
3. FlexPMDの実行
FlexPMDを実行するためには以下から必要な物をダウンロードする必要があります。
本来であれば外部にjarファイルをおいてそちらを参照すべきなのですが、
今回はプロジェクト内部に含める形にします(諸事情により)。
はまった点としてはチュートリアルにある方法では上手くいかなくて、classpathをはずしたら上手くいきました。
また、チュートリアルでは値を変数設定していますが、ここでは割り切って相対パスで指定しています。
<?xml version="1.0" encoding="UTF-8"?>
<project name="Flex PMD example" default="test" basedir=".">
<description>
taskdef flexPmdの定義テスト
</description>
<!--****************************************************
FlexPMDを定義する
*****************************************************-->
<taskdef name="flexPmd" classname="com.adobe.ac.pmd.ant.FlexPmdAntTask" >
<classpath>
<pathelement location="../libs/ext/flexpmd/as3-parser-1.0.RC3.jar"/>
<pathelement location="../libs/ext/flexpmd/as3-parser-api-1.0.RC3.jar"/>
<pathelement location="../libs/ext/flexpmd/as3-plugin-utils-1.0.RC3.jar"/>
<pathelement location="../libs/ext/flexpmd/commons-lang-2.4.jar"/>
<pathelement location="../libs</classpath>/ext/flexpmd/flex-pmd-ant-task-1.0.RC3.jar"/>
<pathelement location="../libs/ext/flexpmd/flex-pmd-core-1.0.RC3.jar"/>
<pathelement location="../libs/ext/flexpmd/flex-pmd-files-1.0.RC3.jar"/>
<pathelement location="../libs/ext/flexpmd/flex-pmd-ruleset-1.0.RC3.jar"/>
<pathelement location="../libs/ext/flexpmd/flex-pmd-ruleset-api-1.0.RC3.jar"/>
<pathelement location="../libs/ext/flexpmd/plexus-utils-1.0.2.jar"/>
<pathelement location="../libs/ext/flexpmd/pmd-4.2.2.jar"/>
</classpath>
</taskdef>
<target name="test">
<flexPmd
shortFilenames="false"
sourceDirectory="../src"
outputDirectory="output/" />
</target>
</project>
これでoutput以下に、pmd.xmlを出力しますので、hudson側でこんな感じに設定してやります。
HusonのViolations設定
すると、HudsonのView上で確認することが出来るようになります。
Violation結果
問題点
本来はこれで問題なく参照できるはずですが、sourceが表示されず対応行がビジュアルに表示されませんでした。
Violationの設定がおかしかったのかなとも思ったのですが、filenameが絶対パスで示されている関係なのかなぁと思ったりして検索してみたら、こんなのを見つけました。
RC4で対応されるみたいなので、また改めて試してみようと思います。
2009/09/20 追記
これを書いたのは9/8頃だったんですが(そのまま放置(汗))今日(9/20)に見たら、
know issureとしてFlexPMDのトップページに以下が表示されるようになっていました。
今後に期待ということで…
Stack traces can be thrown during parsing. They are caught though during analyzing the code base, and hence fails over