You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在GitHub Actions中配置多容器运行Go API测试的问题求助

GitHub Actions CI流程问题修复方案

核心问题点

  • 执行docker run启动应用时未添加-d参数,容器前台运行会永久阻塞后续测试步骤
  • 启动应用容器时未加入创建的network_app网络,导致应用无法访问同网络下的postgres服务
  • 缺少应用启动等待逻辑,应用未完全就绪就执行测试会引发接口调用失败
  • 手动管理自定义网络配置冗余,可简化网络配置降低出错概率

修正后的Workflow配置

name: build and test
on:
  workflow_dispatch:

jobs:
  test:
    runs-on: ubuntu-latest
    services:
      postgres:
        image: postgres
        env: 
          POSTGRES_USER: postgres
          POSTGRES_PASSWORD: 替换为你的实际数据库密码
          POSTGRES_DB: userdb
        ports: 
          - 5432:5432
        options: >-
          --health-cmd pg_isready
          --health-interval 10s
          --health-timeout 5s
          --health-retries 5
    steps:
      - uses: actions/checkout@v2
      - name: Setup Go environment
        uses: actions/setup-go@v2.1.3
        with:
          go-version: 1.16
      - name: Install migrate tool
        run: go install -tags 'postgres' github.com/golang-migrate/migrate/v4/cmd/migrate@latest
      - name: Execute database migration
        run: make migrate_db
      - name: Build application docker image
        run: docker build . -t app
      - name: Start application container
        # 使用host网络共享宿主机网络栈,无需额外配置即可访问映射到宿主机的postgres服务
        run: docker run -d --network=host app
      - name: Wait for application startup
        run: |
          # 等待应用接口就绪,最多等待30秒
          for i in {1..30}; do
            # 没有健康接口可以直接检测端口监听
            if nc -z localhost 8080; then
              echo "Application started successfully"
              break
            fi
            echo "Waiting for application to start, attempt $i/30"
            sleep 1
          done
      - name: Execute API tests
        run: go test -v ./tests/test_routes/

可选配置(保留自定义网络)

如果你需要保留原有的自定义网络逻辑,按以下修改即可:

  • 启动应用容器的命令改为docker run -d -p 8080:8080 --net network_app app
  • 修改应用内的数据库连接地址为postgres:5432(同网络下可直接通过服务名访问postgres)
  • 若出现postgres服务无法连接自定义网络的问题,可在连接网络的步骤前添加docker ps命令,确认postgres服务的实际容器名称后再执行连接操作

优化建议

  • 可以直接复用本地Makefile的start_server等命令执行CI流程,避免本地和CI配置不一致的问题
  • 测试完成后可添加容器清理步骤,释放runner资源

内容的提问来源于stack exchange,提问作者Groskilled

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 01:18:02