はじめに
Google Cloud Container Builderはdockerのコンテナイメージを構築するためのスタンドアローンのツールです。
dockerをビルドするだけでなく、任意のビルドステップを定義してnpm,git,goのような柔軟なタスクをこなすことが可能です。ローカルでビルドしたイメージをpushするのが面倒くさいぜ!という人にオススメです。pushされた変更をトリガーするだけなら30分もあれば構築することが可能です!
料金
アカウントにつき、120分/日の無料ビルドが可能です。(2017/03/21現在)
120分を超えると0.0034ドル/build time(分)の料金が発生します。
イメージ図
解説
1.ビルドのリクエスト
ビルドリクエストは指定のブランチにpushされた場合と任意のタイミングでビルドを行う2種類の方法があります。順を追って説明しましょう。
トリガーの作成(指定のブランチにpushされた場合)
GCPのコンソールからContainer Registryを開くとトリガーを作成
という項目があります。
ここでは正規表現に一致するブランチにpushされるとビルドが実行されるトリガーを作成することができます。
Sourceの取得先としてCloud Source Repositories,Github,Bitbucketから選択することが出来ますが、Cloud Source Repositories以外を選択した場合はCloud Source RepositoriesにRepositoryのミラーが作成されるので注意が必要です。ビルド設定として、Dockerfileかcloudbuild.yamlを選択することができ、image作成だけが行いたければDockerfileを、任意のビルドステップが実行したければcloudbuild.yamlを指定するとよいでしょう。ビルドが成功するとCloud Container Registryにアップロードされます。
任意のタイミングでビルドする
任意のタイミングでビルドを行うにはgoogle-cloud-SDK(gcloudコマンド)を使う、又はGoogle Cloud Container Builder APIを使うの2種類の方法があります。より詳しい内容はGCPのドキュメントを参照して下さい。
-
- gcloudにログインします(gcloudへのログイン方法は割愛します)
-
gcloud container builds submit --tag gcr.io/$MY_PROJECT/$TARGET_CONTAINER .
をDockerfileが存在するディレクトリで実行します。 - 上記のコマンドでは、カレントディレクトリの内容がCloud Storageにアップロードされ、展開された後にビルドソースとしてビルドが始まります。
- 出力はターミナルにストリームされ、ビルドが成功するとCloud Container Registryにアップロードされます。
-
Google Cloud Container Builder APIでビルドを行う
- gcloudにログインします。
- ビルドステップが定義されたjsonを作成します。
- curlでリクエストをPOSTします。
- ビルドが成功するとCloud Container Registryにアップロードされます。
2.ソースの取得
1.ビルドリクエストにもチラッと書きましたが、Cloud Source Repositories
にビルドソースがない場合、どこからGCCBがソースを取得するか見ていきます。
-
トリガーを作成した場合
-
Cloud Source Repositories
にRepositoryのミラーが作成されます。外部のRepositoryのpushイベントをhookしてビルドが実行されるため、初回に認証が必要です。
-
-
任意のビルドの場合
- ビルドステップで指定したディレクトリが.tgz形式に圧縮されCloud Storageバケットにアップロードされ、Container Builderはそのファイルを展開して使用します。
3.イメージのpush
ビルドが成功するとイメージがCloud Container Registry上に自動でアップロードされます。あとは煮るなり焼くなりすきにイメージを使用しましょう。
ビルドのカスタマイズ
Cloud Container Builderで出来ることをイメージしてもらうために、cloudbuild.yamlを使ってビルドのカスタマイズする方法を少し紹介します。このページを引用しています。
以下は最初の2つのグループは同時に実行し、3つ目のグループは他の2つのグループの完了を待ってから開始する例です。
cloudbuild.yaml
steps:
- name: 'gcr.io/cloud-builders/go'
args: ['generate']
- name: 'gcr.io/cloud-builders/go'
args: ['test', './...']
- name: 'gcr.io/cloud-builders/go'
args: ['install', 'mytarget']
id: 'go-install'
- name: 'gcr.io/cloud-builders/gsutil'
args: ['cp', '-r', 'gs://my-resource-bucket/somefiles', './somefiles']
waitFor: ['-'] # The '-' indicates that this step begins immediately.
id: 'fetch-resources'
- name: 'gcr.io/cloud-builders/docker'
args: ['build', '-t', 'gcr.io/$PROJECT_ID/mytarget', '.']
waitFor: ['go-install', 'fetch-resources']
images: ['gcr.io/$PROJECT_ID/mytarget']
nameで実行するタスクを指定できます。Officail Builder Imageとして以下のものが用意されていますが、自前で用意したコンテナを指定することも可能です。
- bazel: runs the bazel tool
- docker: runs the docker tool
- gcloud: runs the gcloud tool
- git: runs the git tool
- glide: runs the glide tool
- go: runs the go tool
- golang-project: recognizes and builds conventional Go projects into container images
- gsutil: runs the gsutil tool
- npm: runs the npm tool
- wget: runs the wget tool
idでタスクをグルーピングすることでグループ毎の優先順位付けと同時実行ができます。imageで指定したイメージ名でContainer Registryにアップロードされます。
さいごに
GCPの進化が早すぎてついていけないので、勘違いしている箇所があるかもしれません。コメント欄で指摘してもらえると助かります!