capistrano+gitでソースコードのデプロイサーバ構築⑤(post-receiveでプッシュと同時にデプロイ)


前回までに構築してきたcapistranoを使用したデプロイサーバーを使い、gitのプッシュを行ったと同時に本番環境にデプロイされる仕組みを構築したいと思います。

今まで私はSubversion(SVN)を使用してきました。
SVNではpost-commitという機能(設定)により、コミットと同時にスクリプトを実行する事ができますが、
gitも同様で様々なタイミングでスクリプトを実行することができるようです。
今回はその中で、リモートリポジトリ(今回はデプロイサーバがgitのリモートリポジトリとなります)にプッシュした直後にデプロイコマンドを実行したいので
そのための機能であるpost-receiveというものを使用して設定します。

■その前に。。。
実はこの記事は上記のpost-receiveを書いたら終わりという簡単なものを想定していましたが、世の中そうあまくはなかったようです。。
今までgitについてはgitユーザーに、capistranoを使用したデプロイについてはdeployユーザーに分けて設定を行ってきましたが、
gitのpost-receiveが実行されるのはgitユーザーになり、そのコマンドを実行するのもgitユーザーです。
しかし、デプロイはdeployユーザーで行わせるための設定を行ってきたため、post-receiveからcapコマンドを実行することができませんでした。。
(どなたかこの状態でうまく動かせる方法を御存知でしたら教えて下さいm(_ _)m )

そこで今まで構築してきたgitリポジトリをdeployユーザーの環境に作り直し、すべてdeployユーザーで行うことにしました。

前回までの構築を行った上で修正をするための作業は下記のとおりです。
・deployユーザーで鍵認証による接続を受け付ける設定

# cp /home/git/.ssh/authorized_keys /home/deploy/.ssh/
# chown deploy.deploy /home/deploy/.ssh/authorized_keys
# chmod 600 /home/deploy/.ssh/authorized_keys

デプロイ先サーバーからdeployユーザーにて下記の接続を確認

$ ssh deploy@デプロイサーバ名

・deployユーザーにgitのリポジトリを作成

$ mkdir ~/repos
$ cd ~/repos/
$ mkdir test.git
$ cd test.git
$ git --bare init

gitクライアントからプッシュできるか確認

・capistranoの設定を変更

$ vi ~/config/deploy.rb
set :repo_url, 'git@デプロイサーバ名:/home/git/repos/test.git'
                 ↓  ↓
set :repo_url, 'deploy@デプロイサーバ名:/home/deploy/repos/test.git'

以上ですべての処理をdeployユーザーで行えるようになりました。
念のためプッシュした内容が正しくデプロイされるかを確認しておいてください。

$ cd ~/
$ cap production deploy

■post-receiveの設定
ようやくpost-receiveの設定です。

$ cd ~/repos/test.git/hooks/
$ vi post-receive

中身は下記の通り

#!/bin/sh

cd /home/deploy/
/home/deploy/rbenv/shims/cap production deploy

保存し引き続き下記の設定

$ chmod 775 /home/deploy/repos/test.git/hooks/post-receive

上記設定によりプッシュした際に自動的にデプロイされるようになります。

■参考

投稿者:

nikuatsu

大学時代にWebアプリ開発を中心とした会社を企業し、約15年経営した末に倒産。現在はとあるインターネット上でのビジネスを展開する企業の開発部門で、あらゆる技術関連について対応している。 スキルの範囲: ・主にPHPを中心としたWebアプリケーション開発 ・Linuxサーバを中心としたインフラストラクチャー全般 ・MySQL、PostgreSQLを中心としたRDBMSの設計、運用 ・Objective-CによるiPhoneアプリの開発 などなど。

コメントを残す

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