• このエントリーをはてなブックマークに追加

はじめに

年に1回くらいの恒例,本ぶろぐのデザインを変更,Twitter製CSSフレームワーク Bootstrap をベースに,そこからいくらか乗せてみました.とありあえず丸1日の作業でひと区切り.

で,最初に大きく作って反映するときはさほど問題ではないのですが,その後,ちょこちょこ微修正したりしてその度に公開側へ反映させる,そうなると,単純な作業でもけっこう手間に感じます.そんなわけで,そのデプロイ方法について考えてみました.

1年前のデプロイ方法

今回の気分転換ついでに,WordPressのファイル群を,Gitで管理するようにもしてみました.

masterブランチをローカル開発用,publicブランチを公開環境用,な感じです. また,公開サーバ上の /var/www/vhosts/iss.ms/blog/public へも,publicブランチでクローンしています.

テーマとかを修正するときは,次のような感じです.

1. [ローカル] masterブランチで行いながらローカル環境で確認 & commit
2. [ローカル] publicブランチに merge & push
3. [公開サーバ] publicブランチを pull して反映
nginx + PHP-FPMでWordPressを動かしてみる « いわぶろ(ろてん)

昨年作った Git による管理のプロジェクトは,だいたいこんな感じでしたが,デプロイ作業の度に公開サーバへ入らないといけなく,とてもメンドイですね.

現時点でのデプロイ方法 〜公開サーバ側での準備〜

Git bareリポジトリを準備する

bareリポジトリを準備します.設置先は,/var/repos/blog.iss.ms.git とでもしておきます.

% mkdir /var/repos
% cd /var/repos
% git init --bare blog.iss.ms.git

デプロイ向けの内容を,ローカル環境からこのリポジトリへ push することになります.

デプロイ先を準備する

本ぶろぐに関する nginx設定はこんな感じです:

server {
    listen 80;
    server_name blog.iss.ms;
    root /var/www/vhosts/iss.ms/blog/www;
    index index.php;
    ...
}

なので,デプロイ先は /var/www/vhosts/iss.ms/blog としておきます.

% cd /var/www/vhosts/iss.ms/blog
% git init
% git add origin file:///var/repos/blog.iss.ms.git

これで,デプロイ先と公開サーバ内リポジトリとの関連付けができました.

現時点でのデプロイ方法 〜ローカル環境での準備〜

% git branch
* master
  public
  theme/issm-2012
%

ブランチ public が,デプロイ向けであるとします.

リモートに追加する

公開サーバ内リポジトリをリモートに追加します.名前は deploy とでもしておきます.

% git remote add deploy www@vps.example.com:/var/repos/blog.iss.ms.git
% git remote -v
deploy	www@vps.example.com:/var/repos/blog.iss.ms.git (fetch)
deploy	www@vps.example.com:/var/repos/blog.iss.ms.git (push)
origin	git@dev.example.com:issm/blog.iss.ms.git (fetch)
origin	git@dev.example.com:issm/blog.iss.ms.git (push)
%

この時点で,

% git push deploy public

とすれば,公開サーバ内のリポジトリへ push できます.

公開サーバ側に入っている Git の環境によっては,次のようなエラーが出て push できないことがあります:

% git push deploy public
zsh:1: command not found: git-receive-pack
fatal: The remote end hung up unexpectedly

そんなときはまず,公開サーバ側の git(厳密には git-receive-pack)コマンドのパスを調べます:

# in remote server
% which git-receive-pack
/home/www/local/bin/git-receive-pack

このパスを,push する際の --receive-pack オプションに指定してやることで,先のエラーを回避できます:

% git push --receive-pack=/home/www/local/bin/git-receive-pack deploy public

サーバサイドのフックスクリプトを手元に準備する

公開サーバ側のリポジトリへの push が完了するときに呼び出されるフックスクリプト(post-receive)を準備します.

手元で管理するため,etc/git-hooks/post-receive 下あたりに作成するとしましょう.

だいたい次のような感じになりました:

#!/bin/sh
PATH=$HOME/local/bin:$HOME/local/sbin:$PATH
GIT="/usr/bin/env git --git-dir=.git"
 
PROJECT_ROOT=/var/www/vhosts/iss.ms/blog
 
( cd $PROJECT_ROOT              && \
  $GIT fetch origin             && \
  $GIT checkout origin/public
)

で,デプロイする際に,次のように rsync を実行することで,フックスクリプトも最新の状態に保てる感じです:

% rsync -rtv -e ssh etc/git-hooks/* www@vps.example.com:/var/repos/blog.iss.ms.git/hooks/

デプロイスクリプトを準備する

あとは,これまでをまとめて実行するためのスクリプトを書けば,デプロイスクリプトになりそうです.

これを,bin/deploy に作ることにします.だいたい次のような感じになりました:

#!/bin/sh
ROOT=$(cd $(dirname $0)/.. && pwd)
GIT="git"
REMOTE_REPOS_NAME=deploy
REMOTE_REPOS=$($GIT remote -v | grep $REMOTE_REPOS_NAME | grep push | awk '{print($2)}')
REMOTE_GIT_RECEIVE_PACK=/home/www/local/bin/git-receive-pack
 
rsync -rtv -e ssh $ROOT/etc/git-hooks/* "$REMOTE_REPOS/hooks/"
 
$GIT push -f --receive-pack=$REMOTE_GIT_RECEIVE_PACK $REMOTE_REPOS_NAME public

デプロイ!

デプロイスクリプトを実行します:

% ./bin/deploy
sending incremental file list
post-receive
 
sent 78 bytes  received 37 bytes  230.00 bytes/sec
total size is 284  speedup is 2.47
Counting objects: 117, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (113/113), done.
Writing objects: 100% (113/113), 186.56 KiB, done.
Total 113 (delta 6), reused 0 (delta 0)
remote: From file:///var/repos/blog.iss.ms
remote:  + 9455e90...a60b835 public     -> origin/public  (forced update)
remote: Previous HEAD position was 9455e90... テーマ「issm-2012」を追加.
remote: HEAD is now at a60b835... テーマ「issm-2012」を追加.
To www@vps.example.com:/var/repos/blog.iss.ms.git
 + 9455e90...a60b835 public -> public (forced update)

ローカル環境で1つ実行するだけで,公開サーバへ反映できました.

まとめ

静的ファイル群で構成されるWebサイトとか,CGIアプリケーションとか,WordPressをはじめとするPHPアプリケーションとか,公開側のサーバ再起動のいらない程度のプロジェクトであれば,こんな感じのスクリプトでデプロイしてしまえば,けっこうラクなんじゃないかな,と思いました.

おわりに

以上,本ぶろぐの見た目変更のお知らせとか,ちょっとしたアプリケーションをデプロイするための試行錯誤をしてみたりとか,そんな感じのお話でした.

毎度のことながら,デザインの方はまだ未完なので,ときどき手を入れたいと思います.