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

如何在不同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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 11:05:04