すがブロ

sugamasaoのhatenablogだよ

Flash Builder 4 を使ってみよう

まずは本体の DL

そのうちライセンスは買うので、とりあえず体験版を使って環境を作ったりする。
ちなみに、以前までは Flex Builder と呼ばれていたのだけど、 Flash Builder に名称が変わりました。

ここから Adobe ID を入力してDLする。Adobe ID がない人は作成しちゃいましょう。

DLできたので確認

とりあえず確認したことを列挙

Air はわからないけど、Flex SDK は別途追加もできそう。

とりあえず設定

個人的になんだけど、タブ(スペースは目立たなければ)は可視化したい派なので、「ウィンドウ→設定→一般→エディター→テキスト・エディター→空白文字の表示」にチェックを入れておく。
Windows版Eclipse専用の空白とかを表示するプラグインと違って、Eclipse 純正はイケてないがとりあえず良いか。

必要なプラグインを入れましょう

subclipse の導入

から更新サイトの URL をゲット。自宅の SVN は 1.6 なので、Subclipse も 1.6 用のを使用する。ちなみに、 Subclipse 1.4 は SVN 1.4 と 1.5 対応らしい。
というわけで、以下の URL を更新サイトに突っ込んでインストール。
http://subclipse.tigris.org/update_1.6.x
としたところ、Mylyn が必要とおっしゃる。仕方がないので Mylyn を先にインストール。

Mylyn のインストール

zip の落とす場所は見つけたけど、update site が見つからなくて苦戦。
以下で、とりあえず Eclipse 3.4 版のを見つけた。とりあえず大丈夫だろう……。

ここに書いてある、 update site を入力して、必要そうなプラグインだけインストールすることにする。
http://download.eclipse.org/tools/mylyn/update/e3.4

Mylyn Features と、必要かわからんけど wiki text なるものを入れておく。さしあたり必要なものは Features だけで良いとは思う。
これはそのまま問題なくインストールできるので、改めて Subclipse のインストールを行う。

Subclipse のインストール(再)

とりあえず全部入りでインストールしようと思ったけど、なにやら Revesion Graph だけは他のプラグインが必要なので、それ以外をインストールする事にする。

プラグインのインストールは無事にできたので、設定がちゃんとできるか確認してみよう。
というわけでロケーションの設定をしよう…とすると案の定エラーになった。が、SVNのインターフェイスを変更したらうまくいった。
「ウィンドウ→設定→チーム→SVNSVNインターフェイス」を SVNKit に変更したらうまく行った。

git のインストール

よく考えたら Git 使う方が多いじゃん、というわけで Git プラグインを探す。
普段コマンドラインからしか使わないので、どれがメジャーなのかわからない。
調べてみると、EGit というのがメジャーらしいので、そいつをインストールする。

ここら辺とかを見ると、EGit とか言ってるのに URL は jgit とかなってて人間不信に陥る。
さらに、いざインストールしようと以下の update site を使ってインストール使用とすると Obsolete とかついてる。辞めた方が良いのか。
http://www.jgit.org/update-site

      • -

仕切りなおして調べ直してみる。
そうすると、なんだ、ちゃんと EGit なるものがあるじゃないか。

こっちを使うことにしてみよう。
http://download.eclipse.org/egit/updates
JGitとEGitの両方があったけど、もう面倒なので両方いれることにした。
さて、Github にアクセスできるだろうか。
SVN の時のように SVN エクスプローラー的なのがあるのかと思ったら、一切ない。絶望の淵に立ったが、以下のチュートリアルを見ることで事なきを得た。

新規作成の場合は 4.1 を見た方が良さそうだけど、すでにある Git リポジトリからの Clone なので、 4.2. Checkout existing project を見ればよさそうだ。
なるほど、インポートから Git Repository を選んで、github にある git:// の URL を貼付け、プロトコルを git+ssh にすると。で、パスワードに git*3のパスワードを入力すればOK。

だったが、ここでちょっとハマる。
今回インポートしようとしている github のファイルは元々 Flex 用のファイル一式ではない。なので、プロジェクトファイルのインポートができない。
なので、一旦別の名前でインポートして git からの clone 後に、別途プロジェクトのインポートを行う必要がある。
というわけで、一番下のチェックを外し、DL後の名前も適当に変えておく(_fugaとかつけた)

この後、改めてFlexプロジェクトを作成し、「インポート→ファイル・システム」で clone したファイル一式を作成した Flex プロジェクトへ取り込む。

あとはプロジェクトの設定と取り込んだファイル一式の設定をあわせてあげれば良い。これは Git の話ではないので割愛します。

というわけで

Flash Builder の環境構築編はおしまい。昔は Eclipse 入れたらとりあえずコレ入れろよ!みたいのあった気がするけど、今となってはよく憶えていないので、とりあえず SVN/Git が使えれば十分かな……。あとは github の Mylyn プラグインとかあると良いんだが。。。

プラグイン追加したので追記

FlexPMD に Eclipse Plugin ができてた

ここを参考に、以下を update site として登録するだけ。
http://opensource.adobe.com/svn/opensource/flexpmd/plugin/trunk/flex-pmd-eclipse-plugin-site
なお、flex-pmd は 1.1 から対応しているらしいので、ついでにアップデートしておいた。
手順としては、Home Project for Open @ Adobe / Home / Projectsの Downloads から All-in-one-bundle の zip を落として、(おれの場合は)/opt/flex/flex-pmd のシンボリックリンクにしておいた。
あとは、「ウィンドウ→設定→FlexPMD」で、下記の jar のパスを設定する。

  • FlexPMD command line installation → flex-pmd-command-line-1.1.jar
  • FlexCPD command line installation → flex-pmd-cpd-command-line-1.1.jar

これでOKのはずなんだが…… FlexCPD はきちんと判定してくれるのだけど、FlexPMDの方がビューの方に反映されない。何か足りないのだろうか?

*1:FlashPlayer 9〜

*2:FlashPlayer 10〜

*3:というか ssh

FlexUnitを試してみた

まずは準備から

ここから FlexUnit4 の zip を落とす

公式のドキュメント

その他参考になったページ

Zip を解答して

好きな場所に配置してください。必要なのは libs にある swc なファイルのみになります。
使う場合は二パターンあって -compiler.library-path 追加するパスに特定の場所をおいて(/opt/hoge/flexunit/libs) のように、システム全体で共通の値を使うようにするか、各プロジェクト毎に libs フォルダに置くか。
普通に Flex を使うと後者になると思うけど、毎回コピーするのも面倒だ、という場合は、共通の場所に置いておくと良いと思う。

ざっくり手順

  • テストを実行するテストランナーを作る
  • テストファイルを作る
  • テスト対象のファイルを実行する
  • テストを実行する

あと、テストを行い易くするため、rascut の導入を強くオススメします。

ファイル構成はこんな感じ

ソース一式は misc/flexunit_sample at master · sugamasao/misc · GitHub にあります。

|-- libs
|   |-- FlexUnit1Lib.swc
|   |-- FlexUnit4.swc
|   |-- FlexUnit4UIListener.swc
|   `-- hamcrest-1.0.2.swc
`-- src
    |-- FlexSample.mxml
    |-- TestRunner.mxml # テストランナー
    |-- sample
    |   |-- Calculate.as
    |   `-- Fuga.mxml
    `-- test
        |-- FlexSampleTest.as # テストクラス
        |-- TestSuiteAll.as # テストスイート
        `-- sample
            |-- CalculateTest.as # テストクラス
            `-- FugaTest.as # テストクラス

テスト作成の流れ

まず、TestRunner を作成し、 run メソッドで実際にテストを実行する。その際、個別にテストクラスを引数にとっても良いし、テストスイートを渡しても良い。
今回はテストスイートを渡すようにした。

テストを実行するには

TestRunner.mxml をコンパイルして実行すれば良い。
そのため、rascut で更新の都度コンパイル→実行を繰り返せば ruby の autotest のように、常時テストが実行できてすばらしい!

rascut -s -c -compiler.library-path+=./libs ./src/TestRunner.mxml

こんな感じのコマンドで実行して、ブラウザで開いておけばOKです。

テストスイート

なんの事はなくて、テストを public な変数として持てば良い。

テスト(普通の)

いわゆる足し算メソッドとかをテストする場合。まーほとんど使わないが。。。

[Test(description="計算のテスト")]
public function testAdd():void
{
   Assert.assertEquals(2, target.add(1, 1));
}

target は [Before] タグのついたメソッド(テストケース毎に実行される)で生成したオブジェクト。
たいがいのサイトでも紹介されてる手法ですね。

テスト(UI)

UI の場合はちょっと手順が違う。

準備(before)

まず、Before 等で、テスト用のコンポーネント内に、テスト対象のオブジェクトを addChild する。

[Before(async,ui)]
public function alsoRunBeforeEveryTest():void {
    trace("before");
    target = new Fuga();
    Async.proceedOnEvent( this, target, FlexEvent.CREATION_COMPLETE, 500);
    UIImpersonator.addChild(target);
} 

対象が Sprite とかだったら、一旦 UIComponent 等に突っ込んでから UIImpersonator に突っ込むと良い。
あとは、一応 CREATION_COMPLETE イベントが走るまでは待ってあげる*1

実行

[Test]タグに ui や async をつけて UI のテストであることを明示しておく。
あとは Async.handleEvent にて第二引数に対象オブジェクトを、第三引数に発火してくるイベントを書いて、第四引数にイベント発火時の検証メソッドを渡す。
検証の準備ができたら dhispatchEvent で擬似的にボタンが押された、とかを偽装するためにイベントを発火してあげる。
もちろん、自分で作ったオリジナルのイベントだって発火できるし、待ち受けることもできる。

[Test(description="ボタンが押下されたことを確認するテスト", async, ui)]
public function buttonHandlerTest():void {
  // 発火するイベントをウォッチする
  Async.handleEvent(this, target, MouseEvent.CLICK, buttonHandlerTestHandler, 500);
 
  // テストしたいイベントを実際にディスパッチして実行する
  target.fugabutton.dispatchEvent( new MouseEvent(MouseEvent.CLICK, true));
}

実際にイベントが発火したら、検証用メソッドで検証する。
こっちは別に[Test]とかは不要。

private function buttonHandlerTestHandler(e:Event, passThroughData:Object):void {
  trace(e, passThroughData);
  Assert.assertEquals(e.type, MouseEvent.CLICK);
}

この例だと想定したイベントタイプが発生していることを検証しているけど、他のコンポーネントにどのような影響を与えているかもここで検証できる。

ここではボタンを押された結果、別のコンポーネントの値が変わることを検証している。

だいたいの手順は

こんな感じです。他にも一連の動きをシナリオとして定義してテストしたりもできるようなのですが、イマイチ情報も少ないのでちょっと調べきれてません。。。

その他(hamcrest)

hamcrestって良く分かってないんだけど、Java で実装されているもののASへの移植版っぽい。AssertThat をもっとわかりやすく書こうぜ!みたいなヤツで、検証メソッドとして便利なのがそろってる。
まったくつかいこなせてないけど、as_logger/src/test/com/github/sugamasao/as_logger at master · sugamasao/as_logger · GitHub でちょっと使いました。

いまのところこんな感じです><

イマイチ日本語の資料も少ないので、ここ間違ってるよ!とかあれば教えて下しあ!

*1:Async.proceedOnEventのとこね

AIRの環境をビルドするのに必要なコマンドまとめ

まとめたのはビルドとデバッグ起動のみ

証明書の発行や、 .air ファイルの作成の前段階までで使用するコマンドについてです。
そこら辺の話を知りたければ、こちらを参照すると良いかもしれません。Adobe AIR * ADT(AIR 開発ツール)を使用した AIR インストールファイルのパッケージ化

ビルド方法

基本は Flex で使用している mxml と同様ですが、AIR の場合は amxmlc となります。
引数等も同じ。

AIRSample

-- bin
-- build

`-- src
|-- AIRSample.mxml
|-- application.xml

上記のような構成で、AIRSample ディレクトリがカレントディレクトリだった場合は、以下のようになる*1

amxmlc ./src/AIRSample.mxml -output ./bin/AIRSample.swf

コンパイル用のオプションや xml の受け取り方などは mxml と同様っぽいので、興味がある人はFlex3 で trace ログの出る、出ないを ant 経由で制御する方法 - @sugamasao.blog.title # => ”コードで世界を変えたい”を参照すると良いかも。

実行方法

.air を作って毎回インストール→実行ではいくら時間があっても足りないので、デバッグ用支援ツール adl を使いましょう。
支援ツールといっても、純正品なので AIR がインストールされている環境なら問題なく使えます。
ディレクトリ構成は上記のまま、コンパイル済みの swf が bin ディレクトリにある場合は以下のようにします。

adl -runtime /opt/flex/flex_sdk_3.4.0.9271/runtimes/air/mac/ ./src/application.xml ./bin

これ、ちょっとわかりにくいんだけど、 -runtime の引数には「Adobe AIR.framework」というファイルが入ってるディレクトリを指定する必要があります。
そして、二番目には AIR 用のアプリケーションXMLを指定します。三つ目がアプリケーションXMLと swf が違うディレクトリの場合に指定するオプションで、swf のディレクトリを指定します。
ここら辺はAdobe AIR * AIR Debug Launcher(ADL)の使用を見ると良いと思います。

ちなみに

Mac で screen を使ってる状態で上記の adl を実行すると、固まったり、実行できなかったりします。
その対応は、次回詳しくエントリーにしようかと思っているのですが、どうやら screen のバージョンとの食い合わせが悪いようです。

参考になる書籍

Twitter でも書いたのだけど、

  • Flex Builder/Flash CS/コマンドライン
  • Flexでの開発/JSでの開発

を網羅しつつ、アプリケーションXMLの詳細な説明も含めた AIR 開発ならではの情報が盛りだくさんの書籍があります。
これは一家に一冊あっても良いレベルの書籍だと思います\(^o^)/

Adobe AIR クックブック ―プロフェッショナルに学ぶRIAプログラミングの実践

Adobe AIR クックブック ―プロフェッショナルに学ぶRIAプログラミングの実践

*1:出力先を bin ディレクトリにしてるので注意

Flex3 上での trace の on/off 切り替え

Flex 3 での切り替え方法は


追加コンパイラ引数」の

 -define CONFIG::DEBUG true

を追加してあげると、trace が出るように。また、false にすれば出ないようになります。
なお、このオプション自体を消してしまうと、ソース中の CONFIG::DEBUG と記述したところでエラーになりますので注意したほうが良いでしょう。

Flex3 で trace ログの出る、出ないを ant 経由で制御する方法

trace ログ垂れ流しの Flash って結構あるんですけど

trace ログ垂れ流しが許されるのは小学生までなので、きちんと制御したいですよね。
本当は、FlexSDK*1 へのオプションで出力するかどうかを制御できれば良いのですが、残念ながら制御できません。
なので、コードにちょっとだけ手を加えます。
また、今回はその制御を ant タスクで切り替える事ができるようにしようと思います。

基礎知識

まず、 trace を切り替える為に、コンパイル時の定数*2によって、切り分けます。
例えば、以下のように記載した場合

CONFIG::DEBUG {
    trace(message);
}

CONFIG::DEBUG 定数が true な場合のみ、trace 文が実行されるようになります。
これは、mxmlc のオプションにすると、以下のような指定になります。

# DEBUG モードの場合
mxmlc -define CONFIG::DEBUG true hoge.mxml

# リリースモードの場合
mxmlc -define CONFIG::DEBUG false hoge.mxml

これ、リリースモードだからといって CONFIG::DEBUG を省略するとコンパイルエラーになるので気をつけましょう。

ant タスクに応用するには

-define 部分を動的に(タスク毎に)変更できるようにしてあげれば良いということになりますね。
そこで、以下のような方針を取るようにしました。

  • 各プロジェクト単位の flex-config.xml に、 CONFIG::DEBUG false を記載しておく*3
  • ant の budeg-build タスクの場合は true にする

flex-config.xml の内容

<?xml version="1.0" encoding="UTF-8"?>
<flex-config>
    <target-player>10.0.0</target-player>
    <warnings>true</warnings>
    <compiler>
        <define>
            <name>CONFIG::DEBUG</name>
            <value>false</value>
        </define>
    </compiler>
</flex-config>

これで、デフォルト設定の既述が完了です。

ant タスク

ant タスクは全部載せてみた。
mxmlcの実行(debug)と書いてあるタスクの、 という部分がキモになります。

<?xml version="1.0" encoding="UTF-8"?>
<project name="flexAnt" default="build" basedir="./">
    <description>
        FlexAntを用いてFlexのコンパイルを行います
    </description>

    <!-- 環境によって変更されるパスの設定 -->
    <property name="FLEX_HOME" value="/opt/flex/flex_sdk_3.4.0.9271"/>
    <property name="PMD_VER" value="1.0.RC4"/>
    <property name="PMD_HOME" value="/opt/flex/flex-pmd-ant-task-${PMD_VER}"/>

    <!-- プロジェクトのベースディレクトリ定義 -->
    <dirname property="XML_DIR" file="${ant.file}"/>
    <property name="APP_ROOT" value="${XML_DIR}/../"/>
    <property name="APP_SRC" value="${APP_ROOT}/src"/>

    <!-- 各コマンドのパス設定 -->
    <property name="ASDOC_EXE" value="${FLEX_HOME}/bin/asdoc"/>

    <!-- 出力先ディレクトリの設定  -->
    <property name="BIN_OUTPUT" value="${APP_ROOT}/bin"/>
    <property name="ASDOC_OUTPUT" value="${APP_ROOT}/asdoc"/>
    <property name="PMD_OUTPUT" value="${APP_ROOT}/pmd"/>

    <!-- アプリケーションの名前 -->
    <property name="APP_NAME" value="APP_NAME"/>

    <!-- flex用Antタスクを読み込む -->
    <taskdef resource="flexTasks.tasks" classpath="${FLEX_HOME}/ant/lib/flexTasks.jar"/>

    <!-- FlexPMD タスクの定義 -->
    <taskdef name="flexPmd" classname="com.adobe.ac.pmd.ant.FlexPmdAntTask" >
        <classpath>
            <pathelement location="${PMD_HOME}/as3-parser-${PMD_VER}.jar"/>
            <pathelement location="${PMD_HOME}/as3-parser-api-${PMD_VER}.jar"/>
            <pathelement location="${PMD_HOME}/as3-plugin-utils-${PMD_VER}.jar"/>
            <pathelement location="${PMD_HOME}/commons-lang-2.4.jar"/>
            <pathelement location="${PMD_HOME}/flex-pmd-ant-task-${PMD_VER}.jar"/>
            <pathelement location="${PMD_HOME}/flex-pmd-core-${PMD_VER}.jar"/>
            <pathelement location="${PMD_HOME}/flex-pmd-files-${PMD_VER}.jar"/>
            <pathelement location="${PMD_HOME}/flex-pmd-command-line-${PMD_VER}.jar"/>
            <pathelement location="${PMD_HOME}/flex-pmd-ruleset-${PMD_VER}.jar"/>
            <pathelement location="${PMD_HOME}/flex-pmd-ruleset-api-${PMD_VER}.jar"/>
            <pathelement location="${PMD_HOME}/plexus-utils-1.0.2.jar"/>
            <pathelement location="${PMD_HOME}/pmd-4.2.2.jar"/>
        </classpath>
    </taskdef>

    <!-- 全部入り動作 -->
    <target name="all" depends="clean,build,document,pmd" description="full build of project"/>

    <!-- 全部入り動作(debug)  -->
    <target name="debug-all" depends="clean,debug-build,document,pmd" description="full build of project"/>

    <!-- mxmlcの実行 -->
    <target name="build">
        <mkdir dir="${BIN_OUTPUT}" />
        <mxmlc file="${APP_SRC}/${APP_NAME}.mxml" output="${BIN_OUTPUT}/${APP_NAME}.swf">
            <load-config filename="${FLEX_HOME}/frameworks/flex-config.xml"/>
            <load-config filename="${APP_ROOT}/build/${APP_NAME}.xml"/>
            <source-path path-element="${FLEX_HOME}/frameworks"/>
        </mxmlc>
    </target>

    <!-- mxmlcの実行(debug) -->
    <target name="debug-build">
        <mkdir dir="${BIN_OUTPUT}" />
        <mxmlc file="${APP_SRC}/${APP_NAME}.mxml" output="${BIN_OUTPUT}/${APP_NAME}.swf">
            <load-config filename="${FLEX_HOME}/frameworks/flex-config.xml"/>
            <load-config filename="${APP_ROOT}/build/${APP_NAME}.xml"/>
            <define name="CONFIG::DEBUG" value="true" />
            <source-path path-element="${FLEX_HOME}/frameworks"/>
        </mxmlc>
    </target>

    <!-- cleanの実行 -->
    <target name="clean">
        <delete dir="${BIN_OUTPUT}" failOnError="false" includeEmptyDirs="true" />
        <delete dir="${ASDOC_OUTPUT}" failOnError="false" includeEmptyDirs="true" />
        <delete dir="${PMD_OUTPUT}" failOnError="false" includeEmptyDirs="true" />
    </target>

    <!-- asdocの実行 -->
    <target name="document">
        <mkdir dir="${ASDOC_OUTPUT}" />
        <exec executable="${ASDOC_EXE}" failOnError="false">
            <arg line='-source-path ${APP_SRC} ${FLEX_HOME}/frameworks/'/>
            <arg line='-doc-sources ${APP_SRC}'/>
            <arg line='-window-title "${APP_NAME}"'/>
            <arg line='-output ${ASDOC_OUTPUT}'/>
            <arg line='-compiler.define CONFIG::DEBUG true'/>
        </exec>
    </target>

    <!-- flex-pmd -->
    <target name="pmd">
        <mkdir dir="${PMD_OUTPUT}" />
        <flexPmd
            sourceDirectory="${APP_SRC}"
            outputDirectory="${PMD_OUTPUT}" />
    </target>
</project>

ここまですれば

ant タスクによって、trace ログの出力する/しないを制御できるようになります。
上記の例だと、

ant -f build.xml build

だと trace ログの出ないバイナリが生成され、

ant -f build.xml debug-build

だと trace ログが出るバイナリが生成されることになります。
あとは、 CONFIG::DEBUG {trace(hoge)} を、オレオレ Logger クラス等にして共通化させてあげると良いですね。

これであなたも

小学生から卒業です!><

*1:mxmlc

*2:このCONFIG::DEBUGというのはオレオレ定義なので、各自好きな定数にして良いです

*3:=デフォルトではリリースモード扱い

Flexのプロジェクトをインテグレーションしたい

プラットフォームは Hudson 一点でおk

なので、あとはどのようにインテグレーションの設定をしていくか、という話になります。

今回のインテグレーション対象
  • Hudson で SVN をポーリングするよ
  • ant タスクでビルドするよ
  • ant タスクでASDOCを出力するよ
  • ant タスクで静的コードチェック(PMD)するよ

本当はユニットテストまで入りたかったけど、まだ UnitTest 自体手を出してないw
今後、以下のリソースを参考に導入するつもり。

Hudson の環境設定

Java5 さえあれば Hudson は起動することが可能です*1

まずは

Java5 の導入は適当にやるとして、以下から hudson.war をDLしましょう。

そうしたら、

java -jar hudson.war

で起動できます。デフォルトではポート 8080 で動くので、 localhost:8080 でアクセスしてみましょう。

ant の環境を用意する

自力で導入しても良いし、Hudson にも ant が付属してきていたと思うので、それを使えるようにしておきます。

PMD Plugin を入れる

Hudson 自身の設定画面から plugin のインストールが行えます。
画面からでも良いですし、下記のページからでも良いので、PMD Plugin を導入します*2

これで最小設定は完了。ポーリングの仕方であるとか、ユーザ管理の方法であるとかは画面を見ながらでもわかると思うので頑張ってください。二桁ブクマが行ったら詳しく解説エントリを書くかもしれません*3

Flex用インテグレーション環境を作る

ASDOC

FlexSDK に同梱されているので準備は不要です。
ちなみに、FlexSDK は下記の「Adobe Flex SDK」をDLすると良いです。

FlexPMD

以下から取得します。今回は ant から実行するので ant 版で。コマンドラインから実行したい人は command line 版をDLしましょう。というか、両方落としておくと良いと思うw

あと、コマンドラインで実行したい人はPATHを通しておくと楽でしょう。

では ant タスクを書いて行きましょう

以下のような構成になっているとします。build ディレクトリに build 関係の設定ファイルを追加しておきます。
ちなみに、ここの flex-config.xml は player のバージョンとか、デバッグ用変数の定義とかを行います*4

|-- README.txt
|-- build
|   |-- build.xml
|   `-- flex-config.xml
`-- src
    `-- hogehoge.mxml

build.xml にビルド用のタスクを既述します。以下の例では、

  • build
  • document
  • pmd
  • clean
  • all

のタスクが登録されています。all をやると、clean をしてから build, document, pmd を実施してくれます。
実際の使い方は以下の通り

# build.xml が同じディレクトリにあり、build タスクを実行する場合(デフォルトタスクは省略できる)
%ant
# build.xml と違うディレクトリに居る場合
%ant -buildfile build/build.xml
# タスクを指定する場合
%ant clean

のような感じです。各タスクの名称やデフォルトの動作は build.xml の中で定義していきます。
そして、build.xml は以下のようになってます。

<?xml version="1.0" encoding="UTF-8"?>
<project name="flexAnt" default="build" basedir="./">
        <description>
                FlexAntを用いてAirのコンパイルを行います
        </description>

        <!-- 環境によって変更されるパスの設定 -->
        <property name="FLEX_HOME" value="/opt/flex/flex_sdk_3.4.0.9271"/>
        <property name="PMD_HOME" value="/opt/flex/flex-pmd-ant-task-1.0.RC4"/>

        <!-- プロジェクトのベースディレクトリ定義 -->
        <dirname property="XML_DIR" file="${ant.file}"/>
        <property name="APP_ROOT" value="${XML_DIR}/../"/>
        <property name="APP_SRC" value="${APP_ROOT}/src"/>

        <!-- 各コマンドのパス設定 -->
        <property name="ASDOC_EXE" value="${FLEX_HOME}/bin/asdoc"/>

        <!-- 出力先ディレクトリの設定  -->
        <property name="BIN_OUTPUT" value="${APP_ROOT}/bin"/>
        <property name="ASDOC_OUTPUT" value="${APP_ROOT}/asdoc"/>
        <property name="PMD_OUTPUT" value="${APP_ROOT}/pmd"/>

        <!-- アプリケーションの名前 -->
        <property name="APP_NAME" value="hogehoge"/>

        <!-- flex用Antタスクを読み込む -->
        <taskdef resource="flexTasks.tasks" classpath="${FLEX_HOME}/ant/lib/flexTasks.jar"/>

        <!-- FlexPMD タスクの定義 -->
        <taskdef name="flexPmd" classname="com.adobe.ac.pmd.ant.FlexPmdAntTask" >
                <classpath>
                        <pathelement location="${PMD_HOME}/as3-parser-1.0.RC4.jar"/>
                        <pathelement location="${PMD_HOME}/as3-parser-api-1.0.RC4.jar"/>
                        <pathelement location="${PMD_HOME}/as3-plugin-utils-1.0.RC4.jar"/>
                        <pathelement location="${PMD_HOME}/commons-lang-2.4.jar"/>
                        <pathelement location="${PMD_HOME}/flex-pmd-ant-task-1.0.RC4.jar"/>
                        <pathelement location="${PMD_HOME}/flex-pmd-core-1.0.RC4.jar"/>
                        <pathelement location="${PMD_HOME}/flex-pmd-files-1.0.RC4.jar"/>
                        <pathelement location="${PMD_HOME}/flex-pmd-command-line-1.0.RC4.jar"/>
                        <pathelement location="${PMD_HOME}/flex-pmd-ruleset-1.0.RC4.jar"/>
                        <pathelement location="${PMD_HOME}/flex-pmd-ruleset-api-1.0.RC4.jar"/>
                        <pathelement location="${PMD_HOME}/plexus-utils-1.0.2.jar"/>
                        <pathelement location="${PMD_HOME}/pmd-4.2.2.jar"/>
                </classpath>
        </taskdef>

        <!-- 全部入り動作  -->
        <target name="all" depends="clean,build,document,pmd" description="full build of project"/>

        <!-- mxmlcの実行 -->
        <target name="build">
                <mkdir dir="${BIN_OUTPUT}" />
                <mxmlc file="${APP_SRC}/${APP_NAME}.mxml" output="${BIN_OUTPUT}/${APP_NAME}.swf">
                        <load-config filename="${FLEX_HOME}/frameworks/flex-config.xml"/>
                        <load-config filename="${APP_ROOT}/build/flex-config.xml"/>
                        <source-path path-element="${FLEX_HOME}/frameworks"/>
                </mxmlc>
        </target>

        <!-- cleanの実行 -->
        <target name="clean">
                <delete dir="${BIN_OUTPUT}" failOnError="false" includeEmptyDirs="true" />
                <delete dir="${ASDOC_OUTPUT}" failOnError="false" includeEmptyDirs="true" />
                <delete dir="${PMD_OUTPUT}" failOnError="false" includeEmptyDirs="true" />
        </target>

        <!-- asdocの実行 -->
        <target name="document">
                <mkdir dir="${ASDOC_OUTPUT}" />
                <exec executable="${ASDOC_EXE}" failOnError="false">
                        <arg line='-source-path ${APP_SRC} ${FLEX_HOME}/frameworks/'/>
                        <arg line='-doc-sources ${APP_SRC}'/>
                        <arg line='-window-title "${APP_NAME}"'/>
                        <arg line='-output ${ASDOC_OUTPUT}'/>
                </exec>
        </target>

        <!-- flex-pmd -->
        <target name="pmd">
                <mkdir dir="${PMD_OUTPUT}" />
                <flexPmd
                        sourceDirectory="${APP_SRC}"
                        outputDirectory="${PMD_OUTPUT}" />
        </target>

</project>

これを実行すると bin, asdoc, pmd ディレクトリができ、その中身成果物が生成されます。

あとは Hudson 上から実行するように ant 実行用の設定を書くだけです!

最後に

Hudson のプロジェクト設定から JavaDoc を保存する、にチェックを入れて ASDOC のパスを設定してあげると「ドキュメント」というリンクが Hudson 上にでき、いつでも最新の ASDOC を閲覧できます。
また、PMD plugin のところで PMD の出力ディレクトリ/pmd.xml と指定してあげるとコードチェックの結果を Hudson 上で閲覧でき、グラフによる指摘数の遷移も確認できるようになります。

今後の展望

Flashエンジニアしてる都合上、サーバサイドよりフロントエンド側に携わる事が多い訳で、Flash 以外にも CI を展開しようとすると、残りの対象は JS か HTML になるんですよね。

HTML に関しては

Twitterで、HTML-lintのローカル版があるよ、と教えてもらった。Web経由だと機密情報だったりする場合もあるので使えないため、ローカルであるというのはとってもありがたい。
ただ、HTML-lint はヘルプに HTML5 が無いので、今後の Web 標準に対応していってくれるのか不安が残る。今現在作成するサイトであれば有用かもしれないが・・・。というか、W3C がコマンドライン用の作ってくれてれば良いんだが。

JS に関しては

まったくファックでよくわからない。
かろうじて見つけたのは以下のツール。とりあえず、WSHのコマンドライン版があるようなのでローカルでの使用という要件にはマッチするけれど、どの程度のものなのかはよくわからん。

というわけで

今後は

  • FlexUnit でのユニットテストやっていきたいよ。
  • HTML のコードチェックしたいよ
  • JS のコードチェックしたいよ(HTMLよりは優先度低いけど)

という感じですかね。
一番上は自分で完結する範囲だけれど、その他は有効に使えればFlashチーム以外への啓蒙になるので、うまいことできる方法を探したいです。何か知っていたら教えて下しあ!><

*1:ちゃんと運用するなら内蔵されているサーブレットコンテナじゃなくて、ちゃんとした(tomcatとか?)を使う方が良いらしい

*2:静的コードチェックの結果を表示するため

*3:あさましい!

*4:DEBUGモードの場合でのみ、traceを発行するように切り替えたりするため