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

GitLab Runner在Windows部署阶段前删除dist工件问题咨询

GitLab Runner自动删除dist/、node_modules/的原因及解决办法

这个问题其实是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ć

火山引擎 最新活动