GitLab Runner在Windows部署阶段前删除dist工件问题咨询
这个问题其实是GitLab Runner Shell executor的默认行为导致的,我来给你拆解清楚:
核心原因
当使用Shell executor时,Runner在每次执行job前会执行git clean -ffdx命令,目的是确保项目工作区处于干净的初始状态——也就是和远程仓库的最新提交完全一致。而dist/、node_modules/这类目录通常会被添加到.gitignore里,属于Git的未跟踪文件,所以会被git clean命令直接删除。
解决办法
根据你的需求不同,有几种针对性的方案:
1. 关闭自动清理(不推荐,除非特殊场景)
如果你希望保留工作区的未跟踪文件,可以修改GitLab Runner的配置文件config.toml,找到对应Runner的配置段,把clean_builds = true改成clean_builds = false,然后重启Runner服务。
⚠️ 注意:这种方式可能导致旧的构建残留影响后续job,比如不同分支的依赖冲突,所以一般不建议全局开启,只适合特定场景。
2. 用Artifacts+Dependencies在Job间传递工件
如果你的dist/是构建产物,需要在后续的部署job中使用,正确的做法是在构建job中把它标记为artifacts,然后在部署job中通过dependencies来拉取:
示例.gitlab-ci.yml配置:
stages: - build - deploy build_job: stage: build script: - npm install - npm run build artifacts: paths: - dist/ # 保存构建产物 - node_modules/ # 如果部署需要依赖也可以保存 expire_in: 1 week # 设置过期时间,避免占用存储空间 deploy_job: stage: deploy script: - # 这里写你的部署命令,比如复制dist到服务器 dependencies: - build_job # 拉取build_job的artifacts到当前工作区
这样Runner会自动把build job的artifacts下载到deploy job的工作目录,不会被清理。
3. 用Cache缓存依赖(加速构建)
如果只是想避免每次job都重新安装node_modules/,可以用GitLab的Cache功能,它会把依赖目录缓存起来,下次job直接复用:
示例配置:
cache: paths: - node_modules/ # 缓存node_modules key: files: - package-lock.json # 用lock文件作为缓存key,依赖变更时才更新缓存 build_job: script: - npm install # 如果缓存存在,会跳过重新安装 - npm run build
Cache和Artifacts的区别是:Cache用于加速重复构建,不会在job间主动传递;Artifacts用于在job间传递构建产物,适合部署场景。
内容的提问来源于stack exchange,提问作者Dživo Jelić




