如何在多个TeamCity构建中减少npm安装的时间?

时间:2016-12-07 20:40:09

标签: node.js npm teamcity

问题

  • 我们在TeamCity中有大量的构建配置来处理许多相同软件包的npm安装
  • 因为我们需要为许多构建(例如所有PR)强制执行干净的检出,所以给定构建中的node_modules文件夹永远不会被重复使用
  • 我们构建的npm安装部分需要4分钟,大约占给定构建时间的40%。
  • 每天在10个代理商的数百个版本中,这是一个值得减少的数字。

问题

在给定堆栈的构建之间集中/重用node_modules文件夹的推荐方法是什么?

技术堆栈

  • Windows Server 2008 R2
  • 节点LTS 4.x
  • TeamCity 9.x

我们尝试过什么

  • 使用npm cache - 默认情况下会发生这种情况,因此至少我们不会每次都从互联网上下载软件包。
  • node_modules符号链接到公共目录 - 这种方法有效(从几分钟到几秒)但不幸的是,在Windows上处理符号链接时,一些gulp / grunt任务失败了。 Womp womp。

我们正在尝试的其他方法

  • 在层次结构的更上方创建一个node_modules文件夹:不确定,但似乎节点可以分层搜索node_modules文件夹。在这种情况下,在父目录中创建node_modules文件夹可能会解决问题。
  • 使用NODE_PATH环境变量 - 不确定设置此项是否会执行与上述内容类似的操作,并在未找到时提供常用的node_modules文件夹在我们的一个版本中。
  • 使用Powershell Move-Item返回&在备份目录之间:如果我们必须破解它,那么每个项目ID使用一个备份目录并使用Move-Item可能是值得的,它应该更新分区链接而不是复制文件,至少。 That approach is outlined on this blog post

2 个答案:

答案 0 :(得分:0)

我被告知您可以关闭进度报告并显着加快速度: http://biercoff.com/how-to-crazy-easily-speed-up-your-npm-install-speed/

答案 1 :(得分:0)

您是否尝试过docker缓存?

npm install放入Dockerfile,运行docker build

FROM node:12

WORKDIR /code

COPY ./package.json ./package-lock.json /code

RUN npm install # skiped when package.json/package-lock.json not changed.

ADD . /code

# do other things

Docker构建会为每个命令(COPY / ADD / RUN)创建一个层,并在重新构建时将其用作缓存(如果未进行任何更改)。

只要package.json / package-lock.json不变

docker build将缓存用于

COPY ./package.json ./package-lock.json /code

RUN npm install

因此您无需加快npm install的速度,只需跳过即可。