GitのWebhookで自動デプロイする

Gitのpushのタイミングで自動的にデプロイするなどのやり方です。Webhookを使うことになるので、自動デプロイを含めて何でもできるということになります。例えばpush時のメール通知、ロギング、バックアップ、更新ファイルのリストを記録したり、やりたいことは何でもできるということになります。Gitのリポジトリに対して何かしらのことをしたタイミングでいろいろできるようになっています。

設定方法

リポジトリの以下のディレクトリにwebhookがあります。

REPOS/hooks

すでにサンプルがあるので、わかりやすいです。

applypatch-msg.sample
commit-msg.sample
post-commit.sample
post-receive.sample
post-update.sample
pre-applypatch.sample
pre-commit.sample
pre-rebase.sample
prepare-commit-msg.sample
update.sample

pushしたタイミングで作動するのは、

  1. post-receive
  2. post-update

で、post-receive->post-updateの順番で処理されます。branchによる処理分岐(例えばxxxブランチの場合はステージングにデプロイとか)のある場合はpost-updateに処理を書きます。.sampleを削除して使います。

簡単な設定をしてみる

このファイルにコマンドを書いておけばそのまま実行してくれます。

cd REPOS/hooks
cp -p post-update.sample post-update
vi post-update

適当に書いてみる

echo "test" >> /SOME_FULLPATH/test.log

pushするとtest.logに書かれているのがわかると思います。

いろいろやってみる

pushしたときのbranch名を取得してみます。これで取得できます。

branch=$(git rev-parse --symbolic --abbrev-ref $1)
echo $branch

ブランチ名でいろいろ処理をわければOK。

# Define
log="/SOME_PATH/deploy.log"
dir="/SOME_PATH/LOCAL_REPOS"

# Get branch name
branch=$(git rev-parse --symbolic --abbrev-ref $1)
date "+%Y.%m.%d %H:%M:%S" >> $log
echo "branch name:" $branch >> $log

# Automatic pull
if [ "$branch"  = "master" ]
then
  cd $dir
  git --git-dir=.git pull origin master
  echo "It is done to pull " $branch >> $log
fi

pushしたブランチ名を取得してから、該当のローカルリポジトリでpullすればよいです。master以外のブランチの場合はpullされないという設定になります。


メモ: Gitリモートリポジトリにpushして自動更新してもらう方法
gitでシンプルなデプロイ環境を作る
gitのブランチのpushで本番環境とテスト環境への反映を切り替える

Last update: 2019.05.05 (日)