miauのブログ

はてなダイアリー「miauの避難所」をはてなブログに移行しました

Maven(wagon-cifs)で Windows 共有フォルダにデプロイする

TracLightning と相性がいい気がしたので、Windows 共有フォルダにデプロイするための wagon-cifs という Maven エクステンションを試してみました。

まあこれを使わなくても、ほとんどのケースでは Hudson に任せてしまえばいい、ということに後で気づいたんですが・・・それでも役に立つケースはあると思うので書いておきます。

経緯

今回の案件では TracLightning を使って Trac/SVN/Hudson といった環境を一気に整えているわけですが、TracLightningMaven リポジトリやプロジェクトサイトの設定も行われているので、特に Java の開発を行っている場合、これ一台で色々とまかなえて非常に便利です。

ただ、このサーバでビルドが実行されると Trac 等のレスポンスが遅くなってしまうので、ビルド自体は別のサーバで行われるよう、Hudson は分散ビルド構成にしています。・・・といったところで、ふと疑問が。「スレーブ側でビルドした諸々をマスターの Maven リポジトリやプロジェクトサイトに展開するにはどうすればいいんだろう?」

今まではプロジェクトサイトや社内リポジトリLinux で構築していたので Maven のデプロイ設定は scp://〜 のような形で簡単に書けたんですが、Windows サーバにデプロイする情報はあまり見かけません。FTPWebDAV でデプロイできるようにサーバを設定してもいいとは思うんですが、せっかくなので他の設定が要らない CIFS を試してみました。

wagon-cifs の情報

やたら情報が少なくて不安になるんですが、一応使える状態にはなっています。

リポジトリ

ソースコードSVN リポジトリです。

Mavenプラグインというと、.jar で配布されていて pom.xml に依存関係を記載するだけで使えるのがふつうだと思っていたんですけど、wagon-cifs は .jar での配布は行われていません。これは、jcifs というライブラリを利用していて、このライセンスが ASL と互換性がないためだそうです。

ドキュメント

ドキュメントについても不完全なままです。ドキュメント案はパッチとして挙がっているんですが・・・

「お前作ったんだからパッチ当てろよ」「俺もう使ってないよ。誰かやっちゃっていいよ」「いや、誰がやってもいいんだけど、ちゃんとチェックできるのお前だけじゃね?」みたいな会話の後放置されてます。うーん。

なにはともあれ、ここでパッチとして挙がっているファイルが一番参考になります。

また、このエクステンションのフィードバックを ML に投げている人がいるので、こちらも参考になります。現行の wagon-cifs はデプロイ先のディレクトリが存在しない場合にうまく動作しないので、その対処法についても記載されています。

wagon-cifs のビルド(&リポジトリへのデプロイ)

TracLightning がないと Maven リポジトリの準備やらビルド設定やら面倒なところだと思うんですが、TracLightning があれば恐ろしく簡単です。

Hudson の画面を開いて、「新規ジョブ作成」で以下のように設定します。

これだけ設定したら、「ビルド実行」するだけで Maven リポジトリに .jar が配布されてしまいます。

にファイルができていることを確認しましょう。(192.168.0.1 が TracLightning の IP アドレスだと思ってください。以下同様。)

wagon-cifs を使う方法

せっかくなので、TracLightning についてきた LibraryProject をスレーブからビルド&デプロイできるように変更してみます。

pom.xml の変更

http://192.168.0.1/svn/SampleProject/LibraryProject/trunk をチェックアウトして、pom.xml を以下のように変更します。

Index: /LibraryProject/trunk/pom.xml
===================================================================
--- /LibraryProject/trunk/pom.xml	(revision 1)
+++ /LibraryProject/trunk/pom.xml	(revision 9)
@@ -21,31 +21,31 @@
     <repository>
       <id>example.com</id>
       <name>My Maven Repository</name>
       <!-- localhost をこのサーバのホスト名に置換 -->
-      <url>http://localhost/maven/</url>
+      <url>http://192.168.0.1/maven/</url>
       <layout>default</layout>	  
     </repository>
   </repositories>
 
   <!-- 配布先の設定 -->
   <distributionManagement>
     <repository>
       <id>local-repository</id>
-      <url>file:C:\TracLight\projects\maven</url>
+      <url>cifs://192.168.0.1/C$/TracLight/projects/maven</url>
     </repository>
     <site>
       <id>maven.apache.org</id>
-      <url>file:C:\TracLight\projects\report\SampleProject\LibraryProject</url>
+      <url>cifs://192.168.0.1/C$/TracLight/projects/report/SampleProject/LibraryProject</url>
     </site>
   </distributionManagement>
 
   <!-- SVNの設定 -->
   <scm>
     <!-- connection,developerConnection,urlの localhost をこのサーバのホスト名に置換 -->
-    <connection>scm:svn:http://localhost/svn/SampleProject/LibraryProject/trunk/</connection>
-    <developerConnection>scm:svn:http://localhost/svn/SampleProject/LibraryProject/trunk/</developerConnection>
-    <url>http://localhost/svn/SampleProject/LibraryProject/</url>
+    <connection>scm:svn:http://192.168.0.1/svn/SampleProject/LibraryProject/trunk/</connection>
+    <developerConnection>scm:svn:http://192.168.0.1/svn/SampleProject/LibraryProject/trunk/</developerConnection>
+    <url>http://192.168.0.1/svn/SampleProject/LibraryProject/</url>
   </scm>
 
   <!-- CIの設定 -->
   <ciManagement>
@@ -175,7 +175,18 @@
         </configuration>
       </plugin>
 
     </plugins>
+
+    <extensions>
+
+      <!-- URL 指定で cifs: スキームを使えるようにするための設定 -->
+      <extension>
+        <groupId>org.codehaus.mojo.maven-extensions</groupId>
+        <artifactId>wagon-cifs</artifactId>
+        <version>1.0-alpha-1-SNAPSHOT</version>
+      </extension>
+
+    </extensions>
  </build>
 
 </project>

Hudson でビルドする場合はソースコードのチェックアウトは Hudson 側の設定が使われるので、<scm> 部分の設定は必須ではありません。mvn を手動で実行した場合はここの設定が使われますし、そうでなくてもここで書いた URL がプロジェクトサイトに表示されるので、いちおう設定してあります。

.m2\settings.xml の設定

pom.xml の distributionManagement でデプロイ先を指定しましたが、認証情報はここには書かず、${user.home}/.m2/settings.xml 書くのがお作法なので、こちらに記載します。

Hudson Slave から実行すると ${user.home} が空になって C:\.m2\settings.xml が使われるようなので、ひとまずここに、以下のような記載をしてしまいます。

<settings>
  <servers>
    <server>
      <id>local-repository</id>
      <username>server_name\\user_name</username>
      <password>password</password>
    </server>
    <server>
      <id>maven.apache.org</id>
      <username>server_name\\user_name</username>
      <password>password</password>
    </server>
  </servers>
</settings>

settings.xml についてはどうするのがベストか悩み中です。Hudson スレーブをもっと増やすことを考えると、個々のサーバでいちいち設定したくはないような・・・。mvn 実行時の -s オプションで settings.xml を指定するなり、%MAVEN_HOME%\conf\settings.xml 側でうまいこと設定するなり、何かしら改善できそうな気はします。

ジョブの設定

LibraryProject の設定を以下のように変更します。(LibraryProject に手を加えたくない場合は、「新規ジョブ作成」→「既存ジョブのコピー」で LibraryProject をコピーしても OK です。)

wagon-cifs のバグ対応

wagon-cifs の参考 URL に書いてあるように、デプロイ先のディレクトリが存在しない場合、デプロイ時にエラーになってしまいます。今回はデプロイ先が

  • C:\TracLight\projects\report\SampleProject\LibraryProject

なので、このディレクトリをあらかじめ作成しておきます。

こはちょっとイマイチで、参考 URL に記載されている通りにソースコードを修正してもいいと思うんですが、ファイルの一覧を取得することで接続確認を行っているようなので、単純に削ってしまっていいものか・・・。

管理共有の有効化(必要に応じて)

上の例では管理共有(C$ とか)を使ってファイルを書き込もうとしているので、サーバ側で有効になっていない場合は有効にしておく必要があります。私は TracLightningUAC 有効な Windows7 に立てたので、以下の設定が必要でした。

ジョブの実行

上記もろもろの設定が完了したら、LibraryProject のビルドを実行します。うまくいくとプロジェクトサイトが

に、.jar ファイルが

にデプロイされるはずです。

wagon-cifs でがんばってはみたけれど・・・

TracLightning でプロジェクトを管理するケースというのは社内プロジェクトがメインでしょうから、この Maven リポジトリにデプロイを行うケースというのはあまり無いのかもしれません。

あと、プロジェクトのレポートが見たいだけであれば、画面から Hudson のワークスペースが参照できるので、

としてプロジェクトサイトを閲覧することもできますし、ビルドに紐づく形で

あたりが作成されているようですので、あまりがんばって Maven 側のデプロイ設定を行うメリットはないかもしれません。

ちゃんと pom.xml で記載したとおりの

として閲覧したいなら設定しましょう、ってくらいの話ですかね。

感想とか

Maven で社内リポジトリを作るだけでも結構億劫なのに、TracLightning ビルドからデプロイまでさくっと行えるので、ちょっと驚きました。まあソースからビルドするなんて機会はあまりないんですけど・・・。

まあそうでなくても、Hudson のサーバを立てておけば Java のプロジェクトを GUI でちょこちょこ設定するだけでビルドできるので便利そうです。たとえば Selenium RC は trunk 版じゃないと特定のブラウザで動作しないとかいう問題があったりするんですが、こういうビルドも仕込んでいれば、常に最新版が使えるわけですし。

・・・と実際に Selenium RC のビルドを試してみたら、pkg-config がないからビルドに失敗したりして。Linux のスレーブも用意しないとなぁ、とか夢が広がっているところです。

蛇足: wagon-cifs 以外のプラグイン

せっかく調べたので書いておきます。

wagon-smb というのもあるそうで。以下のスレッドで「wagon-cifs でいいんじゃない?」という話があったので今回は未検証です。なお、wagon-cifs のライセンスについてもここに書いてありました。(引用しておきます。)

This implementation can't be moved under wagon umbrella because jcifs used by it (and wagon-smb) used a license that isn't compatible with ASL.

wagon-smb のリポジトリについてはリンクが切れたりもしていますが、以下の URL で取得できそうな感じです。

また、cifs-maven-plugin というのもあるみたいなんですけど、こちらはデプロイ用じゃなくてダウンロードするためのものなんだとか。

ついでに。Windows だと証明書まわりの設定が面倒だと思って避けてたんですが、TracLightning には Apache が入っているので、これを利用して WebDAV でデプロイしてもいいかもしれませんね。Windows だと日本語ファイルの扱いに問題があるらしいですけど、デプロイ対象のファイルに日本語は使われてないでしょうし。

いちおう参考になりそうな? URL を載せておきます。