doc.dev1x.org

git hookによる自動デプロイ

前提条件

リポジトリ作成

cd /var/git
sudo mkdir test.git
cd test.git
git init --bare

hook

post-receive

デプロイ

cd ${DEPLOY_DIR}
git -C ${REPOSITORY} pull origin master
# 必要に応じてコンテナ内のビルドスクリプトを実行
docker-compose exec app bash build

コンテナ自体のビルドが必要な場合

コンテナ内で利用するミドルウェアの追加など Dockerfile 自体の更新がある場合はコンテナをリビルドする必要がある。その場合は以下のようにコンテナを再起動すればよい。

cd ${DEPLOY_DIR}
git -C ${REPOSITORY} pull origin master
docker-compose up -d --build

ただし、これはコンテナの再起動を伴う為、再起動時にアプリが停止し、数秒程度のダウンタイムが発生する。必要に応じてメンテナンスページを出すなど相応の措置を取った方がよいだろう。

とはいえ、コミットの度に毎回 Dockerfile が更新されるという状況はあまり考えにくく、 Dockerfile の更新が稀であるなら毎回コンテナの再起動を行うのは合理的ではない。通常はアプリの更新処理だけ実行されるようにしておき、 Dockerfile の更新時のみ手作業で対応するという運用も検討してもいいだろう。

補遺

自動テストなどは?

ここではデプロイを主眼としているので自動テストについては言及しなかった。また、本稿で述べた構成ではテストが失敗してもエンジニアがそれを知る方法がない(別途通知スクリプトを作成する必要がある)。

その為、サーバ側で行うのではなく、ローカル側で実施する方がよいと思える。

また、自動テストが必要になってきたのであればGitHub+CIなどのより高度な環境に移行することを検討した方がよい。