在我的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相关问答推荐

容器端口是容器内 node 应用程序的端口吗?

Mongoose抱怨说,整数是数字,而不是整数

EJS ForEach循环标记

try 使用 pdf.js 时 pdf.getPage 不是函数

如何在套接字对象中存储或添加数据?

yarn 安装失败,因为 node-gyp 正在寻找过时的 node 版本标头

suppress AWS SDK v2 弃用消息

无法关闭 node.js 中的mongoose 连接

如何在 NestJS 中使用外部生成的 swagger.json?

用户通过 oauth2 twitter 授权或通过Passport discord后如何重定向到 React/Vue 路由?

使用 .pipe(res) 向客户端发送音频不允许您搜索?

在 node:readline 中按 CTRL+D 时会发出什么信号?

如何在 TypeScript 中输出 Hackerrank 二叉树问题?

类型中缺少属性,该类型是由类实现的接口

node.js 变量不存在代码块

使用中的端口代码:'EADDRINUSE',即使在 kill 命令之后

如何在 NodeJS 中获取操作系统用户名?

使用 Socket.io 将客户端连接到服务器

如何运行用 TypeScript 编写的 Mocha 测试?

TypeError:请求路径包含未转义的字符,我该如何解决这个问题