【问题标题】:Nodejs npm step downloads packages on every build in TeamCityNodejs npm 步骤在 TeamCity 的每个构建中下载包
【发布时间】:2015-12-26 09:31:41
【问题描述】:

在谈到 nodejs npm 时,我有点不习惯,但由于使用几篇文章中推荐的步骤在我们的构建环境中实现它,它使我们的构建时间增加了两倍。

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

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

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

步骤 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

我们有 C# 项目正在使用新的 Task Runner Explorer,依赖项被保存到 package.json 中,您在工作区的本地环境中预先运行“npm install”一次(需要使用 .tfignore以防止它签入源),然后再不签入,除非您启动一个新的本地工作区。

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

我可能是错的......或者我应该说我希望我错了,并且正在寻找一种方法让 gulp 支持这一点,但无论我们如何让它工作都需要与任务运行器资源管理器一起工作,所以开发者在本地的 F5 体验仍然相同。

是的,我们确实有多个代理。

【问题讨论】:

  • 你有没有为这个问题想出一个可接受的解决方案?

标签: node.js build npm teamcity


【解决方案1】:

我不了解 Node.js,但这里有一些针对 TeamCity 的建议:

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

【讨论】:

【解决方案2】:

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

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

【讨论】:

  • 这也是我们所做的(虽然我们使用的是 jenkins,而不是 teamcity),但是随着我们的依赖关系发生变化,我们发现有时我们必须擦除节点模块目录,因为 npm 只会开始失败,所以这似乎不是一个很好的解决方案。
【解决方案3】:

如果您没有使用“松散”的软件包版本,这可能是您的问题。您可以指定 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。

【讨论】:

    【解决方案4】:

    对于也在为此苦苦挣扎的人。其他原因可能是在切换分支时清理目录。

    项目设置 -> 版本控制设置 -> VCS 根设置(编辑)

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-22
      • 1970-01-01
      • 2014-09-13
      • 1970-01-01
      • 2018-01-22
      • 1970-01-01
      • 2015-04-19
      • 2012-12-28
      相关资源
      最近更新 更多