如何在GitLab CI中启动Python服务后执行后续测试任务
问题核心原因
- 原配置中
python3 server.py为前台阻塞运行,执行后会持续占用进程,无法推进到后续步骤 - GitLab CI 不同Job默认运行在完全独立的隔离环境中,build阶段启动的服务进程在test阶段完全无法访问,跨阶段无法共享运行态资源
可行解决方案
方案1:单Job内后台启动+就绪检测(通用且实现简单)
将依赖安装、服务启动、测试逻辑整合到同一个Job中,规避跨Job环境隔离问题,修改后的配置参考如下:
stages: - test py_service_test: image: python:3.7.9 stage: test before_script: - pip3 install -r requirements.txt script: # 后台启动Python服务,日志输出到文件方便后续排查 - python3 server.py > server.log 2>&1 & # 记录服务进程ID - SERVER_PID=$! # 服务就绪检测,需替换为你自己服务的监听端口或者启动成功日志关键字 - | for i in {1..10}; do # 示例:检测8000端口是否启动,也可以换成 grep "启动完成" server.log 来匹配日志 if ss -tulpn | grep -q ":8000"; then echo "服务启动成功,开始执行测试" break fi echo "等待服务启动,第$i次重试..." sleep 2 done # 执行单元测试 - python3 -m unittest discover tests after_script: # 可选:测试结束后终止后台服务 - kill $SERVER_PID artifacts: # 可选:测试失败时保留服务日志用于排查 paths: - server.log when: on_failure
注意点:后台启动进程时末尾加
&即可让进程转入后台运行,不会阻塞当前脚本;必须加就绪检测逻辑,避免服务未初始化完成就执行测试导致用例报错。
方案2:多Job拆分+镜像化服务(适合服务需要多场景复用的情况)
如果确实需要拆分阶段,可将Python服务打包为独立镜像,通过GitLab CI的services字段引入,实现服务和测试任务的网络互通:
stages: - build - test # build阶段打包服务镜像推送到GitLab自带镜像仓库 build_server_image: stage: build image: docker:latest services: - docker:dind variables: DOCKER_HOST: tcp://docker:2376 DOCKER_TLS_CERTDIR: "/certs" script: - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY - docker build -t $CI_REGISTRY_IMAGE/python-server:$CI_COMMIT_SHORT_SHA . - docker push $CI_REGISTRY_IMAGE/python-server:$CI_COMMIT_SHORT_SHA # test阶段直接引入服务镜像作为附属容器 run_test: stage: test image: python:3.7.9 services: - name: $CI_REGISTRY_IMAGE/python-server:$CI_COMMIT_SHORT_SHA alias: python-server before_script: - pip3 install -r requirements.txt script: # 测试代码中访问服务的地址为 python-server:[你的服务端口] - python3 -m unittest discover tests
内容的提问来源于stack exchange,提问作者Remo
相关产品推荐
相关产品推荐

