ひよっこ。

I want to…

FlexのCI用のビルド環境を構築する。

Posted by hikaruworld : 2009 9月 20

先日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設定

HusonのViolations設定


すると、HudsonのView上で確認することが出来るようになります。
Violation結果

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

コメントを残す