Subversionで公開Webサーバと社内リポジトリ間のデプロイ管理
目的
外部公開されているWebサーバ(本環境)と社内リポジトリの整合性を取ることを目的に、両サーバ間をSubversion(SVN)*1を使って同期させることを目指していました。当初はシームレスなステージングと本環境環境の構築が懸案だったのですが、「そこまでのマイルストーンとして第一歩を記そう」というのが動機です。「運用を任されてはいるが顧客側でもコンテンツを更新する」ということが問題になりそうだったので、今回解決したいのは以下の点。
現状
インフラ部分で件がありましたが、裏セグメントとIP-VPNでiDC⇔社内間の問題を回避することに成功。残すはSVNで予想するようなツールが構築できるかということろ。shellscriptで処理をまとめてcornで自動的に処理させたり、必要に応じてコマンドを叩くか、Perlなどでインターフェースを作るか・・・など最終的には比較的誰でも扱える or 存在を気にしないようにするのが目標。
検証
まずはコマンドラインから検証をしてみました。普段、自身のPCではTotoriseSVNを使っているのでコマンドラインからの利用を憶えるところからのスタートです。
ヘルプを表示 (help)
$ svn help
何はともあれ、まずヘルプから。個別コマンドの詳細ヘルプを表示するには、上記に続いてコマンド名を指定する。
$ svn help command
各コマンドのより詳細な情報が得られます。指定できるオプションなどもこれで確認可能。
チェックアウト (checkout[co])
$ svn chekcout http://www.example.com/repository/path ./workspace
checkoutは「co」という略でもOK。こういうショートカット的な指定は他にもあります。
接続先の対象リポジトリがbasic認証がかかっている場合、対話インターフェースが立ち上がり、ユーザ名とパスワードを求められます。スクリプトにまとめる場合には「--username」と「--password」オプションを使う。
$ svn chekcout http://www.example.com/repository/path ./workspace --username USERNAME --password PASSWORD
一度認証に成功すると、認証情報がホームディレクトリ直下 ~/.subversion/auth/svn.simple 以下にファイルとして保存される。認証情報を保存したくない場合は「--no-auth-cache」というオプションを付加する必要がある。
アップデート (update)
$ svn update ./workspace
衝突の発生を防ぐために、コミットする前には必ずupdateを実施する。
コミット (commit[ci])
$ svn commit ./workspace --masseage 'ここにコミットログを記載'
「--masseage(-m)」オプションを指定しておくと、それがそのままコミットログとしてリポジトリに反映される。指定しない場合はエディタを立ち上げてコミットログを入力するように求められる。この場合はEDITOR環境変数を設定しておく必要があるよう。
追加 (add)
$ svn add ./workspace/newfile
指定したPATH以下で、「--force」オプションを指定。ただし、コマンドをSVN管理下のディレクトリで実行する必要がある。
$ cd ./workspace $ svn add ./ --force
元に戻す (revert)
$ svn revert ./workspace/newfile
再帰的にディレクトリ・ファイルを一括で追加する場合は「--recursive(-R)」オプションを指定。
$ svn revert ./workspace/ --recursive
課題
実際に検証していると、事前には気付かなかった問題点が浮かんできた。やはり自動化すると衝突した時のリスクがありそうだ。やはり完全な自動化は難しいかもしれない。適宜手動でupdate・commitする必要がありそう。また、リポジトリをbrunchして本環境用とテスト用に分ける事も検討していきたい。
*1:Webサーバ側のVersionは1.4.2