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

时间:2019-05-04 15:10:14

标签: node.js gitlab node-modules gitlab-ci

我对GitLab CI相当陌生,我一直在尝试不同的方法来在整个管道中使用node_modules目录。根据我在official docs中所读到的内容,缓存和工件似乎是在作业之间传递文件的有效方法:

  

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

1 个答案:

答案 0 :(得分:1)

  

这些模块在哪里?

默认情况下,工件被保存在主gitlab machine上:

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

  

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

您可以尝试以下选项:

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

  2. Local npm cache在构建器计算机上。快npm install次。或使用私有npm代理注册表(例如-Nexus / Artifactory)

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

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