GitLab Pipeline文件移动失效及Allure历史报告留存配置问题
问题根因
两条命令未达预期是GitLab CI运行机制和配置缺失共同导致的,核心问题有3个:
- 跨Job文件隔离:GitLab CI每个Job运行在独立的临时容器中,文件系统默认不共享。
docker_job生成的allure-report虽然配置了artifacts,但pagesJob没有声明依赖该artifacts,运行时根本拿不到测试阶段生成的报告文件。 - 目录无持久化:本地创建的
Docs文件夹如果没有提交到Git仓库、也没有配置跨Pipeline持久化策略,pagesJob启动时根本不存在这个目录,mv命令会直接触发No such file or directory错误。 - 历史留存逻辑缺失:现有配置没有做旧报告自动清理,也没有做报告版本隔离,就算文件能正常复制,每次运行也会直接覆盖旧报告,无法留存历史版本。
可行实现方案
通过GitLab CI Cache持久化历史报告,显式声明跨Job依赖,加上时间戳做报告版本隔离,配合find命令自动清理过期文件即可实现需求,具体配置调整逻辑如下:
- 给
pagesJob添加依赖声明,拉取测试阶段生成的Allure报告artifact - 配置Cache持久化
Docs目录,跨Pipeline存储历次报告 - 每次运行时先清理
Docs中超过留存期限的旧报告 - 新报告存入带时间戳+Pipeline ID的独立子目录,避免覆盖历史版本
- 补全目录自动创建逻辑,避免路径不存在报错
修正后的.gitlab-ci.yml配置
stages: - testing - deploy docker_job: stage: testing tags: - docker image: atools/chrome-headless:java11-node14-latest before_script: - npm ci - npx playwright install - npm install allure-commandline --save-dev script: - npx playwright test after_script: - npx allure generate allure-results -o allure-report rules: - when: always allow_failure: true artifacts: when: always paths: - ./allure-report expire_in: 1 day pages: stage: deploy # 依赖测试阶段的artifact,拉取allure-report文件夹 dependencies: - docker_job # 用cache持久化Docs目录,跨pipeline留存历史报告 cache: key: allure-history-reports paths: - Docs/ policy: pull-push # 启动时拉取旧cache,结束时上传新cache script: # 提前创建所需目录,-p参数保证目录已存在时不报错 - mkdir -p public Docs/reports # 清理留存时间超过2天的旧报告 - find Docs/reports -type d -mtime +2 -exec rm -rf {} \; # 生成当前次报告的独立存储路径,用时间戳+流水线ID命名避免重名覆盖 - CURRENT_REPORT_PATH=Docs/reports/$(date +%Y%m%d%H%M%S)-pipeline-$CI_PIPELINE_ID - mkdir -p $CURRENT_REPORT_PATH # 移动新生成的报告到独立目录 - mv ./allure-report/* $CURRENT_REPORT_PATH # 全量复制Docs下所有报告(历史+最新)到public目录 - cp -R ./Docs/* public # 可选:把最新报告设为Pages根目录默认访问页,打开域名直接看到最新报告 - cp -R $CURRENT_REPORT_PATH/* public/ artifacts: paths: - public rules: - when: always
配置说明
- 留存时长调整:如果需要修改报告留存时间,把find命令里的
+2改成对应天数即可,比如要存3天就改成+3 - Cache有效期:GitLab Cache默认留存时间跟随实例配置,脚本层已经做了过期清理,不需要额外配置Cache过期策略
- 历史报告访问:所有历史报告会存在
public/reports/路径下,访问你的GitLab Pages域名/reports/对应报告目录名即可查看历史版本,根路径默认打开最新一次的报告 - 排查技巧:如果后续还有文件操作问题,直接在script最开头加
ls -la命令打印当前目录结构,就能快速定位文件是否存在、路径是否正确
内容的提问来源于stack exchange,提问作者Vladeezy
相关产品推荐
相关产品推荐

