Apache Archiva を試してみた
Continuum を使って色々作業をしているうちに、ふとしたことから Apache Archiva に行き着いた。Maven のリポジトリ管理のコストを大幅に低減するツールで、売り文句は「The Build Artifact Repository Manager」。機能としては、大きく 3 つが用意されている。
- 「Remote Proxying Cache」という、恐らく Archiva の目玉とも言える機能。複数のリモートリポジトリを束ねた、単一のリモートリポジトリを用意出来る。用意された単一のリモートリポジトリにアクセスした場合に必要なアーティファクトがなければ、そのリポジトリの背後に控えている別のリモートリポジトリからアーティファクトから取得され、一定期間キャッシュされる(プロキシのように働く)。アーティファクトがそのリポジトリの中に存在するものなのか、背後のリポジトリに存在するものかの区別を、開発者は意識する必要はない。
- リポジトリに対するブラウジング / 検索 / レポーティングが行える、Web ベースのインタフェース。
- 開発者が容易にリモートリポジトリにアーティファクトを公開出来る…って、これは Maven の機能を使うんだけど。
また、これらに対して JAAS のロールベースの認証機能が組み込まれているのも魅力の一つ。開発者から見たメリットは「意識しなければならないリモートリポジトリの数が減る」こと。「あのアーティファクトはこのリポジトリで、このプラグインはあのリポジトリで、このアーティファクトは自社で開発したものだから社内ローカルのリポジトリで…」なんてことに煩わされなくなるのは嬉しい。
管理者から見ると、複数のリポジトリを集中管理出来ることがメリットとなる。Archiva 内には複数のリポジトリを設けて、それぞれに認証を施すことが出来る。仮に開発プロジェクト A / B / C の 3 つがあるが、個々の開発プロジェクトは他の開発プロジェクト独自のアーティファクトをアレコレすることは出来ないようにしたいという場合は…。
- まず共有のリポジトリを作る。このリポジトリは他の(公開されている)リポジトリへのプロキシとして機能する。maven.org や codehaus のリポジトリはこのリポジトリ経由でアクセスするようにすれば、各開発プロジェクトはこのリポジトリのみをリモートリポジトリとしてアクセスすればよい。もちろん、全開発プロジェクトで使うアーティファクト(jta.jar など)は、このリポジトリに入れておけばいい。
- 各開発プロジェクト用に、それぞれ個別のリポジトリを用意する。この中にはそれぞれの開発プロジェクトで生成したアーティファクトのみを格納する(Archiva が備えるリポジトリのプロキシ機能は利用しない)。勿論、認証によって他の開発プロジェクトからのアレコレを防ぐ。
もちろん、DAV を使ってアーティファクトをリポジトリに書き込み可能にして、書き込み可能な人間を HTTP の認証で制限…なんてことをやっても、同じようなことは実現出来ると思う。でも Archiva を使えば、その辺りの設定がかなり簡単。いちいち httpd.conf などをいぢらなくてもよい…って、まだその辺りまで厳密に検証出来てないけどね。
これはかなり魅力的なモデルに見える。Maven を使う上で、この「公開されたリポジトリに存在しないアーティファクト」の扱いはかなり厄介だった。自作のコンポーネントを Maven のアーティファクト化した瞬間に、Ant 以前の暗黒時代が広がるからだ。そのコンポーネントを Maven の流儀に従って全開発者にインストールしてもらったり、開発プロジェクト毎に独自の Maven リポジトリを立てたりするのはもうまっぴら。誰かに全開発プロジェクトの面倒を見て欲しいと思っていたトコだから、嫌が応にも期待が高まってしまう。
実際に使ってみると、Web ベースのインタフェースは使いやすいし、操作で迷うところもあんまりないように思う。リポジトリのプロキシが外部のリモートリポジトリにアクセスする際に利用する HTTP プロキシの設定方法だけは分かりにくかったけど、「Network Proxies」で HTTP プロキシの定義を行った上で、「Proxy Connector」で各リモートリポジトリの定義に利用する HTTP プロキシを設定するだけだった。
実際に納品する pom.xml のリポジトリ定義が社内ローカルの URL でいいの? っていう問題はあるけど、どのみち独自リポジトリを立てたりした段階で pom.xml が汚れることは目に見えている。ちょっと本格的に導入を考えてみようと思う。
Archiva は Continuum 同様、スタンドアロンとして起動させることも、アプリケーションコンテナにデプロイして使うことも可能。とは言え、Continuum を JBoss や Tomcat にデプロイして使っているトコってどのくらいあるんだろう…。