Nodejs npm步骤在TeamCity的每个版本上下载软件包

当谈到nodejs npm的时候,我有一点n00b,但是由于在我们的构build环境中使用几篇文章中推荐的步骤来实现它,所以我们的构build时间翻了三倍。

我们用它作为标准的东西(minify / concat / etc js / css / etc)

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

设置NPM的任务花费了大部分时间,2分10秒,占总构build时间的65%,调用命令“npm install”,该命令似乎重新下载每个构build的所有包

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

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

以前的总build设时间在1分30秒左右,包括unit testing。

是否有caching这些本地,并防止重新下载每个构build? 在用户configuration文件或东西可能是相反的生成文件夹?

更多详情..

这可能是最好的解释设置http://www.dotnetcurry.com/visualstudio/1096/using-grunt-gulp-bower-visual-studio-2013-2015

我们有C#项目正在使用新的任务运行资源pipe理器,依赖项被保存到一个package.json中,你预先运行“npm install”一次在你的本地环境工作区(需要使用.tfignore来防止它从检入到源)然后不再,除非你开始一个新的本地工作区。

构build运行时,需要从命令行运行“npm install”,它会从package.json文件中获取依赖关系,并将其安装到每次构build的工作目录中的子文件夹中,即使这些文件已经存在从以前的版本(即TC代理没有清理它们),afaik你不能安装在工作文件夹之外。

我可能是错的…或者我应该说我希望我错了,并寻找一个方法来大力支持这个,但是什么办法,我们使它的工作将需要与任务亚军探险家的工作,所以F5的经验开发者在当地还是一样的。

我们有多个代理是的。

我不知道Node.js,但这里有几个TeamCity的具体build议:

  1. NPM是否可能将文件下载到%TEMP% ? 如果是这样,他们将不能在随后的TeamCity构build之间重复使用,因为TeamCity代理劫持%TEMP%目录(将其redirect到<TeamCity Home>/buildAgent/temp/buildTmp ),并且在每个新构build之前始终完全清除此目录。 (请参阅buildTmp 这里 。)
    • 从这个意义上说,如果你可以指示NPM把下载的文件存储在工作区 (检出你的版本的目录),那将是更好的select。
  2. 如果NPM 正在下载到工作区(结帐目录),那么您是否可能要求在每次运行时都进行干净的结帐? (请参阅编辑configuration设置 | 版本控制设置 | 显示高级选项 | 在生成checkbox之前清除检出目录中的所有文件
    • 在这种情况下,取消选中checkbox。
  3. TeamCity可能由于磁盘空间不足而清理检出目录? 当TeamCity发现空间不足时,这个清理会自动启动。 (使用可用磁盘空间构buildfunction,可以使清理工作更具侵略性。)
    • 在这种情况下,停止使用构buildfunction。 如果不使用自动清理,则很难控制。 最好的办法就是清理你的文件系统中不属于TeamCity(你自己的%TEMP%和其他地方)pipe理的那部分文件系统,这样就给TeamCity留下了一些空间。
  4. 你的版本是否每次都在不同的代理上运行? (请查看构build历史logging。)如果是这样,它将不能重用下载的工件(即使它们被下载到checkout目录中),因为它们每次都被下载到不同的机器文件系统。 我怀疑这是事实,因为TeamCity倾向于代理 – 工作区重用(坚持同一个代理)。
    • 在这种情况下,您可以通过设置代理需求来强制代理重用,指定您希望您的构build始终在一个特定的代理上运行。 你也可以把这个代理单独放到自己的池中,这样就不会有其他的构build可以运行。

我发现解决这个问题的最好办法是备份/恢复节点模块文件夹,我在这里做了一个关于它的博客文章

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

如果你不使用“松散”的软件包版本,这可能是你的问题。 你可以指定像npm install angular-cli@0.1.0.0-beta.10这样的东西,但是npm install angular-cli@0.1.0.0-beta.10一个老版本的问题,如果你的开发者经常改变他们的构build方式,那么你的构build系统。

在你的packages.json中,你可以使用*和〜来定义通配符的版本,例如3. *或〜2.5,它可以让你获得像3.0.2或3.0.99一样的3.x的任何“小”修订版本,2.5是类似的,任何版本的2.5.x都可以安装,但不是2.6.0。