Google Cloud BuildをGitHubリポジトリで動かしてHello, World!

Google Cloud BuildをGitHubリポジトリと連携させて、ビルドジョブを動かしてみました。

CI/CDの類を構築したことがなかったので、Hello, World!からです。

2021/05/07追記：AWSのCodeBuildも試しました → [AWS CodeBuildをGitHubリポジトリで動かしてHello, World!](https://qiita.com/suzuki-navi/items/9b69a39668826f28b85c)

この記事にあるスクショは、白い背景はGoogle Cloud Platformのページで、黒い背景はGitHubのページです。


# 前提

- Google Cloud Platformにプロジェクトが存在する
- GitHubアカウントが存在する
- GitHub上にGoogle Cloud Buildを試すためのリポジトリが存在する


# 手順

1. Cloud BuildをGitHubリポジトリに接続
2. pushしたらジョブを起動するためのTriggerをCloud Buildに設定
3. ジョブの内容を記述するファイル cloudbuild.yaml を作成
4. pushしてジョブを実行してみる


## Cloud BuildをGitHubリポジトリに接続

Cloud Buildの画面に移動し、左のメニューのTriggersを選択します。

まずはCloud Buildをリポジトリに接続することが必要なので、「CONNECT REPOSITORY」のボタンをクリックします。次のような画面になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490207/bec19f5d-76a7-34b7-ff24-b8b60ff70617.png)

今回はGitHubのリポジトリで作成してみます。GitHub認証の設定では、ブラウザがGitHubのページに移動して承認を求められますので、承認します。すると次のような画面になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490207/4c4a1329-29f9-ff0a-57f7-e7bf2e87fa92.png)

"GitHubにGoogle Cloud Buildをインストール" することが必要のようです。「INSTALL GOOGLE CLOUD BUILD」のボタンをクリックすると、再びGitHubの画面が開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490207/3c834e1b-b325-c85c-4924-443f015f30ff.png)

この画面になるので、インストールするリポジトリを選択します。

インストールが完了すると、Google Cloudの画面に戻り、接続するリポジトリが選択できるようになりますので、選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490207/337f199b-2fa4-2543-b995-ae02b048f1ad.png)

「CONNECT」のボタンをクリックすると、接続完了です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490207/5bafd13e-fdb3-3883-6abd-ad982da85555.png)

続いて、「CREATE A TRIGGER」のボタンをクリックすると、Trigger作成画面に移動します。

ちなみに、GitHubの画面では、自分のアカウントのページのSettingsのメニューにあるApplicationsのページを見ると、Installed GitHub AppsとしてGoogle Cloud Buildが登場しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490207/6998801b-31a0-0e4b-9430-45cb86333fe6.png)


## pushしたらジョブを起動するためのTriggerをCloud Buildに設定

次は、GitHubにpushすると自動でジョブが走るようにTriggerを設定します。

「CREATE A TRIGGER」のボタンをクリックし、Trigger作成画面に移ります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490207/5911dd55-94c4-aa8a-8f46-2426908f31c1.png)

Nameだけ適当に入力します。

EventはPush to a branch、Sourceはすでに先ほど作成したリポジトリが選択されています。Branchはデフォルトで `^main$` となっています。正規表現のようです。

Configurationはデフォルトのままにします。

これで「CREATE」ボタンをクリック。

Triggers一覧の画面になり、Triggerが作成されていることが確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490207/ef9a291e-766b-e19b-2aaa-5ed7beac044a.png)


## ジョブの内容を記述するファイル cloudbuild.yaml を作成

ジョブの内容を記述するファイルはYAMLでリポジトリの中に作成します。

`cloudbuild.yaml` という名前で以下の3行のみのYAMLを作成します。

```yaml
steps:
  - name: "bash"
    args: ["echo", "Hello, World!"]
```


## pushしてジョブを実行してみる

このYAMLファイルを`git commit`し、`git push` でGitHubにpushすると、Cloud Buildのビルドが実行されます。

Cloud Buildの画面の左のメニューのHistoryを選択すると、実行履歴が残されてます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490207/065bd0e6-95b3-8775-0cfd-38d98e6ddcec.png)

Hello, World!ができました。


# おまけ

`cloudbuild.yaml` を以下のようにすると、ビルドがどういう環境で実行されるのかがイメージできました。

```yaml
steps:
  - name: "bash"
    args: ["echo", "Hello, World!"]
  - name: "bash"
    args: ["pwd"]
  - name: "bash"
    args: ["ls", "-al"]
  - name: "bash"
    args: ["touch", "building.txt"]
  - name: "bash"
    args: ["ls", "-al"]
```

`pwd`コマンドでは`/workspace`と出力されました。

`touch`コマンドのあとの`ls`コマンドではtouchしたファイルが増えます。ジョブを再実行すると、touchしたファイルがない状態から始まります。

リポジトリに含まれているファイルのタイムスタンプは、ジョブを開始する時刻になっているので、ジョブ実行ごとに環境が作られているようです。