Azure DevOps在“npm install”时失败

10
我们有一个CD/CI Azure DevOps构建流水线,今天突然停止工作。它在我们的流水线中已经成功使用了数月。
失败的组件是"npm install",在详细日志中出现以下错误。

enter image description here

我在谷歌上搜索了一下,有些人建议在运行npm install之前运行:npm cache clear --force。我尝试了这个方法,但是出现了相同的错误。

然后我查看日志中较早的部分,发现以下内容:

enter image description here

我尝试浏览https://github.com/sass/node-sass/releases/download/v4.12.0/win32-x64-83_binding.node,但出现了“页面未找到”的消息。
我无法确定这是否与npm失败的根本原因有关,但似乎支持了我的假设,即“npm install”在撰写本文时存在问题(2020年11月17日)。
还有其他使用Azure DevOps进行CD / CI的人遇到了同样的问题吗? 我查看了NPM事件页面,并看到此问题https://status.npmjs.org/incidents/r1tlhscrw3r6,但应该已经解决了。

尝试运行 npm audit 查看是否存在任何问题。如果有,您可以通过运行 npm audit fix 来修复它们。 - Connell.O'Donnell
2
@Fylix,你最近有没有更新服务器上的 node.js?似乎它试图针对不支持的 node 版本构建 node-sass - Max Ivanov
嗨Max,这是使用Azure DevOps管道代理完成的,因此我无法控制任何本地或特定VM用于此node.js设置。我注意到当我查看日志时,npm版本已从6.14.6(我们上次构建的版本)更新为6.14.8。 - Fylix
1
默认版本已更新到代理。您可以在图像的Github上查看破坏性更改。https://github.com/actions/virtual-environments/issues/1953。从Node.js 12.x升级到14.x。 - Matt
3个回答

11

最近,Azure DevOps默认代理映像的默认Node.js版本从12.x升级到14.x,这是一项重大变更,详情请参见此处

重大变更

映像上的默认Node.JS版本将更新为14.x。

目标日期

对于Windows、Ubuntu映像,此更改的推出将从2020年11月2日开始,需要3-4天。对于MacOS映像,推出将从11月9日开始。

更改的动机

我们始终默认安装LTS版本的Node.JS作为映像。2020年10月27日,Node.JS 14成为了LTS版本。2020年11月30日,Node.JS 12将转换为维护模式。

可能的影响

如果您依赖默认的Node.JS版本,并且您的项目与Node.JS 14不兼容,则可能会出现故障。

缓解措施

请考虑使用Node.js Tool Installer task(用于Azure DevOps)和setup-node(用于GitHub Actions)切换回Node.JS 12。切换只需要不到一秒钟时间。映像上仍将提供Node.JS 12和Node.JS 8、10。


谢谢@Matt,我会检查一下,但看起来这就是我们的Azure管道所使用的windows-2019代理规范。 - Fylix

10

根据@Matt的回答,我将发布你需要修复此问题的yml片段:

- task: NodeTool@0
  inputs:
    versionSpec: '12.x' 

9

如果您仍在使用图形用户界面而非 YML 文件,则需添加一个"Node.js 工具安装器" 任务并配置其版本。它看起来会像这样(其中版本规范包含您要运行的 Node.js 版本): enter image description here 还要注意,该任务 "npm install" 任务之前执行!!


每次进行Angular构建时,我们需要执行npm install吗?如果不需要,有没有办法忽略npm install呢? - undefined
@Schatak 是的。每次都需要调用npm install。可以将其视为每次运行时的清洁环境。它不知道你在上一次运行中做了什么。这也是非常理想的,因为你不希望有可能导致构建问题的东西留在那里,尤其是在升级或删除内容时。 - undefined
谢谢您的回复。我担心的是我有一些节点包,根据项目的需要进行了修改,我们不希望用npm install覆盖这些修改。所以我正在寻找一个忽略或停止用npm install覆盖这些特定包的选项。 - undefined
@Schatak 我建议你将相关软件包fork一份,然后放入你自己的feed中。DevOps有可以处理NuGet或NPM软件包(以及许多其他类型)的feed。然后,你可以使用.npmrc文件来添加额外的feed(参见此处另一篇帖子,有人忘记添加上游feed)。就我个人而言,我从未设置过这个,但我相信这可以帮你解决问题。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接