git pushでデプロイを自動化する

auto-deploy-by-git-push-and-hook

この記事では、「hook」という仕組みを用いて、git pushでデプロイができるように設定します。

hookというのは、「◯◯されたら△△する」という仕組みを実装できる機能です。

hookを用いてgit pushによるデプロイを実装するためには、いくつか設定が必要です。以下に記録しておきうます。

git pushコマンドでデプロイ(サーバーへのアップ)を自動化する

  1. サーバー上にベアリポジトリを作成する
  2. ベアリポジトリ内でフックを設定する
  3. ローカルリポジトリとベアリポジトリを紐付ける

サーバー上にベアリポジトリを作成する

SSHでログイン後、まずはcdコマンドでWordPressをインストールしたフォルダに行きます。

cd www

ここで、WordPressをインストールしたフォルダ「WP」を「wpbare.git」にクローンしましょう。このときの注意点は2点あります。

ひとつめの注意点は、必ず「–bare」というオプションを付けておくことです。こうすることでベアリポジトリを作成できます。

ベアリポジトリとは、通常のノンベアリポジトリと異なり、ソースファイル自体はなく、更新管理用のフォルダ(.git)しかないという特徴があります。

また、このベア(bare)とは「裸の」という意味で、.gitフォルダが隠しフォルダでなく表に出ているという特徴もあります。

もう一つの注意点は、ベアリポジトリの名前の末尾は必ず「.git」という名前にすることです。この形式でないと、正しく作成できないようです。

git clone --bare wp wpbare.git

上記のコマンドで、今回はwpbare.gitというベアリポジトリを作成しました。うまくいくと下記の通りになります。

cloning into bare repository 'wpbare.git'...done.

これでベアリポジトリの作成ができました。

ベアリポジトリ内でフックを設定する

次はgit hookの設定です。先ほども書いたとおり、hookというのは、◯◯されたら△△するという仕組みです。

これを利用して、bareリポジトリにプッシュされたらノンベアリポジトリからプルする(=デプロイ)という仕組みを作ります。

まずは、hooksフォルダに移動します。

cd wpbare.git/hooks

多数の制御ファイルがあることがわかります。

ls
applypatch-msg.sample
pre-commit.sample
commit-msg.sample
pre-push.sample
post-receive
pre-rebase.sample
post-update.sample
prepare-commit-msg.sample
pre-applypatch.sample
update.sample

今回はpost-receiveというファイルを操作します。

vi post-receive

デフォルトでは下記のとおりになっていますが、

#!/bin/sh
(
cd ~/www/wp/
GIT_DIR=.git
git fetch
git reset --hard origin master
git clean -fdx
)

下記の通り書き換えます。プッシュされたら、リポジトリ「bare」のmasterブランチをpullする、という意味です。

#!/bin/sh

cd ~/www/wp/
git --git-dir=.git pull bare master

 次は、hookに実行権限を持たせるため、管理者権限で下記のコマンドを入力します。

chmod +x post-receive

これでリモート側の準備は終了です。次はローカル側での操作を行います。

ローカルリポジトリとベアリポジトリを紐付ける

exitを入力してローカルに戻ったら、ローカルリポジトリとリモートリポジトリの設定を行います。

前提として、鍵交換方式によるSSH接続と、.ssh/configの設定が必要です。鍵交換方式によるSSH接続と.ssh/configの設定が済んでいない場合は先にこちらの記事を参考にして設定しておきましょう。

上記の設定が済んだら、既存のリポジトリのpush先としてwpbare.gitを登録します。

git remote add bare sakura:~www/wpbare.git

ちなみに、新規にローカルリポジトリを作成する場合は、cloneでもいけると思います。その場合は下記のコマンドを実行します。

git clone sakura:~/www/wpbare.git

これで設定完了です。

コミットしてbareリポジトリにpushすると、本番サーバーが更新されるようになりました。

git push bare master

これで、post-receiveが動作していることがわかる、下記のようなメッセージが出れば成功です。(内容は適当です)。wpフォルダに移動して、ローカルで行ったコミットが反映されていることを確認してもいいでしょう。

hoge@hoge.sakura.ne.jp's password:
Counting objects: 4, done.
Delta compression using up to 8 threads.
Compressing objects: 100%(2/2), done.
writing objects: 100%(3/3),254 byts | 0 bytes/s, done.
Total 3 (delta 1), reused 0 (delta 0)
remote: hooks/post-receive: #!/bin/sh: note found
remote: From ../wpbare
remote: * branch           master      -> FETCH_HEAD
remote: * [new branch]     master      -> bare/master
remote: Updating 936d9be//fdasf231
remote:
To sakura:~/www/wpbare.git
   3sdfafdga..dadfsaf  master  ->  master
remote:

以上で、git hookの設定によるgit pushでの自動デプロイの設定は終了です!