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

Jou*_*lss 1 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
Run Code Online (Sandbox Code Playgroud)

但我认为使用 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
Run Code Online (Sandbox Code Playgroud)

但作业 cacheE2eDeps 显示"WARNING: node_modules/: no matching files"错误。我怎样才能成功地做到这一点?Gitlab 文档并没有真正谈论从预先构建的图像中缓存......

用于构建镜像的 Dockerfile :

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

COPY . .
RUN yarn install
Run Code Online (Sandbox Code Playgroud)

Kon*_*tor 5

没有用于从预构建图像缓存数据的文档,因为它根本没有完成。依赖项已经在映像中可用,那么为什么首先要缓存它们呢?它只会导致不必要的数据重复。

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

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

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
Run Code Online (Sandbox Code Playgroud)

第一次运行上述作业时,它会从头开始安装依赖项,但下次它会从运行器缓存中获取它们。需要注意的是,除非运行此作业的所有运行器共享缓存,否则每次在新运行器上运行它时,它都会从头开始安装依赖项。

这是关于在 GitLab CI 中使用 yarn的文档

编辑:

详细说明使用缓存与工件 - 工件用于存储作业输出(例如,稍后手动下载)和将一个作业的结果从后续阶段传递给另一个作业,而缓存旨在通过以下方式加速作业执行保留作业需要从 Internet 下载的文件。有关详细信息,请参阅GitLab 文档

node_modules目录的内容显然属于第二类。