Capistrano 2.0が日本語環境でうまく動かない件
何となくいじってたらつまらないトラブルにぶち当たってしまったので、メモ書き。こんな情報求める人がどれだけいるんだろう?
Capistrano 2.0(正確には開発版の1.99.1)でdeployしようとしたら、エラーになった。
$ cap deploy * executing `deploy' * executing `deploy:update' ** transaction: start * executing `deploy:update_code' * executing "svn checkout -q -r http://192.168.0.1:20080/svn/todo/trunk /var/www/idesaku/todo/releases/20070518060651 && (echo > /var/www/idesaku/todo/releases/20070518060651/REVISION)" servers: ["192.168.0.2"] Password: [192.168.0.2] executing command ** [out] svn: リビジョン引数 'http://192.168.0.1:20080/svn/todo/trunk' で構文エラーが生じました command finished *** [deploy:update_code] rolling back ...
コマンドがおかしい。
* executing "svn checkout -q -r http://192.168.0.1:20080/svn/todo/trunk
-r
の直後にリビジョン番号が指定されるはずだが、いきなりリポジトリパスが渡されている。どうやらリビジョン番号が取れていない。
これは、次のようにすると動く。
$ LANG=C cap deploy * executing `deploy' * executing `deploy:update' ** transaction: start * executing `deploy:update_code' * executing "svn checkout -q -r7 http://192.168.0.1:20080/svn/todo/trunk /var/www/idesaku/todo/releases/20070518061109 && (echo 7 > /var/www/idesaku/todo/releases/20070518061109/REVISION)" servers: ["192.168.0.2"] Password: [192.168.0.2] executing command command finished * executing `deploy:finalize_update' * executing "chmod -R g+w /var/www/idesaku/todo/releases/20070518061109" ...
Capistrano 2.0は、SVNリポジトリからリビジョン番号を取得するためにsvn info
を使っているのだが、日本語環境だと出力が変わってしまうのでうまく動かなくなる。
$ echo $LANG ja_JP.UTF-8 $ svn info パス: . URL: http://192.168.0.1:20080/svn/todo/trunk リポジトリのルート: http://192.168.0.1:20080/svn/todo リポジトリ UUID: 0b633136-ffc5-264c-8365-35a87ff0ac45 リビジョン: 7 ノード種別: ディレクトリ 準備中の処理: 特になし 最終変更者: idesaku 最終変更リビジョン: 7 最終変更日時: 2007-05-18 09:54:59 +0900 (金, 18 5月 2007) $ LANG=C svn info Path: . URL: http://192.168.0.1:20080/svn/todo/trunk Repository Root: http://192.168.0.1:20080/svn/todo Repository UUID: 0b633136-ffc5-264c-8365-35a87ff0ac45 Revision: 7 Node Kind: directory Schedule: normal Last Changed Author: idesaku Last Changed Rev: 7 Last Changed Date: 2007-05-18 09:54:59 +0900 (Fri, 18 May 2007)
svn info
の出力から、"Revision: N"という形式の文字列を探し出す(実際は、出力をYAMLドキュメントとみなしてパースしている。そんなのアリか?)のだが、日本語化しているとこれが"リビジョン: N"となってしまうため、読み込みに失敗するらしい。
しかし、毎回コマンドの頭にLANG=C
をつけるのはさすがに億劫だ。subversion.rbの中身を書き換えてもよいのだが、ここは簡単にRAILS_ROOT/config/deploy.rbに一行足せばよいと思う。
ENV['LANG'] = 'C'
これで普通に$ cap deploy
と叩けば動くようになる。これだとエラーメッセージが全部英語になってしまうが、もとよりSubversionのもの以外はほぼ英語なのである。まぁ些細な問題であろう。
本当はsvnのrubyバインディングを使うのが筋なのかもしれんが、そもそもCapistranoはSSHでリモートコマンドを叩きまくるツールだし、コミットログを眺めてもコマンド叩く気マンマンのようだ。たぶんこのままで2.0リリースするんだろうな。
ちなみに、1.4.1では日本語環境でも問題なくdeployできている。
2007/05/23 追記
Googleグループに、同様の問題について触れたスレッドがあった。
これによると、deploy.rbに次の一行を足せばよいとある。
set :scm_command, 'env LANG=C svn'
なるほど。やってることは同じなのだが、この方が影響範囲が小さくてよさそうだ。
コメントでタレコんでいただきました。ありがとうございます。>"さく"さん