DITAコンテンツの自動ビルド環境をこしらえる.

久しぶりのDITAネタ.スタンドアロンビルドで必要な,あらかたの課題はid:mitsu48が解決してしまっている.ので,斜め上45度のネタにしてみる.

id:ditahack氏の「監視フォルダにポストされたDITAソース・ファイルに対してDITA-OTを自動実行する方法」を読んだ後,プログラマなら,それしたいならCIツール使えば良いのではないの? と思うはず.CrouseControl Continuum も,antをスクリプトとして食わせることができるし,CVSSVN といった SCMツールとの連携もバッチリだし.
直感としては,できないはずは無さげ.でも,動かしてナンボ.
動かしたい,しかし,サンプルになりそうな社内のditaコンテンツは id:mitsu48 を中心として絶賛進行中,変に手をだして進行を妨げるのは申し訳なかったので,周辺情報の収集に勉めることにしていた.

そのコンテンツも最初のタグが打たれた.さて,自動ビルドの設定を始めるか.

CruiseControl or Continuum

antとの親和性の高さや,変にデプロイにアレコレとクチを挟んでこないところを考えると,DITA-OTのコンテンツは,CruiseControlのほうが親和性が高いような気はする.
しかし,ビルド環境の再現性を考えると,Mavenを使いたくなる.Mavenとの親和性は,Continuum に抜群に分がある.
どれも一長一短.この辺は,管理者の趣味とかプロジェクトの方向性で決まってくる話ではある.今回は,Continuumを使ってみた.

pom.xml の記述.

DITA-OTは,antと密に結合している.よってMavenと絡めるのは,難しく感じられるかもしれない.けれども,Mavenにはantrunというプラグインがあって,build.xmlと等価な記述をpom.xmlに含めることが可能だ.
Maven用のDITA-OTプラグインを颯爽と作ったりするとカッコイイのだけれど,今回は弱々しくantrunで逃げた.

MavenからDITA-OTのbuild.xmlの呼出しには,一手間が必要.事前にCLASSPATHに書くべきクラスがあるので,これらを上手く解決しなければならない.
Continuumの起動前にCLASSPATHを設定しておくのが,最も簡単.けれども後日の環境再現性に問題があるし,同じビルドサーバを使っている他のプロジェクトへの影響が心配になる.
Continuumは,ビルド前に環境変数の設定を行える.これが次善の策.ただし,後日の環境再現性が心配.手作業が入るのもリリースマネージメントの観点では避けたい.
今回は,pom.xml に全てを記述することにした.具体的には,こんな感じ.

        <execution>
          <id>dita-ot</id>
          <phase>compile</phase>
          <configuration>
            <tasks>
                <ant antfile="build.xml" dir="jp.pizzafactory.docs.manual/ditasrc/" />
            </tasks>
          </configuration>
          <goals>
            <goal>run</goal>
          </goals>
        </execution>
        </executions>
        <dependencies>
          <dependency>
            <groupId>org.apache.ant</groupId>
            <artifactId>ant-trax</artifactId>
            <version>1.7.1</version>
          </dependency>
          <dependency>
          <groupId>org.apache.ant</groupId>
            <artifactId>ant-nodeps</artifactId>
            <version>1.7.1</version>
          </dependency>
          <dependency>
            <groupId>dita-ot</groupId>
            <artifactId>resolver</artifactId>
            <version>1.4.3</version>
          </dependency>
          <dependency>
            <groupId>dita-ot</groupId>
            <artifactId>CatalogManager</artifactId>
            <version>1.4.3</version>
          </dependency>
          <dependency>
            <groupId>dita-ot</groupId>
            <artifactId>dost</artifactId>
            <version>1.4.3</version>
          </dependency>
          <dependency>
            <groupId>dita-ot.saxon9</groupId>
            <artifactId>saxon9</artifactId>
            <version>1.4.3</version>
          </dependency>
          <dependency>
            <groupId>dita-ot.saxon9</groupId>
            <artifactId>saxon9-dom</artifactId>
            <version>1.4.3</version>
          </dependency>
        </dependencies>
      </plugin>

リポジトリを立てる必要があって,pom.xmlにはその位置を明示する必要がある.

  <repositories>
    <repository>
      <id>pizza-mvn</id>
      <name>Maven repository provided by PizzaFactory team</name>
      <url>http://pizza-mvn.sourceforge.jp/repository/</url>
    </repository>
  </repositories>

DITA-OTに固有なのは,これくらい.fop.xconf のパス問題で姑息な逃げが必要になるのだけれど,それはfopの問題.あとは,MavenというかContinuumの知識で乗り越えられる.