Cloud Build
ubuntu,debian,alpine,busybox などのイメージはある
Cloud KMS の値を secretEnv で引く
substitutions から substitutions の値は参照できない
まあそう
yaml 中では $RPROJECT_ID とかも使えない(空になる)
cloudbuild の各ステップの shell 中では使えるはず
手元から gcloud で実行する例
$ gcloud builds submit --config cloudbuild.yaml .
$ gcloud --project ${GCP_PROJECT} builds submit --config cloudbuild.yaml .
Github トリガなど、リポジトリの内容が渡ってくるものと .gcloudignore で食い違う場合があるのは注意
cloudbuild.yml
$RPROJECT_ID という環境変数が使える
GitHub タグでトリガーする場合は $TAG_NAME はあるけど $BRANCH_NAME は無い
ログを Cloud Logging にだけ残す
code:options.yaml
options:
logging: CLOUD_LOGGING_ONLY
シェルスクリプト書く
まあよく必要になる
shbang を省略したら #!/bin/sh
環境変数は当然動く、変数置換はデフォルトオフ
automapSubstitutions: true で利用する
code:scripting.yaml
steps:
- name: "gcr.io/cloud-builders/docker"
script: |
docker create --name=foo hogehoge:latest
docker cp foo:/app ./app
# これでも書けるが古い
- name: ...
entrypoint: bash
args:
- c
- |
docker ...
Cloud Build マシンタイプ
UNSPECIFIED
N1_HIGHCPU_8
N1_HIGHCPU_32
メモリサイズなどはこちら GCE の対応するマシンタイプで分かりそう
UNSPECIFIED は n1-standard-1、1CPU
github app のトリガでやってくるのは git リポジトリではない
gcr.io/cloud-builders/git で log とかやってもだめ
一度 clone する必要がある
timeout
must be <= build timeout "10m0s" cloud build
のように言われる時は、ビルドの timeout を伸ばす必要がある
timeout にはビルド全体と、ステップ単位のがある
ステップの timeout がビルド全体の timeout より長ければエラーになる、省略した場合デフォルトは "10m0s"
手元で実行する
$ gcloud components install cloud-build-local でインストールしてもどこに入るねんという話は
Github 経由か手元からか
Github トリガだとリポジトリの内容が clone されてそこを workspace に実行される。
手元から $ gcloud builds submit --config cloudbuild.yaml $DIR とすると、$DIR の内容をアップロードする。
後者の場合 .gcloudignore が参照されるので、git リポジトリに含まれるけど .gcloudignore で無視されている、という場合実行結果が異なる場合がある
(例えばデプロイ速くするために go mod vendor してアップロードしたりしていると、go.mod はリポジトリには入っているけど .gcloudignore されている、というようなことが起きる)
デバッグ
各ステップの image を GCR から落としてこれるので、そのイメージをローカルで眺めて調べると便利
$ gcloud auth configure-docker しておくと
docker pull gcr.io/... したときに gcloud の認証情報を通して pull できる
マルチアーキテクチャビルドのサンプル
Cloud Builders Community イメージ
例えば、CloudBuild は各ステップを docker container 上で実行するけど、そこで docker-compose を使いたい場合 docker-compose が動くイメージが必要になる。cloud-buidlers-community には、そいう典型的なイメージを作って GCR に上げるための cloudbuild タスク定義が置いてある、という感じ。
code:push-cloudbuilders-community-image.sh
# Cloud Builder のコミュニティイメージをビルドして GCR へ push するスクリプト
set -ex
GCP_PROJECT=${CGP_PROJECT:-hogehoge}
BUILDER_IMAGE=${BUILDER_IMAGE:-docker-compose}
DIR=$(mktemp -d)
cd ${DIR}
cd ${DIR}/cloud-builders-community/${BUILDER_IMAGE}
gcloud --project ${GCP_PROJECT} builds submit --config cloudbuild.yaml .
echo "Use gcr.io/${GCP_PROJECT}/{BUILDER_IMAGE}"