如何在不同GitHub Actions Runner部署容器并运行集成测试?
核心结论:你原方案完全不可行
原因很简单:
- GitHub Actions的每个Job都运行在独立的Runner实例中,Job执行完毕后,Runner会自动清理所有环境(包括Docker容器、镜像、临时文件等),部署Job结束时容器就被销毁了。
- 两个Runner属于完全隔离的网络环境,彼此之间没有直接连通性,测试Runner根本无法访问部署Runner里的容器IP。
你之前的测试无限运行无输出,本质是测试脚本一直在尝试连接一个已经不存在的服务,自然得不到任何响应。
可行替代方案
根据你的需求(部署服务+独立环境测试),推荐以下两种方案:
方案1:部署与测试同Job(简单直接)
如果测试不需要绝对“干净”的Runner环境,或者可以在同一Runner内完成环境隔离,直接把部署和测试步骤放在同一个Job中:
jobs: deploy-and-test: runs-on: ubuntu-latest steps: - name: 拉取代码 uses: actions/checkout@v4 - name: 构建Docker镜像 run: docker build -t my-service . - name: 启动服务容器 run: docker run -d -p 8080:8080 --name my-service-container my-service - name: 等待服务就绪 run: | until curl -s http://localhost:8080/health; do echo "等待服务启动..." sleep 2 done - name: 配置Python 3.8 uses: actions/setup-python@v5 with: python-version: '3.8' - name: 安装测试依赖 run: pip install -r requirements-test.txt - name: 运行集成测试 run: pytest tests/integration/ - name: 清理容器 if: always() run: docker stop my-service-container && docker rm my-service-container
方案2:部署到外部测试环境(严格隔离)
如果必须用完全独立的Runner执行测试,正确的做法是把服务部署到外部测试环境(比如云容器服务、自托管测试服务器),再让测试Job连接这个外部环境:
jobs: deploy-to-test: runs-on: ubuntu-latest outputs: service-url: ${{ steps.deploy.outputs.service-url }} steps: - name: 拉取代码 uses: actions/checkout@v4 - name: 构建并推送镜像 run: | docker build -t my-registry/my-service:${{ github.sha }} . docker login -u ${{ secrets.REGISTRY_USER }} -p ${{ secrets.REGISTRY_PWD }} my-registry docker push my-registry/my-service:${{ github.sha }} - name: 部署到测试环境 id: deploy run: | # 替换为你的实际部署命令(如kubectl、terraform或自定义脚本) SERVICE_URL=$(./deploy-to-test.sh ${{ github.sha }}) echo "service-url=$SERVICE_URL" >> $GITHUB_OUTPUT - name: 等待服务就绪 run: | until curl -s ${{ steps.deploy.outputs.service-url }}/health; do echo "等待服务启动..." sleep 2 done run-integration-tests: needs: deploy-to-test runs-on: ubuntu-latest steps: - name: 拉取代码 uses: actions/checkout@v4 - name: 配置Python 3.8 uses: actions/setup-python@v5 with: python-version: '3.8' - name: 安装测试依赖 run: pip install -r requirements-test.txt - name: 运行集成测试 env: SERVICE_URL: ${{ needs.deploy-to-test.outputs.service-url }} run: pytest tests/integration/
内容的提问来源于stack exchange,提问作者aquadap
相关产品推荐
相关产品推荐

