デプロイとビルド

この記事は Asakusa Framework Advent Calendar 2013 の21日目の記事として書いています.

前回が リリースとデプロイ だったので, 今回は運用側から開発側にもう1段階戻って「デプロイとビルド」について書きます.

Asakusa バッチのビルド

Asakusa バッチプロジェクトは長らく Maven を使って, ビルドの管理が行われてきました. そこに最近 Gradle が使えるようになりました. これらのツールが担ってきた役割を振り返ってみます.

  1. Asakusa バッチ開発環境の作成

    ${ASAKUSA_HOME} 以下に Asakusa バッチ開発環境を作成する. バッチのビルドで使用する.

  2. Eclipse 設定ファイルの生成

    .classpath, .settings などの Eclipse の設定ファイルを生成する. 後述の Asakusa によって自動生成される Java クラスへのパスもクラスパブに追加される.

  3. ExporterDescription/ImporterDescription, Operator Factory などの Java ソースコードの自動生成

    DMDL から生成されるモデルクラスや Exporter/Importer のクラス, 演算子を取得するときに使う Factory クラスの Java ソースコードを生成する

  4. Asakusa バッチアプリケーションのビルド

    batchapps.jar を作る

  5. Asakusa バッチ運用環境モジュールの作成

    リリース用のモジュールを作成する

Asakusa バッチアプリケーションのリリースでは大きく2つのモジュールをリリースします. 1つが Asakusa 実行環境, もう1つが Asakusa バッチアプリケーションです. この構成はちょっと変則的で最初は戸惑うと思います.

例えば, Tomcat に .war ファイルをデプロイするときは, 実行環境である Tomcat は最初に1度運用環境にインストールするだけです. war をデプロイするごとに, Tomcat をインストールし直したりはしません. それが Asakusa ではリリースのたびに運用環境ごとインストールします.

加えて, Tomcat では .war ファイルを ${CATALINA_HOME}/webapps 以下に置いておけば, Tomcat が勝手に展開してくれます. (前回展開したものは消しておかないといけませんが) 今のところこれに相当する機能は無いようです. あると便利だと思うのですが(チラッ, チラッ

現在 Asaksua バッチプロジェクトでは, 使用する Asakusa Framework のバージョンはバッチごとに指定する形になっています. そして, 運用環境とバッチアプリケーションの Asakusa Framework バージョンが合わない場合, 異常終了することがあります. 最近, Asakusa Framework のメーリングリストでもこの話題が出ていました. → https://groups.google.com/a/asakusafw.com/forum/#!topic/users/-TM1s1vdFVM

Asakusa Framework の機能がバージョンが上がるにつれ増えているので, バッチごとに運用環境のバージョンが異なる方が便利なのかもしれません.

Maven

Maven を使ったビルド方法について見て行きます.

Maven は pom.xml という .xml ファイルに設定を書きます. 思想としてはビルド設定を静的に書くことになっています. けっこうビルドプロセスをガチガチに書く感覚があって, 私は好きなのですが, 非常に嫌う人もいるようです. ガチガチと言っても antrun プラグインとかいう Ant スクリプトを実行できる鬼っ子もいます.

さて, そんなガチガチの Maven では1つのプロジェクトから作れる成果物 (Maven では “artifact” と言います) は1つだけです. しかしバージョン 0.5 より前のバージョンでは Asakusa バッチプロジェクトは, 少なくとも「Asakusa バッチ運用環境モジュール」と「Asakusa バッチアプリケーション」の2つの成果物を作成しなければいけません. それをどう解決しているかというと, assembly plugin の descriptorRef という設定を使っています. これを設定して mvn assembly:single コマンドを実行することで, Asakusa 運用環境モジュールを作成しています. Asakusa バッチアプリケーションは mvn package コマンドで作成します.

この手順をコマンドで書くと以下のようになります.

#ASAKUSA_HOME=(Asakusa Frameworkデプロイ先のパス)
cp /tmp/asakusa-app/example-app-batchapps-1.0.0.jar "$ASAKUSA_HOME/batchapps"
cd "$ASAKUSA_HOME/batchapps"
jar -xf example-app-batchapps-1.0.0.jar
rm -f example-app-batchapps-1.0.0.jar
rm -fr META-INF

(引用: http://docs.asakusafw.com/0.5.2/release/ja/html/administration/deployment-with-windgate.html 「バッチアプリケーションのデプロイ」)

最後に本番環境に持っていくために, 全体を .tar.gz ファイルに固めて完了です.

tar cvf "$ASAKUSA_HOME" asakusa-batch-archive.tar.gz

Maven コマンド一発でデプロイモジュールが作れないのはやや面倒ですね. (自動化してしまえば良いのですが)

(引用: http://docs.asakusafw.com/0.5.2/release/ja/html/administration/deployment-with-windgate.html 「バッチアプリケーションのデプロイ」)

参照: Asakusa Frameworkのインストールアーカイブの作成 http://docs.asakusafw.com/0.4.0/release/ja/html/administration/deployment-with-windgate.html#asakusa-framework

参照: バッチコンパイルの実行 http://docs.asakusafw.com/0.4.0/release/ja/html/application/maven-archetype.html

Framework Organizer

さすがにこの「2 つの役割を 1 つの Maven 設定ファイルに持たせる」構成はややこしかったのか, Asakusa Framework 0.5.0 からは「Asakusa Framework 運用環境」を作るプロジェクトと Asakusa バッチアプリケーションを作るプロジェクトが分かれました.

Asakusa Framework 0.5.0 以降には「Asakusa Framework 運用環境」を作成する専用のプロジェクト framework-organizer が用意されています.

http://docs.asakusafw.com/0.5.2/release/ja/html/administration/framework-organizer.html

そして, このバージョンから Asakusa バッチプロジェクトから Asakusa Framework 運用環境を作ることはできなくなりました.

しかし, 運用環境モジュールの .tar.gz ファイルと batchapps.jar が別々に作成されることには変わりありません. そのため運用環境のデプロイと batchapps.jar のデプロイの 2 段階の作業が必要で, 手間は 0.5.0 以前から減らずにそのままです.

参照: バッチアプリケーションのデプロイ http://docs.asakusafw.com/0.5.2/release/ja/html/administration/deployment-with-windgate.html#id22

Gradle

Framework Organizar とは別方向での解決を図ったのが Asakusa Gradle Plugin です.

参考: Asakusa Gradle Plugin利用ガイド http://docs.asakusafw.com/0.5.2/release/ja/html/application/gradle-plugin.html

この仕組みは役割を 2 つに分けるのではなく, 1 つのプロジェクトで全てを統合するためのものです. ビルド管理ツールに Maven ではなく Gradle を使うことで, その仕組みを実現しています.

Gradle についてうかつなこと書くとマサカリが飛んできそうで怖いのですが, 簡単に説明すると「Maven のような, ビルドに関わる個々の処理とその依存関係, 使用するライブラリとその依存関係を管理し, 個々の作業に処理を差し込めるビルド管理ツール」です. Maven (の特に他人が組み上げたビルドプロセス) では難しかった処理の差し込みができるところが便利です.

Gradle Plugin を使用するプロジェクトの雛形とサンプルはこのページ (http://docs.asakusafw.com/0.5.2/release/ja/html/application/gradle-plugin.html) にあります. Gradle のコマンドが .jar ファイルとそれを呼び出すラッパースクリプトの gradlew, gradlew.bat とともに配布されており, 新たに Gradle をインストールする手間がありません.

この Gradle Plugin の使い方を見ていきましょう. 細かいところは本家のページ (http://docs.asakusafw.com/0.5.2/release/ja/html/application/gradle-plugin.html) を参照してください. Gradle そのものの用語や使い方は Gradle User Guide (http://gradle.monochromeroad.com/docs/userguide/userguide.html) を参照してください.

これ以降のコマンド操作は, Gradle Plugin を使用したプロジェクトのサンプルを使用したものとして記述します. まだサンプルプロジェクトをダウンロードしていない場合は, 以下のコマンドを実行してください. gradle の設定ファイルである build.gradle ファイルの内容はブログ記述時点でのものです.

$ wget http://www.asakusafw.com/download/gradle-plugin/asakusa-example-project-0.5.2.tar.gz
$ tar xvf asakusa-example-project-0.5.2.tar.gz
$ cd asakusa-example-project
$ cat build.gradle
buildscript {
    repositories {
        maven { url 'http://asakusafw.s3.amazonaws.com/maven/releases' }
    }
    dependencies {
        classpath group: 'com.asakusafw', name: 'asakusa-gradle-plugins', version: '0.5.2'
    }
}

apply plugin: 'asakusafw'
apply plugin: 'asakusafw-organizer'
apply plugin: 'eclipse'

asakusafw {
    asakusafwVersion = '0.5.2'

    modelgen {
        modelgenSourcePackage 'com.example.modelgen'
    }
    compiler {
        compiledSourcePackage 'com.example.batchapp'
    }
}

asakusafwOrganizer {
    asakusafwVersion = "${asakusafw.asakusafwVersion}"
}

dependencies {
    compile group: 'com.asakusafw.sdk', name: 'asakusa-sdk-core', version: "${asakusafw.asakusafwVersion}"
    compile group: 'com.asakusafw.sdk', name: 'asakusa-sdk-directio', version: "${asakusafw.asakusafwVersion}"
    compile group: 'com.asakusafw.sdk', name: 'asakusa-sdk-windgate', version: "${asakusafw.asakusafwVersion}"

    provided (group: 'org.apache.hadoop', name: 'hadoop-client', version: '1.2.1') {
        exclude(module: 'junit')
        exclude(module: 'mockito-all')
        exclude(module: 'slf4j-log4j12')
    }
}

Gradle タスクの一覧表示

Gradle の様々な操作は gradlew にタスク名を与えることで行います. Gradle 本体やプラグインに定義されたタスク一覧は tasks タスクで表示できます.

$ ./gradlew tasks
:tasks

------------------------------------------------------------
All tasks runnable from root project
------------------------------------------------------------

Asakusa Framework Build tasks
-----------------------------
compileBatchapp - Compiles the Asakusa DSL java source with Asakusa DSL Compiler.
compileDMDL - Compiles the DMDL scripts with DMDL Compiler.
jarBatchapp - Assembles a jar archive containing compiled batch applications.

Asakusa Framework Build Tool tasks
----------------------------------
generateTestbook - Generates the template Excel books for TestDriver.

Asakusa Framework Organizer tasks
---------------------------------
assembleAsakusafw - Assembles a tar archive containing framework files for deployment.
assembleCustomAsakusafw - Assembles a tar archive containing custom framework configuration files.
assembleDevAsakusafw - Assembles a tar archive containing framework files for development.
attachAssemble - Attachs framework files to assembly with default configuration.
attachAssembleDev - Attachs application development environment files to assembly.
attachBatchapps - Attachs batch application files to assembly.
attachComponentCore - Attachs framework core component files to assembly.
attachComponentDevelopment - Attachs developent tool files to assembly.
attachComponentDirectIo - Attachs Direct I/O component files to assembly.
attachComponentOperation - Attachs operation tool files to assembly.
attachComponentWindGate - Attachs WindGate component files to assembly.
attachComponentYaess - Attachs YAESS component files to assembly.
attachExtensionWindGateRetryable - Attachs WindGateRetryable files to assembly.
attachExtensionYaessJobQueue - Attachs YaessJobQueue files to assembly.
cleanAssembleAsakusafw - Deletes the assemble working directory.
installAsakusafw - Installs framework files to $ASAKUSA_HOME.

Build tasks
-----------
assemble - Assembles the outputs of this project.
build - Assembles and tests this project.
buildDependents - Assembles and tests this project and all projects that depend on it.
buildNeeded - Assembles and tests this project and all projects it depends on.
classes - Assembles classes 'main'.
clean - Deletes the build directory.
jar - Assembles a jar archive containing the main classes.
testClasses - Assembles classes 'test'.

Build Setup tasks
-----------------
setupBuild - Initializes a new Gradle build. [incubating]
wrapper - Generates Gradle wrapper files. [incubating]

Documentation tasks
-------------------
javadoc - Generates Javadoc API documentation for the main source code.

Help tasks
----------
dependencies - Displays all dependencies declared in root project 'asakusa-example-project'.
dependencyInsight - Displays the insight into a specific dependency in root project 'asakusa-example-project'.
help - Displays a help message
projects - Displays the sub-projects of root project 'asakusa-example-project'.
properties - Displays the properties of root project 'asakusa-example-project'.
tasks - Displays the tasks runnable from root project 'asakusa-example-project'.

IDE tasks
---------
cleanEclipse - Cleans all Eclipse files.
eclipse - Generates all Eclipse files.

Verification tasks
------------------
check - Runs all checks.
test - Runs the unit tests.

Rules
-----
Pattern: build<ConfigurationName>: Assembles the artifacts of a configuration.
Pattern: upload<ConfigurationName>: Assembles and uploads the artifacts belonging to a configuration.
Pattern: clean<TaskName>: Cleans the output files of a task.
Pattern: attachConf<Target>: Attachs asakusafw custom distribution files to assembly.

To see all tasks and more detail, run with --all.

BUILD SUCCESSFUL

Total time: 21.558 secs

Asakusa バッチアプリケーションの作成

Asakusa バッチアプリケーションを作成するには jarBatchapp タスクを使います.

$ ./gradlew clean jarBatchapp
$ ls build/asakusa-example-project-batchapps.jar
build/asakusa-example-project-batchapps.jar
## できた!!
## 中身はこんな感じ.
$ jar tvf build/asakusa-example-project-batchapps.jar
     0 Sat Dec 21 21:01:04 JST 2013 META-INF/
    25 Sat Dec 21 21:01:04 JST 2013 META-INF/MANIFEST.MF
     0 Sat Dec 21 21:01:04 JST 2013 example.summarizeSales/
     0 Sat Dec 21 21:01:04 JST 2013 example.summarizeSales/etc/
   331 Sat Dec 21 21:01:04 JST 2013 example.summarizeSales/etc/build.log
  1414 Sat Dec 21 21:01:04 JST 2013 example.summarizeSales/etc/yaess-script.properties
     0 Sat Dec 21 21:01:04 JST 2013 example.summarizeSales/lib/
 43371 Sat Dec 21 21:01:04 JST 2013 example.summarizeSales/lib/jobflow-byCategory-sources.jar
129264 Sat Dec 21 21:01:04 JST 2013 example.summarizeSales/lib/jobflow-byCategory.jar
     0 Sat Dec 21 21:01:04 JST 2013 example.summarizeSales/opt/
     0 Sat Dec 21 21:01:04 JST 2013 example.summarizeSales/opt/dsl-analysis/
     0 Sat Dec 21 21:01:04 JST 2013 example.summarizeSales/opt/dsl-analysis/batch/
  5321 Sat Dec 21 21:01:04 JST 2013 example.summarizeSales/opt/dsl-analysis/batch/compiled-merged-structure.dot
  5549 Sat Dec 21 21:01:04 JST 2013 example.summarizeSales/opt/dsl-analysis/batch/compiled-structure.dot
  3996 Sat Dec 21 21:01:04 JST 2013 example.summarizeSales/opt/dsl-analysis/batch/compiled-structure.txt
  1100 Sat Dec 21 21:01:04 JST 2013 example.summarizeSales/opt/dsl-analysis/batch/original-merged-structure.dot
  1299 Sat Dec 21 21:01:04 JST 2013 example.summarizeSales/opt/dsl-analysis/batch/original-structure.dot
  2053 Sat Dec 21 21:01:04 JST 2013 example.summarizeSales/opt/dsl-analysis/batch/original-structure.txt
     0 Sat Dec 21 21:01:04 JST 2013 example.summarizeSales/opt/dsl-analysis/jobflow/
     0 Sat Dec 21 21:01:04 JST 2013 example.summarizeSales/opt/dsl-analysis/jobflow/byCategory/
  2457 Sat Dec 21 21:01:04 JST 2013 example.summarizeSales/opt/dsl-analysis/jobflow/byCategory/flowgraph.dot
  1053 Sat Dec 21 21:01:04 JST 2013 example.summarizeSales/opt/dsl-analysis/jobflow/byCategory/stageblock-1.dot
  1794 Sat Dec 21 21:01:04 JST 2013 example.summarizeSales/opt/dsl-analysis/jobflow/byCategory/stageblock-2.dot
   999 Sat Dec 21 21:01:04 JST 2013 example.summarizeSales/opt/dsl-analysis/jobflow/byCategory/stageblock-3.dot
  3505 Sat Dec 21 21:01:04 JST 2013 example.summarizeSales/opt/dsl-analysis/jobflow/byCategory/stagegraph.dot
     0 Sat Dec 21 21:01:04 JST 2013 example.summarizeSales/usr/
     0 Sat Dec 21 21:01:04 JST 2013 example.summarizeSales/usr/lib/

Asakusa 運用環境モジュールの作成

Asakusa 運用環境モジュールを作成するには assembleAsakusafw タスクを使います.

$ ./gradlew clean assembleAsakusafw
$ ls build/asakusafw-0.5.2.tar.gz
build/asakusafw-0.5.2.tar.gz
## できた!!
## 中身はこんな感じ.
$ tar tvf build/asakusafw-0.5.2.tar.gz
-rw-r--r--  0 0      0         235 12 21 20:58 VERSION
drwxr-xr-x  0 0      0           0 12 21 20:58 batchapps/
-rw-r--r--  0 0      0           0 12 21 20:58 batchapps/.DELETEME
drwxr-xr-x  0 0      0           0 12 21 20:58 core/
...

バッチを入れ込んだ運用環境モジュール

ここまでは Maven にもあった機能です. Asakusa バッチアプリケーションを入れ込んだ状態の運用環境モジュールを作成するには attachBatchapps タスクを使います. 今回はバッチアプリケーションを .jar に固める必要は無いため jarBatchapp タスクではなく compileBatchapp タスクを使います. 最後に成果物全体を assembleAsakusafw で .tar.gz ファイルにまとめて完了です.

$ ./gradlew clean compileBatchapp attachBatchapps assembleAsakusafw
$ ls build/asakusafw-0.5.2.tar.gz
build/asakusafw-0.5.2.tar.gz
## できた!!
## 中身はこんな感じ. batchapps 以下に batchapps.jar の中身が増えている.
$ tar tvf build/asakusafw-0.5.2.tar.gz
-rw-r--r--  0 0      0         235 12 21 20:49 VERSION
drwxr-xr-x  0 0      0           0 12 21 20:49 batchapps/
-rw-r--r--  0 0      0           0 12 21 20:49 batchapps/.DELETEME
drwxr-xr-x  0 0      0           0 12 21 20:49 batchapps/example.summarizeSales/
drwxr-xr-x  0 0      0           0 12 21 20:49 batchapps/example.summarizeSales/etc/
-rw-r--r--  0 0      0         331 12 21 20:49 batchapps/example.summarizeSales/etc/build.log
-rw-r--r--  0 0      0        1414 12 21 20:49 batchapps/example.summarizeSales/etc/yaess-script.properties
drwxr-xr-x  0 0      0           0 12 21 20:49 batchapps/example.summarizeSales/lib/
-rw-r--r--  0 0      0       43371 12 21 20:49 batchapps/example.summarizeSales/lib/jobflow-byCategory-sources.jar
-rw-r--r--  0 0      0      129249 12 21 20:49 batchapps/example.summarizeSales/lib/jobflow-byCategory.jar
drwxr-xr-x  0 0      0           0 12 21 20:49 batchapps/example.summarizeSales/opt/
drwxr-xr-x  0 0      0           0 12 21 20:49 batchapps/example.summarizeSales/opt/dsl-analysis/
drwxr-xr-x  0 0      0           0 12 21 20:49 batchapps/example.summarizeSales/opt/dsl-analysis/batch/
-rw-r--r--  0 0      0        5321 12 21 20:49 batchapps/example.summarizeSales/opt/dsl-analysis/batch/compiled-merged-structure.dot
-rw-r--r--  0 0      0        5549 12 21 20:49 batchapps/example.summarizeSales/opt/dsl-analysis/batch/compiled-structure.dot
-rw-r--r--  0 0      0        3996 12 21 20:49 batchapps/example.summarizeSales/opt/dsl-analysis/batch/compiled-structure.txt
-rw-r--r--  0 0      0        1100 12 21 20:49 batchapps/example.summarizeSales/opt/dsl-analysis/batch/original-merged-structure.dot
-rw-r--r--  0 0      0        1299 12 21 20:49 batchapps/example.summarizeSales/opt/dsl-analysis/batch/original-structure.dot
-rw-r--r--  0 0      0        2053 12 21 20:49 batchapps/example.summarizeSales/opt/dsl-analysis/batch/original-structure.txt
drwxr-xr-x  0 0      0           0 12 21 20:49 batchapps/example.summarizeSales/opt/dsl-analysis/jobflow/
drwxr-xr-x  0 0      0           0 12 21 20:49 batchapps/example.summarizeSales/opt/dsl-analysis/jobflow/byCategory/
-rw-r--r--  0 0      0        2457 12 21 20:49 batchapps/example.summarizeSales/opt/dsl-analysis/jobflow/byCategory/flowgraph.dot
-rw-r--r--  0 0      0        1053 12 21 20:49 batchapps/example.summarizeSales/opt/dsl-analysis/jobflow/byCategory/stageblock-1.dot
-rw-r--r--  0 0      0        1794 12 21 20:49 batchapps/example.summarizeSales/opt/dsl-analysis/jobflow/byCategory/stageblock-2.dot
-rw-r--r--  0 0      0         999 12 21 20:49 batchapps/example.summarizeSales/opt/dsl-analysis/jobflow/byCategory/stageblock-3.dot
-rw-r--r--  0 0      0        3505 12 21 20:49 batchapps/example.summarizeSales/opt/dsl-analysis/jobflow/byCategory/stagegraph.dot
drwxr-xr-x  0 0      0           0 12 21 20:49 core/
...

設定ファイルを入れ込んだ運用環境モジュール

さらに便利な機能として, 設定ファイルなど追加のファイルをデプロイモジュールに差し込む機能があります. タスク名は固定ではなく attachConfディストリビューション名 となります. ディストリビューション名は, 差し込むファイル群の基底ディレクトリ名として使われます. ディストリビューション名の同一性の判定は大文字小文字を無視して行われるので, タスク名を attachConfStaging, ディレクトリ名を staging というふうに自然な名前が付けられます.

参照: 設定ファイル/アプリケーションライブラリの同梱 http://docs.asakusafw.com/0.5.2/release/ja/html/application/gradle-plugin.html

YAESS, WindGate, Direct I/O などの設定ファイルの内容は, デプロイする環境に合わせて上書きしなければなりません. ここでは YAESS の設定ファイルを Hadoop クラスタをリモートに用意した場合のものに置き換えてみます.

## ディストリビューション名は "production" とする.
$ mkdir -p src/dist/production/yaess/conf
$ emacs src/dist/production/yaess/conf/yaess.properties
core = com.asakusafw.yaess.basic.BasicCoreProfile
core.version = 0.1

## file lock
lock = com.asakusafw.yaess.basic.BasicLockProvider
lock.scope = world
lock.directory = ${ASAKUSA_HOME}/yaess/var/lock

## logging monitor
monitor = com.asakusafw.yaess.basic.BasicMonitorProvider
monitor.stepUnit = 0.05

## single threaded job scheduler
scheduler = com.asakusafw.yaess.basic.BasicJobScheduler

## local direct execution
#hadoop = com.asakusafw.yaess.basic.BasicHadoopScriptHandler
#hadoop.resource = hadoop-master
#hadoop.env.HADOOP_CMD = /usr/bin/hadoop
#hadoop.env.ASAKUSA_HOME = ${ASAKUSA_HOME}

command.* = com.asakusafw.yaess.basic.BasicCommandScriptHandler
command.*.resource = asakusa
#command.*.env.HADOOP_CMD = /usr/bin/hadoop
command.*.env.ASAKUSA_HOME = ${ASAKUSA_HOME}

## multi-threaded job scheduler (requires asakusa-yaess-paralleljob plug-in)
#scheduler = com.asakusafw.yaess.paralleljob.ParallelJobScheduler
#scheduler.parallel.default = 3
#scheduler.parallel.hadoop-master = 1

## remote execution via SSH (requires asakusa-yaess-jsch plug-in)
hadoop = com.asakusafw.yaess.jsch.SshHadoopScriptHandler
hadoop.ssh.user=asakusa
hadoop.ssh.host=xxx.xxx.xxx.xxx
hadoop.ssh.port=22
hadoop.ssh.privateKey=${HOME}/.ssh/id_dsa
hadoop.ssh.passPhrase=
hadoop.resource = hadoop-master
hadoop.env.HADOOP_CMD = /usr/bin/hadoop
hadoop.env.ASAKUSA_HOME = ${ASAKUSA_HOME}

#command.* = com.asakusafw.yaess.jsch.SshCommandScriptHandler
#command.*.ssh.user=asakusa
#command.*.ssh.host=localhost
#command.*.ssh.port=22
#command.*.ssh.privateKey=${HOME}/.ssh/id_dsa
#command.*.ssh.passPhrase=
#command.*.resource = asakusa
#command.*.env.HADOOP_CMD = /usr/bin/hadoop
#command.*.env.ASAKUSA_HOME = ${ASAKUSA_HOME}"local direct execution" の設定をコメントアウトして,
"remote execution via SSH (requires asakusa-yaess-jsch plug-in)" の設定を有効化した.

$ ./gradlew clean compileBatchapp attachBatchapps attachConfProduction assembleAsakusafw
$ ls build/asakusafw-0.5.2.tar.gz
build/asakusafw-0.5.2.tar.gz
## できた!!
## yaess.properties の内容が上書きされている.
$ tar xOf build/asakusafw-0.5.2.tar.gz yaess/conf/yaess.properties

無事, 独自に用意した設定ファイルに置き換わっています. これだけの機能があれば, デプロイモジュールを作るのに困らなそうですね.

余談: 発端

この記事を書くきっかけとなったのは, Asakusa Advent Calendar 2013 7日目の記事である Asakusa Frameworkを始めてみました でした.

そこにある「バッチのデプロイ(配置)が面倒だった」という部分を読んで, こんな会話をして, デプロイモジュールを作る話を書くことにしたのでした.

始めたばかりのときに分からないこと, 引っ掛かかることは慣れてしまうと忘れてしまうので, 記事に書いておいてもらえるのは有難いことです.