TL;DR
- 「ストレージ管理者」の権限を付けたサービスアカウントを作成する(必要に応じて権限を絞りましょう)
- CircleCIの環境変数にサービスアカウントのキーを設定する
-
.circleci/config.yaml
でこんな感じのことをする
$ echo $GCP_SERVICE_KEY | gcloud auth activate-service-account --key-file -
$ gcloud auth configure-docker --quiet
$ # このへんでDockerイメージのビルドをする
$ docker push ${GCR_REPO}:${CIRCLE_SHA1}
具体的な .circleci/config.yml
の設定例は後述します。
サービスアカウントを作る
GCPのコンソールで「IAM」の「サービスアカウント」を開き、「サービスアカウントを作成」を押します。
サービスアカウント名を入力し、「作成」ボタンを押します。「サービスアカウントID」と「サービスアカウントの説明」はお好みでどうぞ。
アクセス制御の構成 | Container Registry | Google Cloudによると「ストレージ管理者」の権限付けると良いらしいので付けます(実際には権限を絞った方が良いかもしれません)。
次に「鍵の作成」ボタンを押してjsonのアクセスキーをダウンロードします。このファイルは公開しないようにしましょう。
CircleCIの環境変数を設定する
CircleCIのプロジェクトの設定から「Environment Variables」を開き、「Add Variable」ボタンを押します。
今回は環境変数の名前を GCP_SERVICE_KEY
にしました。 Value
に先程ダウンロードした json ファイルの中身をコピペします。
CircleCIの設定ファイルを書く
注意点
CircleCIは複数の Docker のバージョンをサポートしており、デフォルトは 17.03.0-ce です。
Docker コマンドの実行手順 - CircleCI
警告: Docker 認証ヘルパーは、バージョン 18.03 以降でのみ使用してください。以前のバージョンの Docker クライアントのバグにより、認証ヘルパーが構成されていると、docker build の性能が大幅に低下します。
認証方法 | Container Registry | Google Cloud
CircleCIでデフォルトのバージョンのDockerを使うと docker build
のパフォーマンスが低下すると考えられるため、明示的に新しいDockerのバージョンを指定しましょう。
設定例
以下、 設定の jobs
部分です。
jobs:
build:
docker:
- image: google/cloud-sdk:264.0.0
enviromnent:
GCR_REPO: ${gcr_repository_name}
steps:
- checkout
- setup_remote_docker:
docker_layer_caching: true
version: 18.06.0-ce
- run:
name: Authenticate gcloud to push the image
command: |
echo $GCP_SERVICE_KEY | gcloud auth activate-service-account --key-file -
gcloud auth configure-docker --quiet
- run:
name: Build the image
command: |
docker build -t ${GCR_REPO}:${CIRCLE_SHA1} .
- run:
name: Push the image
command: |
docker push ${GCR_REPO}:${CIRCLE_SHA1}