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

GitLab CI artifacts配置失效 无法获取Nightwatch测试生成截图

问题根因

空artifacts目录的核心问题是路径匹配逻辑理解偏差,和容器写入权限基本无关:

  • GitLab CI Docker执行器运行Job时,不会直接使用镜像内预设的WORKDIR作为工作根目录,默认会先将项目仓库克隆到内置变量$CI_PROJECT_DIR指向的路径(通常格式为/builds/<组名>/<项目名>),所有相对路径配置——包括artifacts的收集路径、script中未写绝对路径的命令——默认都以这个目录为基准。
  • 你虽然在脚本中通过cd /var/tests/切到了镜像内的测试目录运行Nightwatch,生成的截图、日志实际存放在/var/tests/screenshots、/var/tests/tests_output绝对路径下,但artifacts配置的screenshots/、tests_output/是相对路径,GitLab Runner只会去$CI_PROJECT_DIR下查找对应文件,找不到目标文件时就只会打包空的同名目录,最终你下载的压缩包就只有空文件夹。
排查步骤

按顺序执行即可快速定位:

  • 在test阶段的script最开头加入调试命令,跑一次流水线看日志输出:
    pwd
    ls -la /var/tests/screenshots
    ls -la $CI_PROJECT_DIR
    
    第一行输出确认当前默认工作目录是否为$CI_PROJECT_DIR,第二行确认Nightwatch是否真的在预期路径生成了截图文件,排除测试用例本身执行失败没生成资源的问题。
  • 追加权限检查命令排除权限问题:
    whoami
    ls -ld /var/tests/screenshots
    
    确认当前运行Job的用户对测试输出目录有读写权限,绝大多数自定义镜像默认用root运行,这一步基本不会有问题。
  • 手动把/var/tests/screenshots下的文件复制到$CI_PROJECT_DIR,如果此时artifacts能正常拿到文件,即可100%确认是路径匹配问题。
解决方案

三选一即可,优先选改动最小的:

  • 方案1(兼容性最好,无版本要求):测试执行完成后,把输出文件复制到Runner默认的工作目录,修改test的script配置即可:
    script:
      - cd /var/tests/ && nightwatch --env int --test tests/my-test.js
      - cp -r /var/tests/screenshots $CI_PROJECT_DIR/
      - cp -r /var/tests/tests_output $CI_PROJECT_DIR/
    
    不需要调整镜像、不需要改GitLab配置,适配所有版本的GitLab CI。
  • 方案2(配置最简洁,有版本要求):GitLab CI 14.1及以上版本支持artifacts收集绝对路径,直接修改artifacts的paths配置即可:
    artifacts:
      when: always
      paths:
        - /var/tests/screenshots/
        - /var/tests/tests_output/
      expire_in: 1 hour
    
    如果你的GitLab版本低于14.1,该配置会报路径非法错误,换回方案1即可。
  • 方案3(逻辑最顺,需要调整目录权限):直接把CI的代码克隆路径设置为镜像内的工作目录,在test job中加全局变量配置:
    variables:
      GIT_CLONE_PATH: /var/tests
    
    注意需要提前在构建镜像的Dockerfile里给/var/tests目录开放Runner运行用户的写入权限,否则会在代码克隆阶段报权限拒绝错误,适合长期维护、不想每次加复制命令的场景。

内容的提问来源于stack exchange,提问作者GELK

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 00:27:19