git hookによる自動デプロイ
前提条件
- アプリはDockerで実行されている
- 小規模なWEBサイト、組織内部向けのサービスを想定(SLOをあまり重視しない規模)
リポジトリ作成
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などのより高度な環境に移行することを検討した方がよい。