Nodejs npm步骤在TeamCity中的每个构建上下载包

时间:2015-09-29 02:46:44

标签: node.js build npm teamcity

对于nodejs npm,我有点像n00b,但是由于在我们的构建环境中使用几篇文章推荐的步骤实现它,它的构建时间增加了三倍。

我们将它用于标准内容(minify / concat / etc js / css / etc)

我们使用TeamCity并添加了一个Node.js NPM步骤然后执行gulp步骤来运行任务(RE:https://github.com/jonnyzzz/TeamCity.Node

设置NPM的任务花费最多的时间,2分10秒,这超过了总编译时间的65%,调用命令“npm install”,这似乎重新下载每个构建的所有包

  

步骤3/7:NPM设置(Node.js NPM)(2m:10s)

     
    

[npm install]开始:cmd / c npm install

  

以前的总建造时间大约是1分30秒,包括单元测试。

无论如何都要在本地缓存这些并阻止在每个构建上重新下载?在用户配置文件中或可能与构建文件夹相对的东西?

更多细节..

这可能最能说明设置http://www.dotnetcurry.com/visualstudio/1096/using-grunt-gulp-bower-visual-studio-2013-2015

我们有使用新的Task Runner Explorer的C#项目,依赖关系被保存到package.json中,你在你工作区的本地环境中预先运行“npm install”一次(需要使用.tfignore除非你启动一个新的本地工作区,否则不要再次检查来源。

当构建运行时,它需要从命令行运行“npm install”,它从package.json文件中获取依赖项,并且每次都将它们安装到构建工作目录内的子文件夹中,即使文件已经存在于以前的版本中(即TC代理没有清理它们),但是你不能将它们安装在工作文件夹之外。

我可能是错的......或者我应该说我希望我错了,并且寻找一种方法来支持这一点,但是我们使其工作的任何方式都需要与任务运行者资源管理器一起工作所以对于开发者而言,F5的体验在当地仍然是相同的。

我们确实有多个代理商。

4 个答案:

答案 0 :(得分:10)

我不了解Node.js,但这里有一些特定于TeamCity的建议:

  1. NPM是否可以将文件下载到%TEMP%?如果是这样,它们将无法在后续TeamCity构建之间重复使用,因为TeamCity代理程序劫持%TEMP%目录(将其重定向到<TeamCity Home>/buildAgent/temp/buildTmp)并始终在每次新构建之前完全擦除此目录。 (见buildTmp here。)
    • 从这个意义上说,最好是指示NPM将下载的文件存储在工作区(您检查构建的目录)中。
  2. 如果NPM 下载到工作区(结帐目录),您可能要求在每次运行时都进行干净的结账吗? (请参阅编辑配置设置 | 版本控制设置 | 显示高级选项 | 在构建之前清除结帐目录中的所有文件复选框。)
    • 在这种情况下,取消选中该复选框。
  3. 由于磁盘空间不足,TeamCity是否可以清理结帐目录?当TeamCity注意到它的空间不足时,这种清理会自动启动。 (使用可用磁盘空间构建功能可以使清理更加激进。)
    • 在这种情况下,请停止使用构建功能。如果它没有被使用并且自动清理是罪魁祸首,则很难控制。最好只清理文件系统中那些不由TeamCity管理的部分(您自己的%TEMP%和其他地方),从而为TeamCity提供一些余地。
  4. 您的构建每次都在不同的代理上运行吗? (查阅构建历史记录。)如果是这样,它不能重复使用下载的工件(即使它们被下载到checkout目录中),因为它们每次都被下载到不同的机器的文件系统。我怀疑是这种情况,因为TeamCity倾向于代理 - 工作空间重用(坚持使用相同的代理)。
    • 在这种情况下,您可以通过设置代理程序要求来强制代理程序重用,指定您希望构建程序始终在一个特定代理程序上运行。您还可以将该代理单独放入其自己的池中,以便不能在其上运行其他构建。

答案 1 :(得分:6)

我发现修复此问题的最佳方法是备份/恢复节点模块文件夹,我在这里做了一篇关于它的博客文章

https://beerandserversdontmix.com/2016/06/04/teamcity-and-avoiding-redownloading-of-npm-packages/

答案 2 :(得分:0)

如果您不使用“松散”软件包版本,这可能是您的问题。您可以指定npm install angular-cli@0.1.0.0-beta.10之类的内容,但是您会一直处于旧版本,如果您的开发人员经常更改他们构建的内容,那么您的构建系统将会流失。

在您的packages.json中,您可以使用*和〜来定义通配符版本,例如3. *或~2.5,这样可以让您获得3.x的任何“次要”修订版本,如3.0.2或3.0.99,以及2.5将是类似的,可以安装2.5.x的任何版本,但不能安装2.6.0。

答案 3 :(得分:0)

对于也为此感到挣扎的人们。其他原因可能是在切换分支时清除了目录。

Teamcity VCSRoot setting screenshot

TeamCity的默认设置是清除分支更改时所有未跟踪的文件(甚至忽略的文件),这些文件导致每次分支更改时都删除node_modules。

将此设置更改为“所有非忽略的未跟踪文件”应该会有所帮助。