node.js - Nodejs npm 步骤在 TeamCity 的每个构建中下载包

在谈到 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%,这似乎在每次构建时重新下载所有包

Step 3/7: NPM Setup (Node.js NPM) (2m:10s)

[npm install] Starting: 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以防止它 checkin 源代码)然后再不 checkin ,除非您启动一个新的本地工作区。

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

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

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

最佳答案

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

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

https://stackoverflow.com/questions/32834881/

相关文章:

process - 为什么要自动化构建?

build - Dojo 1.8 和构建(或缺少)

java - Gradle:如何使用并排项目配置多项目设置

xcode - 在 Xcode 中指定子项目的配置

java - 如何创建一个包含 shell 脚本和不在 jar 中的属性文件的 maven 程序集?

build - 何时使用门控值机?

c++ - 在 Visual Studio 中运行小型 C++ 程序而不创建项目

android - 特拉维斯-CI `Android 28 licenses have not be

powershell - 如何显示 Visual Studio Online 构建任务 Write-

maven - 如何从 lib 文件夹中添加 Maven 依赖 jar 文件