使用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
	
广告
将在 10 秒后关闭
bannerAds