はじめに
普段は自社に居ないインフラ屋のY.Oでございます。
これまで、バージョン管理ツールはプログラマー屋さんの使うものという認識で、
Gitもソースコードを落として来るときにpullする程度でしたが、
昨今のインフラのコード化に伴い、最近ではGitをかなりの頻度で使用しております。
Gitを使っていく中で、いくつか「やってはいけない」お作法を現場で出会った方々に
教えて頂きました。
開発プロセスにもよるかもしれませんが、そのなかの一つが、
リモートの"master" や "develop" ブランチヘのpushはやってはいけないということ。
"Pull Request" や "Merge Request" を使った開発プロセスの場合、
コードのレビューが済んでからリモートの"master" や "develop"へ
取り込むといった流れになりますので、直接リモートの"master" や "develop"ヘ
push するのはご法度とされていることが多いかと思います。
やってはいけないのなら、リモート側でブランチを保護しておきたいところですが、
借用するリモートリポジトリが勝手に触れない場合もございますので、
ローカル側で"master","develop"ブランチへのpushを検知して止めるようにしてみたいと
思います。
何を使って実現するか
Gitには特定のアクションが発生したときに、スクリプトを実行する仕組みとして
Gitフックが用意されています。そのGitフックの中でも、push時に動作してくれる
"pre-pushフック"を今回は使用します。
Gitフックの詳細については、こちらやこちらをご覧ください。
pre-pushフックを設定する
Git管理下のディレクトリに、.git/hooks/pre-pushというスクリプトを配置して、
実行権限を付けると設定終了です。
.git/hooks/内には、pre-push.sampleというファイルが既に格納されていましたので、
これを参考に、下記のようなスクリプトを作成しました。
#!/bin/sh
not_allowed_branchies="master develop"
read local_ref local_sha remote_ref remote_sha
remote_branch=echo ${remote_ref} | awk -F "/" '{ print $NF }'
for branch in echo ${not_allowed_branchies}
do
if [[ "${remote_branch}" = "${branch}" ]]; then
echo "***************************************************************"
echo "リモートの${branch}ブランチへpushしようとしたので中断しました!"
echo "***************************************************************"
exit 1
fi
done
pre-pushフックが発生すると標準出力を介して、更新する参照のリストなるものが
取得できますので、readコマンドで取得し、その中にpushしてはいけないブランチ名が
見つかればexit 1 で終了させるといった挙動をします。
以上