GKE試行（その2：「GitHub -> CSR へ。そしてGCBによりGCRへ」）

# お題
[前回](https://qiita.com/sky0621/items/2faf4f7e6b2c9b269945)は、GKEに乗せるサンプルアプリをGoで実装した。
ローカルでDockerコンテナとしてrunしてアクセスできるところまでは確認したので、今回こそはGKEでといきたいところだけど、
このアプリをどうやってGKEに乗せる？
というわけで、最近レイアウト（及びラインナップ）の変わったGCPの「[プロダクトとサービス](https://cloud.google.com/products/)」を見てみる。
GKEもだけど、SpannerやStackdriver Kubernetes Monitoringというのがアピールされていて、ものすごく気になる。
が、今日のお題はそこではないので、デベロッパーツールのカテゴリを見る。
はい、↓このあたりが使えそう。

- [Container Registry](https://cloud.google.com/container-registry/) ... Docker コンテナ イメージを保存、管理、保護します。
- [Cloud Build](https://cloud.google.com/cloud-build/) ... 継続的なビルド、テスト、デプロイを実現します。
- [Cloud Source Repositories](https://cloud.google.com/source-repositories/) ...チームが一元的にコードを保存、管理、追跡できる場所。

想定だけど、今GitHubに置いてある[リポジトリ](https://github.com/sky0621/go-webapi-for-gke-study)をCloud Source Repositories（以後、「CSR」と略す）に移動し、
Cloud Build（以後、「GCB」と略す）を使ってdocker buildして、出来たイメージをContainer Registry（以後、「GCR」と略す）に保存。
GCRにイメージがあれば、GKEではdeploymentを書くことでGCRからイメージをpullしてきて、それをPodに入れることができた、はず。
※GCB使うとGitHubにソースがあるままでビルドできるようだけど、せっかくだからCSRも使う。

# 環境
[前回](https://qiita.com/sky0621/items/2faf4f7e6b2c9b269945#環境)と同じ。

# 前提
- 自前でGCPプロジェクトは契約済み
- gcloudをローカルで使える状態になっている

# 実践
## Cloud Source Repositories
単純にCSR上にGitHubにあるものと同じリポジトリを作ってソースをコピーしようかと思ったけど、↓によると、うまいこと連携できる様子。
https://cloud.google.com/source-repositories/docs/connecting-hosted-repositories

### （１）まずCSR上にリポジトリを作る
![01.png](https://qiita-image-store.s3.amazonaws.com/0/180599/69aa321e-21d2-fece-cec7-31a7c56fa2ad.png)
![02.png](https://qiita-image-store.s3.amazonaws.com/0/180599/2b758ab5-3acd-12df-e535-d394c2c548c3.png)

### （２）次にGitHubの自分のアカウントに接続
![03.png](https://qiita-image-store.s3.amazonaws.com/0/180599/f08f5411-801b-ca49-79b1-57d916d216a2.png)
![04.png](https://qiita-image-store.s3.amazonaws.com/0/180599/948b6b6d-b85b-d7ff-6806-e03b097c697e.png)
![05.png](https://qiita-image-store.s3.amazonaws.com/0/180599/7fe0175c-eed5-e77d-3975-9d80d99773c3.png)
![06.png](https://qiita-image-store.s3.amazonaws.com/0/180599/2f751773-62b6-f834-c049-62f89ac42592.png)

### （３）連携したいリポジトリを選択
![07.png](https://qiita-image-store.s3.amazonaws.com/0/180599/8054fac8-be0b-4e4e-bb00-39966c20c67b.png)
GitHub上のリポジトリと同じファイル群が並ぶ
![08.png](https://qiita-image-store.s3.amazonaws.com/0/180599/131164f9-1a48-2222-7747-3d3033aaffc8.png)
Dockerfileの中身も見れる
![09.png](https://qiita-image-store.s3.amazonaws.com/0/180599/af2fa946-5bd0-ef49-455a-cc60a15df57d.png)

### （４）ローカルでGitHubのリポジトリのソースを修正してGitHubにプッシュ
![10.png](https://qiita-image-store.s3.amazonaws.com/0/180599/1db32a15-17c1-49fe-4bb2-aa8238d75ac1.png)

### （５）すると、CSR上にも変更内容が反映されている
![11.png](https://qiita-image-store.s3.amazonaws.com/0/180599/f1ce072e-8664-3609-fa09-cb64e0b743dd.png)

## Cloud Build
CSRにソースは入ったので、CSRへのプッシュをトリガーに、docker buildしてGCRにイメージをプッシュするビルドを作る。

Dockerを扱う手順は下記を参考にする。
https://cloud.google.com/cloud-build/docs/quickstart-docker

### （１）まずはもともとリポジトリに用意してあるDockerfileを使ってビルド、そしてGCRにプッシュ
これは、ローカル上。
※↓の【PROJECT_ID】の部分は自分のGCPプロジェクトのプロジェクトIDを入れる。

```
$ pwd
$ ls -la
合計 104
drwxr-xr-x  4 koge koge  4096  9月 15 02:49 .
drwxr-xr-x 11 koge koge  4096  9月 12 23:19 ..
drwxr-xr-x  8 koge koge  4096  9月 15 03:08 .git
-rw-r--r--  1 koge koge   202  9月 13 00:04 .gitignore
-rw-r--r--  1 koge koge   555  9月 15 02:49 Dockerfile
-rw-r--r--  1 koge koge  2047  9月 13 00:03 Gopkg.lock
-rw-r--r--  1 koge koge   790  9月 13 00:03 Gopkg.toml
-rw-r--r--  1 koge koge  3472  9月 13 00:49 README.md
-rw-rw-r--  1 koge koge   644  9月 13 00:27 main.go
-rw-rw-r--  1 koge koge 63491  9月 13 00:46 postman.png
drwxr-xr-x  5 koge koge  4096  9月 13 00:03 vendor
$ 
$ gcloud builds submit --tag gcr.io/【PROJECT_ID】/go-webapi-for-gke-study .
Creating temporary tarball archive of 6 file(s) totalling 69.3 KiB before compression.
Some files were not included in the source upload.

Check the gcloud log [/home/koge/.config/gcloud/logs/2018.09.15/03.13.11.394727.log] to see which files and the contents of the
default gcloudignore file used (see `$ gcloud topic gcloudignore` to learn
more).

Uploading tarball of [.] to [gs://【PROJECT_ID】_cloudbuild/source/1536948791.71-72d2e1ad5c3749c3b2bcaf294dfdb49e.tgz]
ERROR: (gcloud.builds.submit) FAILED_PRECONDITION: service account "806987825204@cloudbuild.gserviceaccount.com" has insufficient permission to execute the build on project "【PROJECT_ID】"
```

ん？　サービスアカウント「806987825204@cloudbuild.gserviceaccount.com」にビルド権限が付いていないとのこと。

### （２）サービスアカウントにビルド権限を付与
![01.png](https://qiita-image-store.s3.amazonaws.com/0/180599/3bfd5f96-5811-424e-95db-0dae025b9a54.png)
![02.png](https://qiita-image-store.s3.amazonaws.com/0/180599/7831c53a-5f83-03ea-403d-bf7d3052ed68.png)
![03.png](https://qiita-image-store.s3.amazonaws.com/0/180599/08e9f055-0a50-cbe9-1ece-6e9fed3ca8f3.png)
![04.png](https://qiita-image-store.s3.amazonaws.com/0/180599/03ce9255-9e83-02f2-b6eb-6a8b86998d37.png)

はい、付いた。

### （３）気を取り直して、もう一度、ビルド

```
$ gcloud builds submit --tag gcr.io/【PROJECT_ID】/go-webapi-for-gke-study .
Creating temporary tarball archive of 6 file(s) totalling 69.3 KiB before compression.
Some files were not included in the source upload.

Check the gcloud log [/home/koge/.config/gcloud/logs/2018.09.15/03.33.27.646782.log] to see which files and the contents of th
default gcloudignore file used (see `$ gcloud topic gcloudignore` to learn
more).

Uploading tarball of [.] to [gs://【PROJECT_ID】_cloudbuild/source/1536950007.68-48339507e1154a88812b584b2401ff9f.tgz]
Created [https://cloudbuild.googleapis.com/v1/projects/【PROJECT_ID】/builds/681880cd-5725-4589-93f4-09248a2f8fbb].
Logs are available at [https://console.cloud.google.com/gcr/builds/681880cd-5725-4589-93f4-09248a2f8fbb?project=806987825204].
---------------------------------------------------------------------------- REMOTE BUILD OUTPUT ----------------------------------------------------------------------------
starting build "681880cd-5725-4589-93f4-09248a2f8fbb"

FETCHSOURCE
Fetching storage object: gs://【PROJECT_ID】_cloudbuild/source/1536950007.68-48339507e1154a88812b584b2401ff9f.tgz#1536950013656896
Copying gs://【PROJECT_ID】_cloudbuild/source/1536950007.68-48339507e1154a88812b584b2401ff9f.tgz#1536950013656896...
/ [1 files][ 62.5 KiB/ 62.5 KiB]                                                
Operation completed over 1 objects/62.5 KiB.                                     
BUILD
Already have image (with digest): gcr.io/cloud-builders/docker
Sending build context to Docker daemon   76.8kB
Step 1/9 : FROM "sky0621dhub/dockerfile-gowithdep" AS builder
latest: Pulling from sky0621dhub/dockerfile-gowithdep
c73ab1c6897b: Pulling fs layer
1ab373b3deae: Pulling fs layer
　〜省略〜
f64db6c96f10: Pull complete
629e65f65eb5: Pull complete
Digest: sha256:64a905eeacc62530de17940039c6a65096cc2b2568feb42b4cfaa5b0f12e5ba9
Status: Downloaded newer image for sky0621dhub/dockerfile-gowithdep:latest
 ---> 34ac64e9d330
Step 2/9 : COPY . /go/src/github.com/sky0621/go-webapi-for-gke-study
 ---> 598877980113
Step 3/9 : WORKDIR /go/src/github.com/sky0621/go-webapi-for-gke-study
Removing intermediate container 3437c261bdbf
 ---> 38d20f9acc31
Step 4/9 : RUN dep ensure
 ---> Running in b59bd35db687
Removing intermediate container b59bd35db687
 ---> 46706ce5e6ac
Step 5/9 : RUN CGO_ENABLED=0 go build -o go-webapi-for-gke-study github.com/sky0621/go-webapi-for-gke-study
 ---> Running in c0c554f1476a
Removing intermediate container c0c554f1476a
 ---> e827ea3a214b
Step 6/9 : FROM scratch
 ---> 
Step 7/9 : COPY --from=builder /go/src/github.com/sky0621/go-webapi-for-gke-study/ .
 ---> f6eaed172133
Step 8/9 : EXPOSE 80
 ---> Running in 9802fc7cbf7a
Removing intermediate container 9802fc7cbf7a
 ---> a5f60d73eae9
Step 9/9 : ENTRYPOINT [ "./go-webapi-for-gke-study" ]
 ---> Running in d57c6d17a055
Removing intermediate container d57c6d17a055
 ---> 4d0f24ae4c0a
Successfully built 4d0f24ae4c0a
Successfully tagged gcr.io/【PROJECT_ID】/go-webapi-for-gke-study:latest
PUSH
Pushing gcr.io/【PROJECT_ID】/go-webapi-for-gke-study
The push refers to repository [gcr.io/【PROJECT_ID】/go-webapi-for-gke-study]
50928a922a9b: Preparing
50928a922a9b: Pushed
latest: digest: sha256:bed118ff9ee50c422013c044e7f2370466a05250f81be4aa077977b343d47f1a size: 528
DONE
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------

ID                                    CREATE_TIME                DURATION  SOURCE                                                                                 IMAGES                                                STATUS
681880cd-5725-4589-93f4-09248a2f8fbb  2018-09-14T18:33:34+00:00  59S       gs://【PROJECT_ID】_cloudbuild/source/1536950007.68-48339507e1154a88812b584b2401ff9f.tgz  gcr.io/【PROJECT_ID】/go-webapi-for-gke-study (+1 more)  SUCCESS
```

はい、今度は成功。

### （４）もうひとつの手順であるCloud Build設定ファイルを使ってのビルドも試す
設定ファイルはこんな感じ。

```
$ cat cloudbuild.yaml 
steps:
- name: 'gcr.io/cloud-builders/docker'
  args: [ 'build', '-t', 'gcr.io/$PROJECT_ID/go-webapi-for-gke-study', '.' ]
images:
- 'gcr.io/$PROJECT_ID/go-webapi-for-gke-study'
```

で、この設定ファイルを使ってビルドしてみる。

```
$ gcloud builds submit --config cloudbuild.yaml .
Creating temporary tarball archive of 7 file(s) totalling 69.5 KiB before compression.
Some files were not included in the source upload.
　　〜省略〜
latest: digest: sha256:76fa6d2ebe904dbe6fbfb65acf7cbc7cfc59d38e3e53428382495b0d3fb103de size: 528
DONE
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------

ID                                    CREATE_TIME                DURATION  SOURCE                                                                                 IMAGES                                                STATUS
802fc106-c0aa-40c5-8dff-e1c3017767be  2018-09-14T19:04:37+00:00  56S       gs://【PROJECT_ID】_cloudbuild/source/1536951874.48-aa62a35281c4492c85123de5cfe999d8.tgz  gcr.io/【PROJECT_ID】/go-webapi-for-gke-study (+1 more)  SUCCESS
```

成功。

## Container Registry
コンソール上では成功のログは出ていたので、実際にコンテナイメージが格納されているか確認
![05.png](https://qiita-image-store.s3.amazonaws.com/0/180599/baebbc36-115c-889c-f455-2bc5e8a19d4f.png)
ちゃんと２回分、入ってる。

# まとめ
そういえば、ビルドはソースのプッシュをトリガーにしたいと思っていたんだった。
https://cloud.google.com/cloud-build/docs/running-builds/automate-builds
↑でできるようだけど、ベータ版。いったん静観。というか、今日は時間切れ。
次回こそは、GKE。。。