如何通过持续集成在 gitlab 中的作业和阶段之间存储节点模块

muf*_*fin 6 node.js node-modules gitlab gitlab-ci

我是 GitLab CI 的新手,我一直在尝试不同的方法来node_modules在我的整个管道中使用该目录。从我在官方文档中读到的内容来看,缓存和工件似乎是在作业之间传递文件的有效方法:

cache 用于指定应在作业之间缓存的文件和目录列表。您只能使用项目工作区中的路径。

但是,我对缓存方法的问题是node_modules默认情况下会在管道之间持久化:

  • 缓存可以全局设置,也可以按作业设置。
  • 从 GitLab 9.0 开始,默认情况下启用缓存并在管道和作业之间共享。

我不想坚持node_modules管道之间。我真正想要的是在我的设置阶段使用 npm 触发全新安装,然后允许管道中的所有其他作业使用这些模块。因此,我开始使用工件而不是缓存,其描述类似:

artifacts 用于指定成功后应附加到作业的文件和目录列表。[...]

作业成功完成后,工件将发送到 GitLab,并可在 GitLab UI 中下载。依赖特性应该与工件结合使用,并允许您定义工件以在不同作业之间传递。

在我的情况下,工件依赖方法似乎可用。但是,缓存和工件都非常低效且缓慢。在node_modules安装和使用,但随后的整个目录被上传的地方,是每个作业之间重新下载。(我真的很想知道这里发生了什么......模块去哪里了?)

有没有更好的方法npm install在管道开始时只运行一次,然后node_modules在整个运行时保持在管道中?我不想node_modules在所有作业完成后保留它们,因此它们不需要在任何地方上传或下载。

重现行为的示例管道配置文件:

image: node:lts

stages:
  - setup
  - build
  - test

node:
  stage: setup
  script:
    - npm install
  artifacts:
    paths:
      - node_modules/

build:
  stage: build
  script:
    - npm run build
  dependencies:
    - node

test:
  stage: test
  script:
    - npm run lint
    - npm run test
  dependencies:
    - node
Run Code Online (Sandbox Code Playgroud)

Ami*_*tyo 3

模块去哪里了?

默认情况下,工件保存在主gitlab 机器上:

/var/opt/gitlab/gitlab-rails/shared/artifacts

是否有更好的方法在管道开始时仅运行 npm install 一次,然后在整个运行时将 node_modules 保留在管道中?

您可以尝试以下一些选项:

  1. 将设置和构建阶段合并为一个阶段。

  2. 构建器计算机上的本地 npm 缓存。更快的npm install时间。或者使用私有 npm 代理注册表(例如 - Nexus/Artifactory)

  3. 检查gitlab主机和构建器是否在同一网络中,这样上传/下载会更快

  4. 考虑在 docker 中打包您的构建。您将在 gitlab 阶段之间获得可重用的 docker 镜像。(当然,将图像上传到docker注册表有一定的开销)