Gitlab CI:如何从预构建映像中缓存node_modules?

时间:2020-08-19 10:04:48

标签: node-modules gitlab-ci cypress

情况是这样的: 我正在Gitlab CI(由vue-cli发布)中运行Cypress测试。为了加快执行速度,我构建了一个包含必要依赖项的Docker映像。 如何缓存预构建映像中的node_modules以在测试作业中使用它? 目前,我正在使用一个糟糕的(但可行的)解决方案:

testsE2e:
  image: path/to/prebuiltImg
  stage: tests
  script:
    - ln -s /node_modules/ /builds/path/to/prebuiltImg/node_modules
    - yarn test:e2e
    - yarn test:e2e:report

但是我认为使用Gitlab CI缓存必须有一种更简洁的方法。

我一直在测试:

cacheE2eDeps:
  image: path/to/prebuiltImg
  stage: dependencies
  cache:
    key: e2eDeps
    paths:
      - node_modules/
  script:
    - find / -name node_modules # check that node_modules files are there
    - echo "Caching e2e test dependencies"

testsE2e:
  image: path/to/prebuiltImg
  stage: tests
  cache:
    key: e2eDeps
  script:
    - yarn test:e2e
    - yarn test:e2e:report

但是作业cacheE2eDeps显示"WARNING: node_modules/: no matching files"错误。 我该如何成功完成? Gitlab文档并没有真正谈论从预构建映像进行缓存...

用于构建映像的Dockerfile:

FROM cypress/browsers:node13.8.0-chrome81-ff75

COPY . .
RUN yarn install

1 个答案:

答案 0 :(得分:2)

没有文档来缓存来自预构建图像的数据,因为它只是没有完成。依赖关系已在映像中提供,因此为什么要首先缓存它们?只会导致不必要的数据重复。

此外,您似乎还以为应该使用缓存在作业之间共享数据,但主要的用例是在同一作业的不同运行之间共享数据。作业之间的数据共享应该使用工件来完成。

在这种情况下,您可以使用缓存而不是预构建的图像,例如:

variables:
  CYPRESS_CACHE_FOLDER: "$CI_PROJECT_DIR/cache/Cypress"

testsE2e:
  image: cypress/browsers:node13.8.0-chrome81-ff75
  stage: tests
  cache:
    key: "e2eDeps"
    paths:
      - node_modules/
      - cache/Cypress/
  script:
    - yarn install
    - yarn test:e2e
    - yarn test:e2e:report

第一次运行以上作业,它将从头开始安装依赖关系,但是下次它将从运行器缓存中获取依赖关系。需要说明的是,除非所有运行此作业的运行程序共享缓存,否则每次您在新运行程序上运行它时,都会从头开始安装依赖项。

这里是documentation,关于在GitLab CI上使用纱线。