C-limber's highへようこそ。
C-limber's highは山登りのサイトではなく、福岡システム開発WEB制作会社 C-limber(クライマー)株式会社の技術メモブログです。
福岡システム開発ホームページ制作をお探しの方はお気軽にご相談下さい。

2013年7月9日火曜日

gitのブランチのpushで本番環境とテスト環境への反映を切り替える

11:27 Posted by 井口達也 , No comments
gitの自動デプロイの話

[作業目標]
pushされたものに対して、
branchで判別して処理を分岐、
テスト環境、本番環境へのデプロイを自動化します

レモートのbareリポジトリの直下にhooksというディレクトリが生成されているので、中身を見ます。

pushに対して処理する時は、
post-receive
post-update
というファイルを作ってその中にシェルスクリプトを書いて処理します。

処理の順序は、
1. post-receive
2. post-update
の順番で処理されます。

それぞれのファイルの使い方は、

branchによる分岐が無い場合、
post-receive に処理を記述。

branchによる処理分岐がある場合、
post-update に処理を記述。
(分岐しない処理もpost-updateにはかけます)

今回はbranchで処理を分岐するのでpost-updateに処理を記述する。

[概要]
git push origin master => テスト環境のみに反映
git push origin master:product => 本番・テスト両方に反映

[前提]
本番・テスト環境にgit のリポジトリを生成済

[注意]
それぞれの環境がpullする際のディレクトリ構造は適宜に変更してください
作成したpost-update, post-receive は かならず実行権限を与えてください(これで結構はまりました)

#!/bin/sh
#ブランチ名の取得
branch=$(git rev-parse --symbolic --abbrev-ref $1)
# 本番・テスト環境へ反映
if [ "$branch"  = "product" ]
then
        cd /home/product_user/public_html
        git --git-dir=.git pull ../repo/repo.git product:master
        # テスト環境にも反映
        cd /home/test_user/public_html
        git --git-dir=.git pull ../repo/repo.git product:master
        # リモートのbareリポジトリのmasterブランチとproductブランチを入れ替える
        cd /home/repo_user/repo/repo.git
        git --git-dir=../repo.git symbolic-ref HEAD refs/heads/product
        git --git-dir=../repo.git branch -d master
        git --git-dir=../repo.git branch -m product master
fi

# テスト環境のみへ反映
if [ "$branch" = "master" ]
then
        cd /home/test_user/public_html
        git --git-dir=.git pull ../repo/repo.git master
fi

exec git update-server-info


[ちょっと補足説明]
●bareリポジトリはディレクトリ自体が、○○.gitとなっていて、内部に.gitファイルと持ちませんので、
git --git-dir=../repo.git symbolic-ref HEAD refs/heads/product
として、gitディレクトリにrepo.git自身を指定してgit 命令を実行しています。

●bareリポジトリのbranchの切り替えはcheckoutが使えない
bareリポジトリはworking treeではないらしく、checkoutつかってブランチを切り替えようとするとエラーがでます。
そこで、直接参照を切り替えています。
git symbolic-ref HEAD refs/heads/product
これでbareリポジトリのmasterブランチからproductブランチにcheckoutする事が出来ました。


0 コメント:

コメントを投稿