January 10, 2013

CapistranoでオレオレGitデプロイをしてみた

ここ最近、Jenkinsで色々と自動化しているので、ついでにデプロイについても考えてみました。Capistranoが便利そうだったので、使ってみました。


最新のソースは以下になります。ちまちまと改良していければと思います。(Rubyは初めてだったので、おかしな書き方があるかもしれませんが。。。)
https://github.com/mp-php/cap4git
コマンドは、上記のconfig/deploy.rbの"Usage:"を御覧ください。READMEは後日書く予定です。

アプリケーション毎に必ず設定すべき箇所は、config/deployディレクトリ以下の環境別設定ファイルと、config/deploy.rbの"Change me."です。尚、local_app_dirとremote_app_dirは一度rmするので、注意して下さい。


想定する環境は
(1) レポジトリは非公開サーバに配置
(2) 非公開サーバから公開サーバはsshでアクセス可、逆は不可
です。

やりたいことは
(3) 公開サーバからpullして更新
です。


* 以下、Capistranoの知識が浅いので、間違っていたらすみません。

Capistranoは、scmをgit、deploy_viaをremote_cacheにすると、(3)のようにレポジトリから直接pullして更新を行うようです。ただし、(2)の理由からNGでした。

deploy_viaをcopyにすると、レポジトリを公開サーバに転送して、そのレポジトリをcloneして更新を行うようです。具体的には、毎回、公開サーバ側で"releases"というディレクトリ下に新規ディレクトリを作成、そのディレクトリにclone。そして、そのディレクトリに対して、"current"というシンボリックリンクを貼るようです。また、currentを過去のリリースディレクトリに貼り替えることで、ロールバックを実現しているようです。

この仕組みは、例えば、ログファイルやキャッシュファイルが出力されるディレクトリ以下をgitignoreしている場合、それらのファイルがrelease毎に分散してしまいます。更に、公開サーバ側でcurrentとreleasesというディレクトリ構成を意識しなくてはいけません。ですので、この方法もNGでした。


上記を踏まえて、以下の方法を考えてみました。
(1) 非公開サーバのテンポラリな場所にgit clone --bareでレポジトリを複製
(2) 複製したレポジトリをtar.gzにして公開サーバにscpで転送
(3) 公開サーバのテンポラリな場所で解凍、デプロイ先からpull
* デプロイ先に".git"ディレクトリが存在しない場合はgit initを行います。

この方法なら、公開サーバ側から非公開サーバ側へのアクセスは発生しません。

既にGitでの更新を行なっているシステムでも使えるようにしたかったので、毎回
git remote rm capistrano
して
git remote add capistrano [(3)で解凍した場所]
しています。つまり、これまでoriginからpullしていたのがcapistranoからpullするようになるだけです。originとcapistranoの歴史が同一であれば、スムーズに移行出来るはずです。(はずです。というのは、実際には、まだ未確認です。。。)スムーズに移行出来ます。ついでに、pullで更新するのみでなく、指定したブランチ / タグ / ハッシュ値等をgit checkoutするrollback機能も書いておきました。

結局、sshやscp周りをCapistranoに任せて、その他は独自で実装した感じです。


以下、主な必要環境です。

▼非公開サーバ側
* Capistranoが実行できる環境
* Gitが実行できる環境
* localhost(非公開サーバ自身)に対して鍵認証(パスワード不要)によるssh接続ができる環境

▼公開サーバ
* Gitが実行できる環境

尚、処理は/bin/bashで進む想定です。


メール送信などの環境依存する問題を調査する際、公開(試験)サーバ上で直接編集、あるいはSFTP等でのアップロードから、一時的な差分が発生する場合が有ります。この差分を正としたい場合、公開サーバ上でremote capistranoにpush、ローカルからpull、非公開サーバのレポジトリにpushというフローを取らなければいけません。


次回は、このスクリプトをJenkinsからキックしてみます。

2013/01/12 Jenkinsから実行してみました。
http://madroom-project.blogspot.jp/2013/01/capistranogitjenkins.html

No comments:

Post a Comment