在我的ElasticBeanstalk环境中,我的 node 通常(多年来)需要5分钟.要部署的js应用程序,实例将在EB Health选项卡中从状态"待定"更改为"确定".

自5月14日起,应用程序部署需要约15分钟,而不涉及应用程序、基础设施、应用程序存储库、EB环境或EC2 linux映像.同样的事情发生在生产和开发环境中,这两个环境都是独立的EB环境,部署相同的应用程序.

看看/var/log/eb-activity.log,我发现这15分钟是按步骤进行的:

[Application deployment <APPID>/StartupStage0/AppDeployPreHook/50npm.sh] : Starting activity...

脚本本身只运行:

/opt/elasticbeanstalk/containerfiles/ebnode.py --action npm-install

该脚本只是执行一些文件判断和路径合成,然后运行:

npm --production install

为了进行比较,我清除了所有缓存文件,并在本地运行了相同的命令,耗时约11分钟:

rm -rf node_modules
node cache clean -f
npm --production install

我用--loglevel silly再次运行了这个命令,它显示package.json中有一个依赖项不是从npm注册表中提取的,而是直接从GitHub中提取的,指向一个标签:

npm sill pacote Retrying git command: ls-remote -h -t git://github.com/<org>/<repo>.git attempt # 2
npm sill pacote Retrying git command: ls-remote -h -t git://github.com/<org>/<repo>.git attempt # 3
npm verb prepareGitDep github:<org>/<repo>#<label>: installing devDeps and running prepare script.

git ls-remote个命令中的每个命令的超时时间约为1分钟,然后安装devdependences并运行prepare脚本5分钟.我不确定这是否也发生在EC2实例上,但这是我发现的唯一提示.

这3个命令超时了git ls-remote个命令和prepare个脚本,总共约8分钟.因此,如果这是以前没有执行过的,那么这可能解释了部署时间更长的原因.但是,为什么这次部署会突然与过go 几年有所不同呢?


我遇到了一个GitHub blog post:

2022年3月15日

改变是永久性的.我们将永久停止接受DSA密钥.在上述截止点之后上传的RSA密钥将仅适用于SHA-2签名(但同样,在此日期之前上传的RSA密钥将继续适用于SHA-1).不推荐使用的MAC、密码和未加密的Git协议将被永久禁用.

因此GitHub停止接受使用git://协议的请求.也许这就是部署时间更长的原因,而超时也发生在EC2中.但这一变化在3月15日(正好是两个月前)已经成为永久性的,那么为什么这个问题直到现在才出现呢.

推荐答案

从5月13日开始,我们的代码库中出现了同样令人困惑的行为.我不知道为什么GitHub依赖关系到现在才遇到这些问题,但从你分享的博客帖子来看,这似乎是一件永久性的事情.

在这个问题上已经创建了一个GitHub issue,社区已经提出了各种方法来解决这个问题.

其中一项建议是:

通过在包锁处用https替换github协议解决了这个问题.json&;包裹json

另一位用户建议:

... 我们发现,将npm更新到7.16.0版(至少,由于其他原因,这是我们的go-to版本)解决了这个问题

对于我们来说,我们 Select 了后者,并开始使用NPM版本7(特别是7.24.2).这确实需要我们将package-lock.json文件更新到版本2,这带来了许多其他问题,但它似乎对我们有用.

Node.js相关问答推荐

使用NodeJS输出检索Base64图像的网络报废

如何在Node.js 中设置图表js的背景色

DocuSign:调用createEntaine时,RequestJWTApplicationToken返回401 AUTHORIZATION_INVALID_TOKEN

Firebase-admin筛选器.或只考虑第一个WHERE子句

如何防止Socket-io实例化React/Next.js中的两个套接字(当前在服务器*和*客户端实例化)

Node-Red Tasmota 错误:连接 ECONNREFUSED 192.168.77.21:1883

mongodb首先自连接,然后根据某些条件与另一个表连接

为什么 mongoose 没有常规数组方法

在生产环境中,Nest实例启动时抛出不完整的导入错误

Cloudflare 522 错误 - javascript 客户端连接到 node 服务器

登录用户并获取他们的个人资料

如何修改这个flake.nix,这样我就不用每次加载环境都加载nix包了

Mocha调用所有it回调模拟(测试中间件)

根据 mongoDB 中存在的唯一字符串生成唯一字符串的最佳方法

响应发送 200 而不是 403

适用于 Windows 的 NVM 无法正常工作?

异步函数 - 等待不等待promise

安装 node.JS 时,node.js 运行时和 npm 包管理器选项有什么区别?

按日期时间字段获取最新的 MongoDB 记录

yarn 和 npm 的主要区别是什么?