You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何将pytest测试报告上传至GitLab CI及Django应用CI流程优化咨询

问题1:GitLab CI无法获取SSH会话中生成的pytest测试报告

核心原因

你现在的问题根源很清楚:pytest是在Azure远程服务器上执行并生成report.xml的,但GitLab CI的runner只会从自己的本地工作目录(也就是/builds/my-company/eric/eric-portal/)查找artifacts文件。远程服务器上的文件不在runner的可见范围内,所以不管你写多少路径,GitLab都找不到。

解决方案:把远程的测试报告复制到runner本地

在SSH执行完pytest之后,通过scp命令将Azure服务器上的report.xml复制到runner的工作目录。修改你的gitlab-ci.yml如下:

script:
  # 远程执行pytest生成测试报告
  - ssh eric@111.222.333.44 "cd /home/eric/www/uat/eric-portal; /home/eric/.virtualenvs/eric-uat/bin/pytest"
  # 将远程服务器上的报告复制到runner当前工作目录
  - scp eric@111.222.333.44:/home/eric/www/uat/eric-portal/report.xml ./
artifacts:
  when: always
  paths:
    - report.xml
  reports:
    junit: report.xml

注意事项

确保GitLab CI runner已经配置了免密登录Azure服务器(你之前的SSH命令能正常运行,说明这个已经搞定了,但如果scp提示需要密码,检查下~/.ssh/id_rsa的权限或者Azure服务器的authorized_keys配置)。


问题2:基于SSH的CI流程是否高效?能否直接在GitLab中运行测试?

当前SSH流程的弊端

这种全依赖SSH的CI流程效率很低,主要问题包括:

  • 环境依赖不可控:测试完全依赖Azure服务器的状态(比如已安装的包、数据库数据),如果服务器上有残留数据或环境变更,很容易导致测试结果不稳定;
  • 无法利用CI特性:不能使用GitLab CI的缓存(比如缓存Python依赖)、并行测试、多环境测试等功能,测试速度慢,扩展性差;
  • 额外开销:每次SSH连接、远程执行都有网络和服务器负载的额外消耗;
  • 排查困难:测试日志和文件都在远程服务器,出问题时需要额外登录排查,增加了调试成本。

推荐方案:直接在GitLab CI runner中运行测试

完全可以脱离SSH,直接在GitLab的runner环境里执行测试,流程如下:

  1. 配置CI环境:在gitlab-ci.yml中定义Python环境,安装项目依赖;
  2. 设置测试环境变量:把Django需要的配置(比如数据库连接、SECRET_KEY等)存在GitLab的CI/CD变量中,避免硬编码敏感信息;
  3. 执行测试:直接在runner中运行pytest,生成的报告就在本地,artifacts可以直接捕获;
  4. 独立部署阶段:测试通过后,再用SSH或Azure官方工具(比如Azure CLI)部署到Azure实例。

示例简化配置:

stages:
  - test
  - deploy

test:
  stage: test
  image: python:3.10-slim
  before_script:
    # 安装Django依赖的系统库(比如PostgreSQL需要的libpq-dev)
    - apt-get update && apt-get install -y --no-install-recommends gcc libpq-dev
    # 安装Python项目依赖
    - pip install -r requirements.txt
    # 从GitLab CI/CD变量加载测试环境配置
    - export DATABASE_URL=$TEST_DATABASE_URL
    - export SECRET_KEY=$TEST_SECRET_KEY
  script:
    # 运行数据库迁移(如果测试需要)
    - python manage.py migrate
    # 执行pytest生成测试报告
    - pytest --junitxml=report.xml
  artifacts:
    when: always
    reports:
      junit: report.xml
  cache:
    # 缓存pip依赖,加快后续构建速度
    paths:
      - ~/.cache/pip

deploy:
  stage: deploy
  only:
    - main
  script:
    # 测试通过后,通过SSH部署到Azure实例
    - ssh eric@111.222.333.44 "cd /home/eric/www/uat/eric-portal; git pull; /home/eric/.virtualenvs/eric-uat/bin/python manage.py migrate; sudo systemctl restart eric-portal"

这种方案的优势

  • 环境隔离:每次测试都是干净的runner环境,避免远程服务器的残留数据干扰测试结果;
  • 速度更快:利用缓存减少依赖安装时间,支持并行拆分测试任务,大幅缩短测试周期;
  • 可控性强:所有测试日志、报告都直接在GitLab中查看,出问题时更容易定位;
  • 扩展性好:后续可以轻松添加多版本Python测试、静态代码检查、安全扫描等阶段。

内容的提问来源于stack exchange,提问作者Eric O.

火山引擎 最新活动