Capistrano で svn+ssh なリポジトリからデプロイ2009/04/27

なんかもっと上手い方法がありそうな気がするので、誰かの添削を期待して晒してみます。

Capistrano のバージョンは 2.5.5 基本的な設定の話は省略します。

復習

Capistrano がリポジトリにアクセスするタイミングについて。

cap deploy

このタスクが完了するまでに、Capistrano は 2回リポジトリにアクセスします。 それぞれの経路が違うので、それぞれに対処が必要です。

  • ローカルのPCからリポジトリへ 指定したリポジトリの先端のリビジョンを取得するためのアクセスを行います。 発行されているコマンドは
svn info svn://example.com/svn/reps/application/trunk -rHEAD
  • デプロイ先のホストからリポジトリへ 実際にデプロイを行うために svn co コマンドを発行します。

問題点

Capistrano の設定ファイルを書く上で問題になるのは、1ヶ所だけだと思います。 svn+ssh に含まれる ssh の接続用ユーザ情報を書く設定項目が無いのです。

set :user, 'username'

で設定できるログインユーザは、ローカルからデプロイ先へのログインにしか使用されません。

Capistorano は svn コマンドを何も考えずに利用するので、結果としてデフォルト値が採用されます。 結果として、

  • ローカルからのアクセスの際は、ローカルの(今まさに cap コマンドを実行した)ユーザ
  • デプロイ先からのアクセスの際は、set :user で設定したユーザ

が使用されます。

これらがどちらも、リポジトリのホストへ ssh でアクセスできれば良いのですが、 うちはそうなっていない(後者はお客様指定のアカウント名だったりする)ので、 困ったことになります。

解決方法

シェル環境変数 SVN_SSH を設定する

多分、これが順当なのかなと思っています。

export SVN_SSH='ssh -l username -i /path/to/private_key'

set :repository にユーザ名を埋める

config/deploy.rbに

set :repository, "svn+ssh://username@example.com/svn/reps/application/trunk"

などとしてしまう。

お客様のサーバにできるだけ痕跡を残したくない場合に。