繁体   English   中英

Nodejs npm step 在 TeamCity 的每个构建中下载包

[英]Nodejs npm step downloads packages on every build in TeamCity

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

我们将它用于标准的东西(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 代理尚未清理它们),您无法将它们安装在工作文件夹之外。

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

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

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

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

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

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

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

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

Teamcity VCSRoot 设置截图

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM