如何在GitHub Actions中保持服务器运行以确保测试任务正常执行?
解决GitHub Action中测试期间维持服务器运行的问题
你遇到的核心问题是每个GitHub Action的Job都运行在独立的虚拟机实例上:run-server Job执行完毕后,对应的虚拟机会被销毁,服务器自然就停了,所以run-tests Job启动时根本连不上服务器。
下面是两种可行的解决方案:
方案一:将服务器启动与测试放在同一个Job中
把服务器启动、等待就绪、执行测试的步骤都放在同一个Job里,这样所有步骤共享同一个虚拟机,服务器能一直运行到测试结束。
示例配置:
jobs: test-with-server: name: Run Server & Execute Tests runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 # 先安装项目依赖(根据你的Phoenix项目调整) - name: Install Dependencies run: mix deps.get # 后台启动Phoenix服务器,用nohup和重定向输出到日志文件 - name: Start Phoenix Server in Background run: nohup iex -S mix phx.server > server-output.log 2>&1 & # 等待服务器完全启动(必须加这一步,否则测试会连不上) - name: Wait for Server to Be Ready run: | # 这里假设你的服务器有健康检查接口,比如/health until curl -s http://localhost:4000/health; do echo "Waiting for Phoenix server to start..." sleep 2 done # 执行API测试 - name: Run API Tests id: run-newman uses: anthonyvscode/newman-action@v1 with: # 填写你的Newman配置,比如集合文件路径等 collection: ./path/to/your/collection.json
方案二:使用GitHub Action服务容器(Service Containers)
如果一定要拆分Job,可以把Phoenix服务器做成Docker镜像,作为服务容器在run-tests Job中启动,服务容器会在整个Job周期内保持运行。
前提:
需要先把你的Phoenix项目构建成Docker镜像(比如推送到Docker Hub或GitHub Packages)。
示例配置:
jobs: run-tests: name: Run Tests Against Server runs-on: ubuntu-latest # 定义服务容器 services: phoenix-server: # 替换成你的服务器镜像地址 image: your-username/phoenix-server:latest ports: - 4000:4000 # 配置健康检查,确保服务器就绪后再执行测试 options: >- --health-cmd "curl http://localhost:4000/health" --health-interval 10s --health-timeout 5s --health-retries 5 steps: - uses: actions/checkout@v2 - name: Run API Tests id: run-newman uses: anthonyvscode/newman-action@v1 with: # 测试地址要指向服务容器的名称(这里是phoenix-server),而不是localhost collection: ./path/to/your/collection.json environment: ./path/to/your/env.json
关键注意事项
- 不管用哪种方案,必须添加服务器就绪等待步骤:Phoenix启动需要时间,直接跑测试会出现连接失败的问题。
- 后台启动服务器时,建议重定向日志到文件,方便后续调试(比如服务器启动失败时可以查看日志)。
- 服务容器方案适合需要复用服务器镜像的场景,但需要额外维护Docker构建流程。
内容的提问来源于stack exchange,提问作者bezzoon
相关产品推荐
相关产品推荐

