在我的 ElasticBeanstalk 环境中,部署我的 Node.js 应用程序以及在 EB 运行状况选项卡中将状态从“待定”更改为“确定”的实例通常需要大约 5 分钟(多年来)。
自 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 分钟,然后似乎安装 devDependencies 运行 prepare
脚本另外 5 分钟。我不确定 EC2 实例上是否也发生了这种情况,但这是我发现的唯一提示。
3 个超时的 git ls-remote
命令和 prepare
脚本大约需要 8 分钟。因此,如果这是以前没有执行过的事情,它可能会解释更长的部署时间。但是,为什么部署会突然与多年来的部署有所不同呢?
我遇到了这个 GitHub https://github.blog/2021-09-01-improving-git-protocol-security-github/:
2022 年 3 月 15 日
更改为永久性更改。我们将永久停止接受动态搜索广告 keys。在上述截止点之后上传的 RSA keys 仅适用于 SHA-2 签名(但同样,在此日期之前上传的 RSA keys 将继续适用于 SHA-1)。已弃用的 MAC、密码和未加密的 Git 协议将被永久禁用。
因此 GitHub 停止接受使用 git://
协议的请求。也许这就是部署时间较长的原因,超时也发生在 EC2 中。但这种变化已经在 3 月 15 日(正好是 2 个月前)永久生效,为什么这个问题现在才出现。
回答1
从 5 月 13 日开始,我们的代码库中出现了同样令人费解的行为。我不知道为什么直到现在 GitHub 依赖项才解决这些问题,但根据您分享的博客文章,这似乎是一件永久性的事情。
https://github.com/npm/cli/issues/4896 已针对该主题创建,社区提出了各种解决该问题的方法。
一个这样的建议:
通过在 package-lock.json & package.json 处用 https 替换 github 协议解决
另一位用户建议:
...我们发现将 npm 更新到 7.16.0 版本(至少,由于其他原因,这是我们的版本)解决了这个问题
对于我们来说,我们选择后者并开始使用 NPM 版本 7(特别是 7.24.2
)。这确实需要我们将 package-lock.json
文件更新到版本 2,这带来了许多其他问题,但它似乎对我们有用。
回答2
这是在 Node.js 应用程序的 AWS EC2 / ElasticBeanstalk 部署中为我解决的问题:
在 .ebextensions
中运行 https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/customize-containers-ec2.html#linux-commands:
commands:
01-configure-git:
command: sudo git config --system url."https://github".insteadOf "git://github"
ignoreErrors: true # optionally, so deployment doesn't fail in case the command fails for some reason
仅检查您自己的 package.json
并更改协议可能还不够。如果有依赖项也使用 git
协议直接在 GitHub 中引用它们自己的依赖项。上述解决方案说明了所有这些。