デプロイは神経を使う作業です、安全なはずのコマンドでも結構ドキドキしながら実行するはず。
Capistranoとかfleetとか使ってデプロイされている方にはこの記事は読む価値がないかもしれないです、
リモートサーバに入ってgit pull
とか、ましてやローカルで色々前処理した上でrsyncでリモートにデプロイしている方にはこの記事は価値あるかもしれません。
要は手元のPCから、
$ git push production master
の1コマンドでデプロイを実現してみようってはなしです。
Node.jsアプリベースで記述していますが、RubyでもPHPでも何でも読み替えられると思います
デプロイの構成
デプロイの構成は下図です、
デプロイ先のサーバにはpost-receive
フックを仕掛けたbareリポジトリを用意しておきます。post-receive
フックの中身は同じサーバ内のpublicディレクトリでのチェックアウト + 前処理 + アプリの再起動です。ローカルのPCからgit push
するとpost-receive
フックにより最新の状態でアプリが動き出します。(Upstart使っていますが、pm2とかでも同じ話です)
サンプルアプリ
以下に今回のサンプルアプリをおいてあります:
このアプリは/
にアクセスすると「Hello, world」と環境依存の変数を出力してみる素敵にシンプルなアプリですが、幾つかのモジュールに依存しており、またbootstrapを利用していてlessのコンパイルの作業を踏まないと正常に動きません、ローカルでの開発はこんなかんじです:
$ cd ~/git
$ git clone https://p_baleine@bitbucket.org/p_baleine/sample-app.git
$ cd sample-app
$ npm install # 依存関係ある(npmとbowerの)モジュールをインストール
$ grunt less # lessのコンパイル
$ npm start # 起動
デプロイ時もこの作業を繰り返す必要があります。
リモートでの準備
リモートサーバにてbareリポジトリを作成します、
$ mkdir ~/git/sample-app.git && cd ~/git/sample-app.git
$ git init --bare
さらに実際にアプリのソースを置くディレクトリを作成します、
$ mkdir /var/www/sample-app
Upstartスクリプトを作成します、
$ cat /etc/init/sample-app.conf
author "Tajima Junpei"
description "sample-app"
setuid "nonrootuser"
start on (local-filesystems and net-device-up IFACE=eth0)
stop on shutdown
respawn
console log
env NODE_ENV=production
chdir /var/www/sample-app
exec npm start
post-receive
フックを作成します、チェックアウト、lessのコンパイル、サーバの再起動を行なっています、
$ cat hooks/post-receive
#!/bin/sh
export SAMPLE_APP_DIR=/var/www/sample-app
GIT_WORK_TREE=$SAMPLE_APP_DIR git checkout -f
(cd $SAMPLE_APP_DIR; npm install && grunt less && sudo restart sample-app)
$ chmod a+x hooks/post-receive
いざデプロイ
リモートのbareリポジトリを追加します、
$ cd ~/git/sample-app
$ git remote add production <リモートリポジトリ>
実際のデプロイは(ローカルPCより)以下コマンドで行います、
git push production master # パスワードを求められたら入力