シンボリックリンクを使ってのデプロイ

WEB+DB PRESS Vol.62の特別企画を読んで面白いなーと思ったシンボリックリンクを使ってのデプロイについて書いてみます。

記事ではhttpd.confを環境毎に切り替えるやり方が紹介されています。なおデプロイ先はLinuxで、リポジトリはステージング環境、商用環境がネットワークつながるという前提のようです。

どういうやり方をするかというとリポジトリ上に環境毎のhttpd.confを下記のようなファイル名で格納します。httpd.confは格納せずsvn:ignoreにします。
httpd.conf.development
httpd.conf.staging
httpd.conf.production

このファイルを以下のような場所にチェックアウトします。

/home/webservice/site_local/etc/httpd/conf/

そして/home/webservice/site_local/etc/httpd/conf/以下は下記のようになります。

httpd.conf.development
httpd.conf.staging
httpd.conf.production
httpd.conf -> 上記3つのどれかにシンボリックリンク

実際に使われる/etc/httpd/conf/httpd.confは/home/webservice/site_local/etc/httpd/conf/httpd.confにシンボリックリンクします。
シンボリックリンクの切り替えはスクリプト実行(例:c2-switch-env development)という流れです。このやり方なら環境xxxが増えてもhttpd.conf.xxxを追加するだけです。

環境毎に設定ファイルが変わるというのは普通にありえます。設定ファイルと一口にいっても多種多様あるわけですが、それがアプリの設定なのかミドルウェアの設定なのかで少し話が違うと思います。

httpd.confなんかはミドルウェアの設定ファイルですよね。Javaの話をすると、Seasarj2ee.diconのようなDBの接続先が書かれているファイルはアプリの設定ファイルですね。こういうのはWebアプリならWEB-INF/classesに配置され最終的にはwarファイルにパッケージングされます。デプロイされるのがwarファイルならシンボリックリンクの登場する余地は無いです。つまり環境毎に切り替えるとしたらパッケージング時ですね。Ant使っているならant -Denv=productionみたいな感じでビルドするんじゃないでしょうか。

スケーラブルWebサイトの3章に書かれているやり方もシンボリックリンク使わない方式ですね。これもアプリの設定ファイルですね。

参考
スケーラブルWebサイト(3章) - 車輪を再発明 / koba04の日記

ただAPサーバのデータソースを使うんだと話は変わってきて、例えばTomcatのserver.xmlのようなミドルウェアの設定ファイルを環境毎に切り替える必要があります。

で、こういうhttpd.confやserver.xmlのようなミドルウェアの設定ファイルをどう管理するのかは悩ましくってその答えがこの記事にあると思っています。単純にリポジトリに突っ込んでもどうリリースするんだっていう話があります。

例えばhttp://.../etc/httpd/conf/httpd.conf.productionという感じにリポジトリに突っ込んでも/etc/httpd/confには他のファイルもあるだろうからチェックアウトできない。ま、Apache全体をリポジトリに突っ込むという手はあるかも。。。ともあれ、こういう配置場所が決まっているものはシンボリックリンク使うのがスマートな気がします。環境依存無さそうだけどLinuxの起動スクリプトもそうかも。

その点この手法ならsvn upすればOKです。ま、リポジトリが商用環境にネットワークつながるケースがどれぐらいあるかわかりませんが、自社サービスとかならあり得るでしょうし、ステージングぐらいならネットワークつながるでしょう。

capistranoシンボリックリンク使うようですが、Java文化の僕からみると新鮮ですね。