Hudson + Maven2(マルチプロジェクト構成)からS2JDBC-GENのmigrateを実行するときの問題
Hudson + Maven2(マルチプロジェクト構成)でMavenのmaven-antrun-pluginを使って、S2JDBC-GENのmigrateタスクを実行しようとしたとき(長い)、migrateDirとddlinfofileのパスが一つ上のディレクトリを指しててうまく行かなかった。
Mavenの構成としてはこう。HudsonはMaven2のプロジェクトに対応しているからMavenで構成されたプロジェクトを登録するのは簡単。SVNの設定をするのとビルドの時間を設定するくらいでほんとど何もしなくても設定できる(Maven2はインストールされてないとだめだけど。自動インストールってのもあったけど今回はすでにインストールされているものがあったのでそれを使った)
Parent +----child-pj1 +----child-db1 | +------s2jdbc-gen-build.xml | `------pom.xml `----pom.xml
(ちなみにHudsonのSVNの指定ではこのParenを指定すると、子供のプロジェクトも自動的に検出してくれる)
child-db1がS2JDBCのプロジェクトで、ここのpom.xmlに以下のようにテスト時のコンパイル後に「migrate」タスクを実行するようにしていた。
<plugin> <artifactId>maven-antrun-plugin</artifactId> <executions> <execution> <id>migrate</id> <phase>test-compile</phase> <configuration> <tasks name="migrate"> <ant antfile="${basedir}/s2jdbc-gen-build.xml" dir="${basedir}"> <target name="migrate" /> </ant> </tasks> </configuration> <goals> <goal>run</goal> </goals> </execution> </executions> <dependencies> <dependency> <groupId>org.apache.ant</groupId> <artifactId>ant</artifactId> <version>1.7.0</version> </dependency> </dependencies>
が、これだけだと前述した問題が発生するためうまくmigrateできない。Hudsonのコンソールに出力されたのは以下のような内容。
[INFO] ------------------------------------------------------------------------ [INFO] Building WsGroupPlDatabase [INFO] task-segment: [install] [INFO] ------------------------------------------------------------------------ [INFO] [resources:resources] [WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent! [INFO] Copying 17 resources [INFO] [compiler:compile] [INFO] Nothing to compile - all classes are up to date [INFO] [resources:testResources] [WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent! [INFO] Copying 10 resources [INFO] [compiler:testCompile] [INFO] Nothing to compile - all classes are up to date [INFO] [antrun:run {execution: migrate}] [INFO] Executing tasks [echo] basedir : /root/.hudson/jobs/Parent/workspace/Parent/child-db1 [taskdef] Could not load definitions from resource s2jdbc-gen-task-ext.properties. It could not be found. migrate: [migrate] 2009-10-28 16:01:22,975 [main] INFO org.seasar.extension.jdbc.gen.internal.command.MigrateCommand - S2JDBC-Gen, 2.4.39-SNAPSHOT [migrate] 2009-10-28 16:01:22,978 [main] DEBUG org.seasar.extension.jdbc.gen.internal.command.MigrateCommand - org.seasar.extension.jdbc.gen.internal.command.MigrateCommand [migrate] 2009-10-28 16:01:22,979 [main] DEBUG org.seasar.extension.jdbc.gen.internal.command.MigrateCommand - statementDelimiter, ; [migrate] 2009-10-28 16:01:22,980 [main] DEBUG org.seasar.extension.jdbc.gen.internal.command.MigrateCommand - blockDelimiter, null [migrate] 2009-10-28 16:01:22,980 [main] DEBUG org.seasar.extension.jdbc.gen.internal.command.MigrateCommand - haltOnError, true [migrate] 2009-10-28 16:01:22,981 [main] DEBUG org.seasar.extension.jdbc.gen.internal.command.MigrateCommand - schemaInfoFullTableName, SCHEMA_INFO [migrate] 2009-10-28 16:01:22,981 [main] DEBUG org.seasar.extension.jdbc.gen.internal.command.MigrateCommand - schemaInfoColumnName, VERSION [migrate] 2009-10-28 16:01:22,982 [main] DEBUG org.seasar.extension.jdbc.gen.internal.command.MigrateCommand - ddlFileEncoding, UTF-8 [migrate] 2009-10-28 16:01:22,983 [main] DEBUG org.seasar.extension.jdbc.gen.internal.command.MigrateCommand - migrateDir, /root/.hudson/jobs/Parent/workspace/Parent/db/migrate [migrate] 2009-10-28 16:01:22,983 [main] DEBUG org.seasar.extension.jdbc.gen.internal.command.MigrateCommand - versionNoPattern, 0000 [migrate] 2009-10-28 16:01:22,984 [main] DEBUG org.seasar.extension.jdbc.gen.internal.command.MigrateCommand - ddlInfoFile, /root/.hudson/jobs/Parent/workspace/Parent/db/ddl-info.txt
と、分かりにくいけど最後の行と最後から3行目の部分で、migrateDirとddlInfoFileの場所が違うのが分かる。
/root/.hudson/jobs/Parent/workspace/Parent/db/migrate /root/.hudson/jobs/Parent/workspace/Parent/db/ddl-info.txt ↓本来こうあってほしい /root/.hudson/jobs/Parent/workspace/Parent/child-db1/db/migrate /root/.hudson/jobs/Parent/workspace/Parent/child-db1/db/ddl-info.txt
s2jdbc-gen-build.xmlのbasedirが正しく認識されていないのかと思いログを出してみたんだけど、この${basedir}の値は期待したものが表示される。
結局分からなかったので以下のようにs2jdbc-gen-build.xmlのmigrateタスクのオプションにmigratedir, ddlinfofileというオプションを渡せるのでここを絶対パスで指定するようにするとうまく行った。
<target name="migrate"> <migrate classpathdir="${classpathdir}" rootpackagename="${rootpackagename}" entitypackagename="${entitypackagename}" applyenvtoversion="${applyenvtoversion}" version="${version}" env="${env}" jdbcmanagername="${jdbcmanagername}" classpathref="classpath" migratedir="${basedir}/db/migrate" ddlinfofile="${basedir}/db/ddl-info.txt" /> </target>
上記のように${basedir}/db/migrate、${basedir}/db/ddl-info.txtとしてやると思ったとおりの場所を認識したみたいで、migrateもうまく行きました。ちょっとかっこ悪いけど。