Github ActionsでGolang & gRPCのテストを実行する

# はじめに
golangとgRPCを用いたapiの自動テストを実行するための設定手順です。

# protoc のセットアップについて

CIコンテナ内で　`protoc` コマンドを利用できるようにするためのセットアップをおこなった際に、少しハマりどころがあったので説明をしておきます。

以下の様に自前でprotocの環境構築を行うと、protocコマンド実行環境整備完了後に、なぜかMySQLの`connection refused`エラーが発生した。

* MySQLのエラー

```sh
curl: (7) Failed to connect to 127.0.0.1 port 3307: Connection refused
```

* protoc実行環境を自前で整備しようとしているjob

```yml
      - name: Set up protoc
        run: |
          sudo apt-get update && sudo apt-get upgrade -y
          sudo apt-get install -y curl gnupg2 vim zip unzip
            PB_REL="https://github.com/protocolbuffers/protobuf/releases"
          curl -LO $PB_REL/download/v3.15.8/protoc-3.15.8-linux-x86_64.zip
          unzip protoc-3.15.8-linux-x86_64.zip -d $HOME/.local
          export PATH="$PATH:$HOME/.local/bin"
```

## 解決策

以下の様な設定を追加して、公式の設定用パッケージを使ってあげれば何の問題もなくprotocの環境構築を行えました。

```yml
      - name: Install Protoc
        uses: arduino/setup-protoc@v1
        with:
          version: "3.19.4"
```

https://github.com/marketplace/actions/setup-protoc

protocコマンドのversionもきちんと指定して、ローカル環境及びproduction環境で使用しているversionと同じものをテスト環境構築時にinstallする様にしましょう。
protocコマンドのversionが少し違っているだけで自動生成されるソースコードが他バージョンと比較して違ったものになる可能性があります。

# gRPCのsource generate
protocコマンドを使用してgRPCで通信を行うためのソースコード作成処理を実行する必要があります。
`go install` で必要なパッケージをinstallした上で `make generate` を実行しましょう。

```yml
      - name: Make generate
        run: |
          go install google.golang.org/protobuf/cmd/protoc-gen-go@v1.28
          go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@v1.2
          export PATH="$PATH:$(go env GOPATH)/bin"
          mkdir genproto
          make generate
```

# migrationについて

```yml
- name: Test database setup
        run: migrate -path ./migrations -database '{{ env.DATABASE_URL }}' up
        env:
          DATABASE_URL: mysql://root:pass@tcp(localhost:3307)/test
```
テスト実行時にはentスキーマから生成されたマイグレーションファイルをテスト用DBに適用してあげる必要があるので、上記の設定を追加します。
現状、entにはmigrationをDBに対して適用するための機能が実装されていないのでgoのパッケージとして公開されている `golang-migrate`　を使用してmigrate処理を実行します。

https://github.com/golang-migrate/migrate

entにmigrate処理機能が現時点で未実装である点を踏まえて、golang-migrateの使用を促す旨がent公式ドキュメントにも明記されています。

https://entgo.io/docs/versioned-migrations#apply-migrations

# テスト実行
上記の設定追加で、テスト実行環境の整備は完了となります。
最後にテストを実行するための設定を追記しましょう。

```yml
- name: Run tests
        run: make test
```

# ubuntu-latestイメージを使用してapt-getコマンドを実行する際の注意点

```yml
  test:
    name: Honeycomb Test
    runs-on: ubuntu-latest
```
上記の様に、CI実行環境のベースとなるimageとして `ubuntu-latest` を選択した場合、`apt-get`コマンドを使用してのパッケージinstall時に `sudo`を付与した上でコマンドを実行する必要があります。

```yml
      - name: Set up
        run: |
          sudo apt-get update
          sudo apt-get install -y migrate
```
# 設定ファイル完全版

```yml
name: Honeycomb Test

on:
  push:
    paths:
      - "src/backend-go/**"

defaults:
  run:
    shell: bash
    working-directory: src/backend-go

jobs:
  test:
    name: Honeycomb Test
    runs-on: ubuntu-latest
    services:
      mysql:
        image: mysql:5.7
        env:
          MYSQL_ROOT_PASSWORD: pass
          MYSQL_DATABASE: test
        ports:
          - 3307:3306
        options: >-
          --health-cmd "mysqladmin ping"
          --health-interval 10s
          --health-timeout 5s
          --health-retries 5

    steps:
      - uses: actions/checkout@v3

      - name: Set up Go
        uses: actions/setup-go@v3
        with:
          go-version: "1.18"

      - name: Install dependences
        run: go mod tidy

      - name: Install Protoc
        uses: arduino/setup-protoc@v1
        with:
          version: "3.19.4"

      - name: Make generate
        run: |
          go install google.golang.org/protobuf/cmd/protoc-gen-go@v1.28
          go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@v1.2
          export PATH="$PATH:$(go env GOPATH)/bin"
          mkdir genproto
          make generate

      - name: Install migrate package
        run: |
          curl -L https://packagecloud.io/golang-migrate/migrate/gpgkey | sudo apt-key add -
          echo "deb https://packagecloud.io/golang-migrate/migrate/ubuntu/ $(lsb_release -sc) main" | sudo tee /etc/apt/sources.list.d/migrate.list
          sudo apt-get update
          sudo apt-get install -y migrate

      - name: Test database setup
        run: |
          mysql -h 127.0.0.1 --port 3307 -u root -D test -ppass < init.sql
          migrate -path ./migrations -database $DATABASE_URL up
        env:
          DATABASE_URL: mysql://root:pass@tcp(localhost:3307)/test

      - name: Run tests
        run: make test
	
```