最近会社でGCPを使っている@kshibata101です。
GCPのCI/CDサービスであるCloud Buildで環境変数を設定しDockerを動かすときにちょっと詰まったので、方法を備忘録的に残そうと思います。
Cloud Build
GCPでCI/CDを可能にしてくれるサービスです。
まだ出て間もないサービスで、2019年1月現在ではトリガーの機能がベータ版のようです。
基本的にはcloudbuild.yamlというファイルを用意し、そこにコマンドを書いていくことでCI/CDを実現します。
cloudbuild.yamlを用意せずとも、Dockerfileを与えればそれを勝手にビルドしてくれる設定も可能ですが、ここではyamlで設定する方法を記載します。
変数を渡すフロー
上でも触れた通り、CloudBuildではビルドの対象として
- Dockerfileをそのまま指定する
- cloudbuild.yamlというビルド手順を書いたファイルを用意する
という2通りがありますが、2番目のcloudbuild.yamlを用意する場合は変数代入の機能が使えます。
ただ、ここの変数はあくまでcloudbuild.yaml内で使える変数なので、そのままではDockerfile内のコンテナで扱う変数を設定することはできません。
しかし、Dockerfileで変数を取り扱う設定にはARGとENVがあり、
- ARG: docker imageをビルドするときに使える外から渡す変数
- ENV: ビルド後のコンテナ内に設定される内部で使う環境変数
ということなので、ARGで受けてENVに設定すれば、コンテナ内の変数として扱うことができます。
最終的には
CloudBuildの代入変数 => cloudbuild.yamlの--build-arg引数 => DockerfileのARG => ENV
といった感じになります。
設定
具体的な設定方法です。
今回はRailsで5.2から導入されたcredentialsを扱うための環境変数「RAILS_MASTER_KEY」をCloud Buildから設定してみました。
まずレポジトリにDockerfileとcloudbuild.yamlを用意します。
コードはこんな感じになります。
# Dockerfile
FROM gcr.io/google-appengine/ruby
ARG _RAILS_MASTER_KEY
ENV RAILS_MASTER_KEY ${_RAILS_MASTER_KEY}
:
DockerfileでARG変数はアンダースコアで始めてますが、これはFROMに指定したイメージがすでにRAILS_MASTER_KEYを定義していたのであえてアンダースコアをつけています。
# cloudbuild.yaml
steps:
- name: 'gcr.io/cloud-builders/docker'
args: ["build", "-t", "gcr.io/$PROJECT_ID/appengine/default:$_TAG",
"--build-arg", "_RAILS_MASTER_KEY=$_RAILS_MASTER_KEY", "."]
- name: 'gcr.io/cloud-builders/docker'
args: ["push", "gcr.io/$PROJECT_ID/appengine/default:$_TAG"]
- name: 'gcr.io/cloud-builders/gcloud'
args: ["app", "deploy", "gcp/app-${_PROJECT_ENV}.yaml", "--quiet"
"--image-url=gcr.io/$PROJECT_ID/appengine/default:$_TAG"]
cloudbuild.yamlは、「build」「push」「deploy」に分けて実行しています。
こちらの変数をアンダースコアで始めているのはCloudBuildの代入変数の仕様のためです。
ファイルの用意が終わったら、gitのレポジトリにpushしておきます。
続いて、CloudBuildに行きトリガーを設定します。
設定方法は公式や他の記事などに譲りますが、gitレポジトリと連携して先程pushしたブランチを指定すればOKです。
設定画面内の「ビルド設定」でcloudbuild.yamlを選択し、レポジトリ内のパスを入れておきます。
また、その下に代入変数を設定します。
先程書いたDockerfileのARGに相当するkeyとvalueを設定します。
なお、_RAILS_MASTER_KEYの他に、環境分割用に_PROJECT_ENV、バージョン管理用に_TAGを設定しています。
あとは保存をして、トリガーを起動させます。
pushしてもいいですし、手動でも起動は可能です。
実行するとログが出るので正しく設定されたか確認します。
deploy後Google App Engineでちゃんと動くか確認できれば設定は完了です。
おわり
鍵などの秘密にしたい変数の場合はIAMで閲覧権限を絞るか、絞れない場合は秘密情報の設定は避けた方が懸命かもしれません。
秘密情報についてはCloud KMSで暗号化しておきbuild時に復号して渡す方法もあったりするので、実現できたらまた残します。
今回はあくまで設定方法の共有ということで、参考になれば幸いです。