使用Github Actions来运行Golang和gRPC的测试
首先
以下是使用golang和gRPC进行API自动测试的配置步骤。
关于 protoc 的安装设置
在设置CI容器以便能够使用protoc命令时,我遇到了一些困难,现在进行解释。
如果按照以下方式自行设置protoc环境,则在protoc命令执行环境准备完毕后,出现了意外的MySQL连接被拒绝错误。
- 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命令版本,并正确指定protoc命令的版本。即使protoc命令版本稍有差异,生成的源代码可能与其他版本不同。
使用gRPC生成源代码。
你需要使用 protoc 命令来创建用于 gRPC 通信的源代码生成过程。
首先运行 go 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
关于移民
- name: Test database setup
run: migrate -path ./migrations -database '{{ env.DATABASE_URL }}' up
env:
DATABASE_URL: mysql://root:pass@tcp(localhost:3307)/test
为了在测试执行时,需要将从ent模式生成的迁移文件应用到测试用数据库中,因此需要添加上述设置。
目前,ent尚未实现将迁移应用于数据库的功能,因此我们将使用golang-migrate这个go软件包来执行迁移处理。
考虑到目前尚未实施migrate功能的问题,请参考ent官方文档中明确提到鼓励使用golang-migrate。
考试进行
通过添加上述设置,测试执行环境将被完善。最后,我们需要追加一些设置来执行测试。
- name: Run tests
run: make test
使用ubuntu-latest镜像执行apt-get命令时需要注意的事项
test:
name: Honeycomb Test
runs-on: ubuntu-latest
如果选择将ubuntu-latest作为CI执行环境的基础image,那么在使用apt-get命令进行软件包安装时,需要在命令前加上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