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是否真的在预期路径生成了截图文件,排除测试用例本身执行失败没生成资源的问题。 - 追加权限检查命令排除权限问题:
确认当前运行Job的用户对测试输出目录有读写权限,绝大多数自定义镜像默认用root运行,这一步基本不会有问题。whoami ls -ld /var/tests/screenshots - 手动把
/var/tests/screenshots下的文件复制到$CI_PROJECT_DIR,如果此时artifacts能正常拿到文件,即可100%确认是路径匹配问题。
解决方案
三选一即可,优先选改动最小的:
- 方案1(兼容性最好,无版本要求):测试执行完成后,把输出文件复制到Runner默认的工作目录,修改test的script配置即可:
不需要调整镜像、不需要改GitLab配置,适配所有版本的GitLab CI。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/ - 方案2(配置最简洁,有版本要求):GitLab CI 14.1及以上版本支持artifacts收集绝对路径,直接修改artifacts的paths配置即可:
如果你的GitLab版本低于14.1,该配置会报路径非法错误,换回方案1即可。artifacts: when: always paths: - /var/tests/screenshots/ - /var/tests/tests_output/ expire_in: 1 hour - 方案3(逻辑最顺,需要调整目录权限):直接把CI的代码克隆路径设置为镜像内的工作目录,在test job中加全局变量配置:
注意需要提前在构建镜像的Dockerfile里给variables: GIT_CLONE_PATH: /var/tests/var/tests目录开放Runner运行用户的写入权限,否则会在代码克隆阶段报权限拒绝错误,适合长期维护、不想每次加复制命令的场景。
内容的提问来源于stack exchange,提问作者GELK
相关产品推荐
相关产品推荐

