gitで自鯖のレポジトリにpushがあったら、
同じく自鯖にあるhtmlを更新したい。
(github-hookはちょっと前にやったけど、こっちは初めてだった)
git hook
git hookは、gitが持っている「コミットされたらなんかする」系の仕組み。
開発環境側で「コミットする直前」とか、
サーバーの側で「プッシュされた直後」とか、
いろんなタイミングで、決まったshell scriptを実行できる。
shell scriptは、.git/hooks
に置く仕組みになっている模様。
今回は、この サーバーサイドフックの、 post-receiveを使ってみる。
設定する
クライアントサイドでやる作業はなし。
サーバー側でやる作業はだいたいこんな感じ。
# gitレポジトリへ移動
cd git/my-website.git
# post-receiveのスクリプトを設置
vi .git/hooks/post-receive
# 実行権限付ける
chmod +x .git/hooks/post-receive
スクリプトは、今回はこのくらいシンプルに。
--git-dir=.git
は付けないと怒られました。
#!/bin/sh
cd /home/fnobi/sites/my-website
git --git-dir=.git pull
これで完了。
git/my-website.git
へpushがあったら、
/home/fnobi/sites/my-website
に設置してあるhtmlが自動更新されるようになりました。わーい!
成功したかどうかの確認
hookのスクリプトが失敗したときのログとか、どこに出るのかなぁと思っていたら、
pushしたとき手元に出てた。
"remote:"っていう行。
% git push
Counting objects: 11, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (6/6), done.
Writing objects: 100% (6/6), 631 bytes, done.
Total 6 (delta 3), reused 0 (delta 0)
remote: fatal: Not a git repository: '.'
To sasyugo:git/bukko-music-children.git
f225eab..f7932b2 master -> master
うまく行ったときは、ちゃんとそういうログが出てますよ。
remote: From /home/fnobi/git/my-website
remote: bbec307..8becb96 master -> origin/master
remote: Updating bbec307..8becb96
remote: Fast-forward
remote: index.html | 4 ++++
remote: src/ejs/index.html.ejs | 4 ++++
remote: 2 files changed, 8 insertions(+), 0 deletions(-)
べんりだなぁ。
まとめ
クライアントサイドフックで、コミットメッセージに「バルス」が含まれてるかどうかを検知して、
含まれてたらレポジトリを破壊するやつとかあって笑った。
そういえばコミットした瞬間の顔を撮影するやつとかもあったし、
いろんなことできそう。
参考
-
gitのhookを使ってみた。 - 画竜点睛を衝く
シンプルに書いてあってよかった。 -
Git hooks まとめ - Qiita [キータ]
それぞれのhookのタイミングが細かく載ってる -
Lightweight git hook management tool その名も git-hook を作りました - 鳩舎
設置の作業を簡単にやるための拡張あった。いい。