🍣

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

2022/05/17に公開

はじめに

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

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

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

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

  • MySQLのエラー
curl: (7) Failed to connect to 127.0.0.1 port 3307: Connection refused
  • protoc実行環境を自前で整備しようとしているjob
      - 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の環境構築を行えました。

      - 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 を実行しましょう。

      - 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について

- 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

テスト実行

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

- name: Run tests
        run: make test

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

  test:
    name: Honeycomb Test
    runs-on: ubuntu-latest

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

      - name: Set up
        run: |
          sudo apt-get update
          sudo apt-get install -y migrate

設定ファイル完全版

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
	

Discussion