サーバーサイドなんもわからんアナタに向けたハンズオン　Unity × gRPC × Go × Firebase × Docker 〜第三章、CI/CDパイプライン構築〜

# 最初に

本記事の内容は、サーバーサイドにほとんど触れてこなかったUnityエンジニアに向けて、最近の主流構成を学びながら少しずつサーバーの知識を身につけられるハンズオン形式で進めます。この記事が、サーバーサイドに対する理解を深める一助になれば幸いです。

本記事の対象者は以下の通りです。

- A Tour of Goを一通り終わらせたが次に何をするべきかわからない初心者サーバーエンジニア
- gRPCについて学びたいが、Unityとの関連性も知りたい初学者
- なんとなくGoやgRPCについては理解できるけど、具体的な仕組みについて知りたいUnityエンジニアの方

また、今回のハンズオン記事は全７章が存在します。

こちらから他の章も見ていただけると嬉しいです！
[「第一章、環境構築」](https://qiita.com/4_mio_11/items/08e972ae361c55b317f0)
[「第二章、Cloud Runへのデプロイ」](https://qiita.com/4_mio_11/items/2027978feb5f131fdd48)
[「第三章、CI/CDパイプライン構築」](https://qiita.com/4_mio_11/items/1148aa1603f4acb32088)
[「第四章、Firebaseプロジェクトの作成とFirebaseSDK導入」](https://qiita.com/4_mio_11/items/6a9b61fe2f1db2b5c38a)
[「第五章、FirebaseSDKを用いたアカウント作成とログイン実装」](https://qiita.com/4_mio_11/items/aabefeac56e700afc6e4)


### **今回の環境**

- OS : MacOS
- IDE : GoLand
- Gitクライアント : Fork

## 前提

以下の記事を終えているか、チャットアプリケーションを作るにあたって、必要な設定をGCP上で行う準備ができていることを前提としています。

[サーバーサイドなんもわからんアナタに向けたハンズオン　Unity × gRPC × Go × Firebase × Docker 〜第二章、Cloud Runへのデプロイ〜](https://qiita.com/4_mio_11/private/2027978feb5f131fdd48)

また、記事の内容を自由に学習できるよう、GitHub上に公開リポジトリを作成しました。各ステップに対応したバージョンをReleasesとして登録しているので、興味のあるステップから学習を始められます。

https://github.com/rossam/grpc-chat-app-sample/releases

上記リポジトリ内容を使用して特定のステップから始める場合はリポジトリをForkするか、手元にDownloadなどをしてから進めるようお願いします。

<br>

# 1. CI/CDのためのCloud Build設定

:::note
タグv0.6に対応しています。
:::

Cloud Buildを使用して自動化されたCI/CDパイプラインを構築してみましょう。

**Cloud Build**は、**Google Cloud上でビルド、テスト、デプロイのプロセスを自動化できる便利なサービス**です。

この自動化の順番を指定するには、`cloudbuild.yaml` ファイルを用意してあげる必要があります。このファイルに定義されている内容に基づいて、Cloud Buildが順番に作業を進めてくれます。

以下のように、プロジェクトのフォルダ下に`cloudbuild.yaml` ファイルを用意しましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36899/77f6c8f8-7ce9-f032-088f-88a846b66789.png)


内容は以下の通りとなります。Gitへの`Push`は、この時点ではまだ行いません。

```docker
steps:
# Dockerイメージをビルドするステップ
- name: 'gcr.io/cloud-builders/docker'
  args: [
    'build',
    '-t',
    'us-central1-docker.pkg.dev/$PROJECT_ID/grpc-chat-server/grpc-chat-server:${SHORT_SHA}',
    '.'
  ]

# ビルドしたイメージをArtifact Registryにプッシュするステップ
- name: 'gcr.io/cloud-builders/docker'
  args: [
    'push',
    'us-central1-docker.pkg.dev/$PROJECT_ID/grpc-chat-server/grpc-chat-server:${SHORT_SHA}'
  ]

# Cloud Runにデプロイするステップ
- name: 'gcr.io/cloud-builders/gcloud'
  args: [
    'run',
    'deploy',
    'grpc-chat-server',
    '--image',
    'us-central1-docker.pkg.dev/$PROJECT_ID/grpc-chat-server/grpc-chat-server:${SHORT_SHA}',
    '--platform',
    'managed',
    '--region',
    'us-central1',
    '--allow-unauthenticated',
    '--use-http2'
  ]

# logsBucketを指定してログを保存する
logsBucket: 'gs://grpc-chat-app-logs'
```

ステップのうち、上3つは既に何をしているかわかる状態かと思います。

では、最後のステップである「logsBucketを指定してログを保存する」とは何でしょう？

CI/CDパイプラインを構築するにあたって、ビルドのログを保存できる場所は用意しておくことを推奨します。ビルドログを残しておくと、後で問題があったときに、どこにエラーがあったかをログから調べることができます。

そのログを保存するために、Google Cloud Storageを使用してみます。

<br>

# 2. Google Cloud Storageの設定

アプリケーションのログを安全に保存するため、**Google Cloud Storage**に専用のバケットを作成します。

**バケット**とは、**Google Cloud Storage内でデータを保存するためのコンテナのようなもの**です。ファイルやデータオブジェクトを組織的に管理でき、アクセス制御をユーザー側で設定することができます。

たとえば、アプリケーションのログや画像、バックアップファイルなどを保存したいときに、バケットを作成してその中にデータを格納できます。バケットごとに自身で名前を付けて管理でき、アクセス権限や保存場所（リージョン）なども細かく設定することが可能です。

それでは早速バケットを作ってみましょう。

まず、Google Cloudコンソール画面上の検索窓に「Cloud Storage」と入れ、検索結果をクリックして、Cloud Storage管理画面へ移動してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36899/4de2cc1d-e3a1-8b92-18f5-c3a5acaf3aac.png)
「作成」をクリックしてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36899/b2e4cdba-77ed-ad7a-b332-f9f3544a71ce.png)

以下のように設定します。

- **バケット名**：
機密情報を含まない名前にしてください。今回は「grpc-chat-app-logs」という名前をつけます。
- ロケーションタイプ：
Multi-region（複数のリージョンにわたる高可用性）を選択しています。これは、アプリケーションが世界中のユーザーにアクセスされる場合、有効です。

残りはデフォルトのままにし、「続行」をクリックします。

もし「公開アクセスの防止」というダイアログが表示された場合、「このバケットに対する公開アクセス禁止を適用する」のチェックを入れたまま「確認」をクリックで問題ありません。これにより、バケット内のビルドログが第三者に公開されるリスクを防ぐことができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36899/40c8c7f7-4244-e912-1fdb-9c9cd418c814.png)

これでStorageの準備は完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36899/0b89b05f-280c-56aa-f962-19d0388fa1dc.png)

<br>

# 3. Cloud Buildの設定

続いてCloud Buildの設定をしていきましょう。

Google Cloudコンソール画面上の検索窓に「Cloud Build」と入れ、検索結果をクリックして、Cloud Build管理画面へ移動してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36899/b6f02828-d706-49f7-7773-c25e43c1a0c7.png)

「ビルドトリガーを設定」をクリックして、ビルドトリガーを作成していきましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36899/590d288a-c843-e861-41f4-faedd7945e63.png)

以下のように設定します。
- **名前**：
トリガーの名前を設定します。ここでは例として「grpc-chat-app」とします。
- **リージョン**：
使用するリージョンを選択します。ここではコストパフォーマンスと可用性のバランスが取れた「us-central1（アイオワ）」を選びましょう。もしも全世界へアプリをリリースする場合はグローバルリージョンを選び、後ほど説明するリポジトリの設定を「第１世代」に設定する形になると思います。
- **イベント**：
トリガーを呼び出すリポジトリイベントを選択します。今回は`main`ブランチにpushしたタイミングでトリガーしたいので、「ブランチにpushする」を選択します。

次にビルドするためのソースコードリポジトリを設定していきます。画像に示されているように、GitHub などのソースコード管理プロバイダからリポジトリを選択する必要があります。

:::note
**リポジトリの世代って？**

リポジトリの生成には「第1世代」と「第2世代」があり、ここでは「第2世代」を選択します。第2世代は最新の機能を提供し、より良いセキュリティとパフォーマンスを備えていますが、もし先ほどのリージョン設定でグローバルリージョンを選択していた場合は第2世代は使えません。
:::

<br>

それではGitHubリポジトリを指定するために、リポジトリ設定の箇所をクリックしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36899/35f60228-a639-92b0-3dbc-9bdf799c347b.png)


まだリポジトリをリンクするための設定を行っていないため、何も表示されません。

「リポジトリをリンク」をクリックして手動でリンクを設定していきましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36899/75028e59-d1b5-d2d4-365c-6e17f7987754.png)


リポジトリをホストしているサービスとまずは接続していく必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36899/3cdc852d-6c3d-a23d-8a3b-1ea47a833787.png)


サービスとの接続もまだ行っていないため、こちらでも何も表示されません。

「ホスト接続を作成」をクリックしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36899/1c41b596-5635-60be-4648-f4fabc2a203e.png)

<br>

## ホスト接続の作成

GitHubが選択されていることを確認して以下の設定を行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36899/89ec7b08-9c34-2c36-0df5-a41e1c9b5793.png)


- **リージョン**：今回は `us-central1`（アイオワ）を選択します。
- **接続名の設定**：
今回は `github-connection` と入力します。接続名は、複数の接続を管理する際に便利なよう、わかりやすい名前を付けておくと良いでしょう。

設定したら画面下部にある「接続」ボタンをクリックしてください。

接続するための確認を求める画面が表示された場合は、そのまま画面の指示に従って継続してください。スクリーンショットは割愛します。

接続がうまくいけば、以下のように別画面でリポジトリ管理画面を開いた際、作成したホスト接続設定が確認できるようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36899/4eea1b2f-db36-f7ac-ae9c-2805ba0afc63.png)

<br>

## リポジトリリンクの作成

先ほどのリポジトリをリンクするための設定画面に戻りましょう。

ホスト接続設定を用意したので、リポジトリ設定項目に、ご自身のリポジトリが設定できるようになっているはずです。

今回のプロジェクト用リポジトリをここに設定して「リンク」をクリックしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36899/96d3d244-0979-55bb-9dfb-d7a00bd860b1.png)


もし見当たらない場合は「更新」をクリックして再確認してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36899/d4b95701-9dbd-1662-6b7c-4087f7482e4e.png)


ようやく、トリガー側の設定画面に戻ることができました。

リポジトリの項目には先ほど作成したリポジトリリンクの設定をセットし、ブランチは任意のものを選択してください。今回はmainブランチを指定しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36899/8afbc07b-fbd6-0ade-e8bb-f7de310473b6.png)

続けて、他の設定項目も見ていきましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36899/d3b4ee8d-13b4-b40a-c069-3656ce2dbc30.png)

- **形式**：
今回は「Cloud Build 構成ファイル (yaml または json)」を選択します。
- **ロケーション**：
デフォルトのままで問題ありません。「インライン」はビルド構成ファイルの内容を直接 Cloud Build の設定画面に記述する方法です。簡単なビルドプロセスを素早く設定したい場合や、試験的に設定を作成する際に便利ですが、運用を前提としたプロジェクトの場合は「リポジトリ」に設定することをおすすめします。
- **Cloud Build 構成ファイルの場所**：
リポジトリ内にある Cloud Build 構成ファイルのパスを指定します。たとえば、`/cloudbuild.yaml` と記載することで、プロジェクトのルートリポジトリ直下にあるファイルがビルドプロセスとして使用されます。

最後にサービスアカウントが今回のプロジェクト用のものになっているか確認してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36899/583ddcaa-8c12-5e47-46af-76ff2fb3c343.png)


もしも異なっている場合は「サービスアカウント」をクリックし、今回のプロジェクト用のものを選択してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36899/d9f4e268-792d-0eed-6b95-8733f0fa9d5f.png)


ここまでで、ダッシュボード上で必要な設定は一通り完了しました。
<br>

# 4. 自動ビルドの確認

最初の方で作成した`cloudbuild.yaml` ファイルを、トリガー設定画面で指定したブランチにPushしてください。

Cloud Build管理画面を確認するとPushがトリガーとなり、自動でビルドが走ってることがわかります。しばらく待って、ビルドが成功していたら完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36899/168160cf-89bd-fa59-3cb2-7761d363c3f6.png)

# まとめ
今回の第三章では、CI/CDパイプラインの構築にフォーカスし、Cloud Buildを活用してみました。これにより、コードの変更が即座にデプロイされる効率的な開発フローを体験できます。

今回のハンズオンでは以下のことを学びました。

- Cloud Buildの基礎理解と構成ファイルの作成
- Google Cloud Storageの活用
- Cloud Buildトリガーの設定
- 自動化の実践

第四章では、いよいよUnity側の通信の仕組みを整えていきます。ハンズオンも残り半分というところです。引き続き無理しない程度に頑張りましょう！

もしも記事の中で進められない箇所があったら、Xなどでご連絡ください。