Cloud Build トリガーで自動ビルド、テスト＆デプロイ

## 概要
現在、β版として提供されているCloud Buildトリガーの紹介
Buildトリガーを有効にするための手順、設定をまとめました。

## Cloud Build トリガーとは
Source RepositoryやGithubにPushを検知して、Cloud Buildを実行できる。
現時点ではβ版（いつからβが出現していたのか。。。）

- 公式(β)  
[ビルドトリガー](https://cloud.google.com/cloud-build/docs/running-builds/automate-builds?hl=ja)  
[Cloud Build](https://cloud.google.com/cloud-build/docs/how-to?hl=ja)

ソースの取得元として選択できるリポジトリ
- Source Repository
- Github

## やること
- Cloud BuildトリガーでPushを検知してビルドを行う
- GAE（Google App Engine）に自動でデプロイする

## 前提

- 使用端末
MacOSを使用しています。

- GCPプロジェクトが作成されている
  [プロジェクトの作成](https://cloud.google.com/resource-manager/docs/creating-project?hl=ja)
- Gitがインストールされている
  [Gitインストール](https://desktop.github.com/)
- ソース
[これ](https://github.com/k-tky/cloud_build_trigger)

## やりたいこと
プログラムを作った後、品質を確保するためには継続的にテスト、デプロイを行う必要があります。（CI/CD）
また、自動化を行うことで人が行っているがためにおこるヌケやモレがなくなります。
GithubではGithub Actionsが実装されて自動でCloud Buildに連携が可能になっていましたが、Source Repositoryでソース管理を行っている場合にもCloud Build トリガーでできるようになりました。


## How to set
Build トリガーを設定して実際に動かしてみます。
簡単なフロー図
<img width="564" alt="スクリーンショット 2019-12-03 7.45.17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/525962/fe5af85a-debb-2612-9c4b-48654e133ff0.png">

### 事前設定
クラウドビルドサービスアカウントにApp Engine管理者権限をつける
デプロイ管理者で行けると思ったんですが、なぜか管理者じゃないとダメでした。
App Engine APIを有効にする

### Build トリガーの作成
ナビゲーションのCloud BuildからBuild トリガーを選択します。
<img width="365" alt="スクリーンショット 2019-12-03 7.28.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/525962/5ebb1f84-1fd2-23ee-d98d-2559bc3f38c3.png">

トリガーを作成
<img width="1186" alt="スクリーンショット 2019-12-03 7.34.23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/525962/b21ff068-4f9c-98d7-ea27-5deb69effd6c.png">

トリガーの設定
特に何も考えずに全てのpushに反応するようにします。
各項目を設定後、トリガーを作成します。
<img width="554" alt="スクリーンショット 2019-12-04 7.30.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/525962/568de13f-2bdd-901e-5cd3-41a33e53b0ec.png">

### ビルドトリガーの起動
Source Repositoryにpushします。
（適当に改行とか追加してpush）

```shell
$ git commit -m "Cloud Build Test"
[master 71e85cb] Cloud Build Test
 1 file changed, 1 insertion(+)
$ git push origin master
Enumerating objects: 7, done.
Counting objects: 100% (7/7), done.
Delta compression using up to 8 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (4/4), 343 bytes | 343.00 KiB/s, done.
Total 4 (delta 2), reused 0 (delta 0)
remote: Resolving deltas: 100% (2/2)
To https://source.developers.google.com/p/$PROJECT_ID/r/source-repository-demo
   aab808d..71e85cb  master -> master
```

### ビルドログの確認
Source RepositoryにpushするとBuild トリガーによって自動でビルドが行われます。
Cloud Buildの履歴から確認できます。
<img width="1440" alt="スクリーンショット 2019-12-04 7.49.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/525962/bf952447-9b5a-7a4f-35f7-6a97a3e7582a.png">


### App Engineに配備されていることの確認
App Engineの該当のサービスにアクセスします。
サービス名はapp.yamlのserviceで定義した名前です。
<img width="1438" alt="スクリーンショット 2019-12-04 16.49.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/525962/daa210b8-de32-c1d4-2b06-3051aeea3d02.png">

<img width="685" alt="スクリーンショット 2019-12-04 16.52.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/525962/b4a8a863-f6b5-8ba4-9cf4-d2bf5b5108fc.png">


### 自動テスト
go testも実行されています。
この自動テストがエラーになると、後続のデプロイは行われません。
cloudbuild.yamlの環境変数を変更します。

```cloudbuild.yaml
steps:
  - name: "gcr.io/cloud-builders/go"
    args: ["test", "./test/..."]
    env:
      - "TEST_ENV_VAL=null"
      - "GOPATH=golib"
  - name: "gcr.io/cloud-builders/gcloud"
    args: ["app", "deploy"]
timeout: "1600s"

```

main.goも以下のように変更します。

```main.go
package main

import (
	"fmt"
	"net/http"
)

func main() {
	// ①
	http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
		fmt.Fprintf(w, "Hello, Build Trigger! Test error")
	})

	// ②
	http.ListenAndServe(":8080", nil)
}
```

ソースを変更してSource Repositoryにpushします。
テストがエラーになっています。

<img width="1439" alt="スクリーンショット 2019-12-04 17.00.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/525962/fa61d829-635b-3d76-a24b-3e25c28d8473.png">

デプロイが行われておらず、ソースが反映されていません。
<img width="685" alt="スクリーンショット 2019-12-04 16.52.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/525962/af454428-55c5-ba3a-5820-35849004e589.png">


## いい感じだと思われる使い方
開発用、ステージング用、本番用のブランチを用意し、それぞれのブランチに対応したBuild トリガーを作成する。
<img width="564" alt="スクリーンショット 2019-12-04 17.07.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/525962/dffb50e1-dedc-21dd-de77-745b3966b50d.png">

といいんじゃないかなぁとおもいました

## その他機能
RESTAPIが用意されているみたいです。
[Build Trigger REST API](https://cloud.google.com/cloud-build/docs/api/reference/rest/v1/projects.builds/create?hl=ja)

Buildの開始は
`POST https://cloudbuild.googleapis.com/v1/projects/{projectId}/builds`
でJsonパラメーターに応じて指定のトリガーが起動されるようです。

実行中のBuildのキャンセルもあるようですが、どんなふうに使うんだろう。。。

## 今後望むこと
AWSのこのめっちゃべんりきのうがほしい。~~Build トリガーかんけいない~~
[Test Reports with AWS CodeBuild](https://aws.amazon.com/jp/blogs/devops/test-reports-with-aws-codebuild/)