[作業目標]
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 コメント:
コメントを投稿