Google Cloud Container Builder事始め

# はじめに
Google Cloud Container Builderはdockerのコンテナイメージを構築するためのスタンドアローンのツールです。
dockerをビルドするだけでなく、任意のビルドステップを定義してnpm,git,goのような柔軟なタスクをこなすことが可能です。ローカルでビルドしたイメージをpushするのが面倒くさいぜ！という人にオススメです。pushされた変更をトリガーするだけなら30分もあれば構築することが可能です！

# 料金
アカウントにつき、120分/日の無料ビルドが可能です。(2017/03/21現在）
120分を超えると0.0034ドル/build time(分)の料金が発生します。

# イメージ図
![GCCB_image.png](https://qiita-image-store.s3.amazonaws.com/0/122500/fd72ce09-a817-7736-ec3a-d573a81bebea.png)

# 解説
## 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でビルドを行う](https://cloud.google.com/container-builder/docs/docker-build)
    1. gcloudにログインします（gcloudへのログイン方法は割愛します）
    2. `gcloud container builds submit --tag gcr.io/$MY_PROJECT/$TARGET_CONTAINER .`をDockerfileが存在するディレクトリで実行します。
    3. 上記のコマンドでは、カレントディレクトリの内容がCloud Storageにアップロードされ、展開された後にビルドソースとしてビルドが始まります。
    4. 出力はターミナルにストリームされ、ビルドが成功するとCloud Container Registryにアップロードされます。

* [Google Cloud Container Builder APIでビルドを行う](https://cloud.google.com/container-builder/docs/curl)
    1. gcloudにログインします。
    2. ビルドステップが定義されたjsonを作成します。
    3. curlでリクエストをPOSTします。
    4. ビルドが成功すると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を使ってビルドのカスタマイズする方法を少し紹介します。[このページ](https://cloud.google.com/container-builder/docs/config)を引用しています。

以下は最初の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](https://github.com/GoogleCloudPlatform/cloud-builders)として以下のものが用意されていますが、自前で用意したコンテナを指定することも可能です。

* 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の進化が早すぎてついていけないので、勘違いしている箇所があるかもしれません。コメント欄で指摘してもらえると助かります！