symfony project:deploy on Windows

symfonyを使って小さなシステムを作っている。手元のテスト環境(Windows 7, XAMPP)ではとりあえず動くレベルまで来たので、本番環境のLinuxに載せることにした。

symfony project:deploy というコマンドで簡単に本番環境への配備が行えるらしいので、その設定のやりかた。コマンドに関する説明は、本家のチュートリアルページを参照。

■まずは環境

  • サーバー:CentOS 5.5
  • クライアント:XAMPP 1.7.3, Windows 7
  • symfony 1.4.5

 

■必要なソフトのインストール

project:deployは内部でrsyncコマンドを使用している。Linuxであれば問題ないけど、Windowsの場合はわざわざインストールする必要があるので、こちらのページよりcwrsyncをダウンロードしてインストールする。

しかしこのcwrsyncが曲者で、ssh経由だとうまく動かない(場合がある?)らしい。結論から言うと、このページからダウンロードできるcygnativeというプログラムを使えばOK。解凍してcwrsyncと同じフォルダに置く。(ちなみにこのダウンロードページはたまに落ちていることがあるっぽい)

■PuTTYの設定

別にPuTTYの設定なんて特に必要ないじゃん、と思うんだけど、これはやっておいた方がいい。と言っても大した事はなくて、以下の情報を指定してセッションの「保存」をする。ここで保存したセッション名はとりあえずsession1としておく。

  • 接続するサーバーのホスト名
  • ポート番号
  • ログインユーザー名(これ重要)

後は、自分の公開鍵をサーバーの.ssh/authorized_keysに登録しておく。これに関してはSSHの基本なのでここでは省略。

Pageantに鍵を読み込ませた状態でPuTTYを立ち上げ、「セッション一覧」に表示されてるセッション名をダブルクリックするとそのサーバーにログインできるようになっていればOK。

■symfonyのソース修正

1つはバグ修正で、1つは公開鍵認証を使う為の機能追加。それぞれのtracでのチケットはここ(#8177)とここ(#6193)。前者は修正は完了してるけどまだ最新版(1.4.5)に取込まれていないっぽい。後者に関しては、symfonyはマイナーバージョンアップでは機能追加は取込まない方針なので、1.4系ではソース書き換えしか手がない。

#8177の最後の方にも書いてあるけど、symfony/task/sfFilesystem.class.phpの291行目付近を以下のように(stderrのモードを"w"から"a"に)する。ちなみに#8177の最初のほうに書いてある修正は行う必要はない。

$descriptorspec = array(
1 => array('pipe', 'w'), // stdout
2 => array('pipe', 'a'), // stderr
);

もう1つは#6193に添付されているパッチをsymfony/task/project/sfProjectDeployTask.class.phpに適用する。

■properties.iniの修正

<appname>/application/config/properties.ini を修正。これは相当試行錯誤したけど、結局は以下のようにすればOKだった。

[production]
;ホスト名、ポート番号、ユーザー名はPuTTYのセッションを使うので不要
;ただし、hostは空欄にする
host=
;port=22
;user=foo
dir=/var/www/html/appname
;sshコマンドの代わりにcygnativeとplinkを組み合わせて使う。
;session1というのはPuTTYの保存されたセッション
ssh="'cygnative plink -load session1'"

これで完了。後は次のコマンドを実行するとデプロイされる。

# symfony project:deploy --go production

※追記

properties.iniのコメントに # を使うと、symfony doctrine:generate-module とかを実行した時に以下のような警告が出る。iniファイルのコメントは ; (セミコロン)で始める。

Deprecated: Comments starting with '#' are deprecated in

■補足

※1 途中で起こった色々な問題

上を見てもらえれば分かる通り、実際にやることはそれ程難しくないが、そこに至るまでは結構試行錯誤をした。問題は3つあった。

1つめはWindows上でssh+rsyncがうまく動かないらしい。symfony以前の話。cwrsync sshでググると沢山のページが出てくる。解決方法はいくつかあるみたいだけど、上述の通りcygnativeというプログラムを使う。

もう1つはsymfonyのdeployタスクがWindowsではうまく動かない問題。上に書いた通り、ソース修正("w"→"a")で乗り切る。

最後の問題は、deployタスクはパスワード認証にしか対応していないこと。これはソース修正+properties.iniへの設定追加で解決。

※2 トラブルシューティング中に発見した便利な技(?)

自分用メモ。

http://blog.symfony.jp/2008/04/17/161

symfony project:deploy –rsync-options="-azv –force –delete" production

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です