はじめに
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"
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処理を実行します。
entにmigrate処理機能が現時点で未実装である点を踏まえて、golang-migrateの使用を促す旨がent公式ドキュメントにも明記されています。
テスト実行
上記の設定追加で、テスト実行環境の整備は完了となります。
最後にテストを実行するための設定を追記しましょう。
- 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