TL;DR
GitLab.comのプロジェクトで次の準備を一通り行うと、master
ブランチへプッシュするたびにherokuへデプロイしてくれるようになります。
-
HEROKU_TOKEN
に自身のherokuアカウントのAPIキーを登録する 1 -
HEROKU_APP
にデプロイ先となるherokuアプリケーションの名前を登録する 2 -
.gitlab-ci.yml
に次のタスクをコピペする
push-heroku:
only:
- master
image: docker:stable
services:
- docker:dind
script:
- echo $HEROKU_TOKEN | docker login --username=_ --password-stdin registry.heroku.com
- docker build -t registry.heroku.com/$HEROKU_APP/web .
- docker push registry.heroku.com/$HEROKU_APP/web
本文
何故やりたくなったのか
すごくコンパクトな自分用Webサービスの動作環境として、最近herokuを主に使っています。
普段プロジェクト管理はGitLab.comを使っているのですが、せっかくなので"Heroku Git"へではなく"Container Registry"にデプロイしてみることにしました。
HerokuのContainer Registryの仕組み
仕組みといっても、Heroku Git
と表面的には大きな違いがあるわけではありません。
Heroku Git
はプッシュすると、向こう側でBuildpackベースでアプリが動くようになるのに対して、Container Registry
は手元でビルドしたDockerイメージをプッシュして、そのコンテナをそのまま動かすようにできています。
Webアプリ用のポートを環境変数から受け取って待ち受けたり、HTTP/HTTPSをX-Forwarded-Protoで判別するあたりは変わらないです。
基本的には、Heroku-CLIを標準的な取扱方法としており、heroku container:push web
を実行すると
-
docker build
in local -
docker push
to heroku container registory -
docker run
in heroku - をやっていくような感じっぽいです。
さて、ここでのDockerイメージのプッシュ対象となるContainer Registryはregistry.heroku.com
です。
そして、各アプリの動かすときのイメージ名はregistry.heroku.com/<app>/<process-type>
と定められてます。
サイトにはRegistryへのdocker-login
の方法にheroku container:login
だけでなく通常のdocker login
も併記されており、Heroku-CLIは別に必要ないことがわかります。
GitLab-CIでDocker pushを実現する
というわけで、GitLab-CIの仕組みでContainerRegistryへプッシュするまでを作りました。
Herokuの準備
Herokuの側から事前に確認しておくべき点は、次の2個です。
- 自分のアカウントのAPI Key
- デプロイする先のアプリケーション名
.gitlab-ci.yml
の中身(タスク設定)
gitlab-runnerはservices
の概念により、プロジェクトコード用のタスクの裏にDocker in Docker(dind)を動かしてdocker build
を実行してビルドができます。
image: docker:stable
services:
- docker:dind
dockerコマンド用にdocker:stable
イメージを、dockerビルド環境用にdocker:dind
サービスを指定します。
docker login
にはCIなどでパスワードなどを公開しないようにする、--password-stdin
オプションがあります。
これを利用すると、docker login
の前にパスワードをechoすることができるようになり、パスワードを出さずに済むようになります。
script:
- echo $HEROKU_TOKEN | docker login --username=_ --password-stdin registry.heroku.com
API Keyをパスワードに使うことで、usernameを_
にすることが可能です。
script:
(略)
- docker build -t registry.heroku.com/$HEROKU_APP/web .
- docker push registry.heroku.com/$HEROKU_APP/web
あとは、GitLab Registry向けにbuild+pushするのと同じようにタスク設定することで、Heroku上にDockerコンテナ型のアプリをデプロイすることができるようになります。
便利ですね。