gitlab ci中默认使用node_modules缓存,必要时install更新依赖包

2022年06月26日Web前端0

公司中使用的是gitlab做持续集成的,在处理依赖包node_modules时有点小问题,不知是每次安装还是缓存比较节省打包时间。

问题

原本是利用cache配置缓存了npm_cache,然后在用npm ci加快install 以来的速度。实际效果也比较好,安装大概在20-30s之前,可以接受。但是不知道为何,项目久了后,ci的耗时越来越大,达到了不能容忍的一分半的样子。

既然如此,那就可以直接缓存node_modules路径,毕竟这比直接安装更快,但是假如缓存了node_modules后,某天又加入了新的第三方以来。此时打包就会出错了,我们还得手动改ci,让此次先ci,再缓存,实在不是很方便。

于是乎,一种默认使用node_modules缓存,包依赖更新时,重新ciinstall的方案就等待实现了。

changes

我们可以通过rules:changes检查对特定文件的更改来指定何时将任务添加到pipeline中。

比如:

check:
  stage: npm
  script:
    - npm ci
  only:
    changes:
      - package.json
      - package-lock.json
    refs:
      - test
      - release

#打包构建
build:
  stage: build
  script:
    - npm ci
  only:
    - test
    - release

state只有在package.json或者package-lock.json任意一个文件改动时,才会触发,并添加到pipeline中,然后再进行第二步build过程。当然没改依赖,改了这两文件中的其他内容也是会触发的。

cache:
  paths:
    - node_modules/

再配上cache这样就可以缓存了。

其他

由于build过程中,我们会用到其他第三方插件等会生成缓存在node_modules中,这会导致每次缓存的东西越来越多,你可以在build阶段后移除掉.cache文件。比如:

build:
  # ......等等  
  after_script:
    - rm -rf node_modules/.cache

当然,有些会加速打包的缓存还是别删了吧,毕竟最终目标都是加速pipeline的过程。