在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
相关产品推荐
相关产品推荐

