加快 Heroku 上的部署 [重复]
Posted
技术标签:
【中文标题】加快 Heroku 上的部署 [重复]【英文标题】:Speed up deployment on Heroku [duplicate] 【发布时间】:2012-12-31 12:36:35 【问题描述】:Heroku 很棒。但是每次我部署时,Heroku 似乎都喜欢重新下载和重建所有的包。使用 socket.io
和 mailparser
大约需要 3 分钟。
有没有办法加快部署过程?有没有办法告诉 Heroku 它可以缓存这些项目?或者我可以上传预建的node_modules
?
【问题讨论】:
build-pack(将源代码转换为部署在 Heroku 上的代码)应该已经在构建之间缓存node_modules
。至少它在自述文件中是这样说的。您确定这会减慢您的构建速度吗?
@friism 我猜他们使用标准的 NPM 缓存,所以模块仍然需要解压、复制,最重要的是,在每次推送后重新编译。如果您的模块具有混杂的依赖树或依赖于 C++ 扩展(mongodb、socket.io 等),则需要一些时间。
【参考方案1】:
从今天开始,Heroku 似乎终于缓存了node_modules
文件夹!
-----> 删除 6 个匹配 .slugignore 模式的文件。
-----> 检测到 Node.js 应用程序
-----> 请求的节点范围:0.10.x
-----> 解析节点版本:0.10.22
-----> 下载安装节点
-----> 从缓存中恢复 node_modules
-----> 安装依赖项
-----> 修剪未使用的依赖项
-----> 缓存 node_modules 目录以供将来构建
-----> 清理 node-gyp 和 npm 工件
现在对我来说构建时间大约是 3 秒。
【讨论】:
是的,我今天也有同样的经历。它会一直缓存它们还是会知道它们现在何时自动更新? 我没有来源,但我想是这样的:如果他们只是将node_modules
文件夹复制到项目中并运行npm update
,它只会更新需要更新的部分。所以基本上 npm 已经很好地处理了这个问题。这就是 npm 的美妙之处,它将整个依赖树映射到文件系统。
一周后,我可以确认每次我更新一个模块依赖项并推送到 heroku 时,只有这个模块是从 npm 注册表中获取的。比以前快得多。
而不是@Prinzhorn 建议的npm update
,他们可能正在运行npm install
,它只会安装缺少的东西。然后他们运行npm prune
,这将删除未在package.json
文件中列出的模块。【参考方案2】:
我为加快进程所做的一件事是将 .slugignore 文件添加到主文件夹并添加我不想运行应用程序的所有文件和文件夹。
.slugignore 文件的示例内容: 工作 样机 *.psd *.pdf
【讨论】:
【参考方案3】:我也遇到了同样的问题。
这里有一些关于缓存node_modules
文件夹的讨论:https://github.com/heroku/heroku-buildpack-nodejs/pull/37
另一个想法:https://github.com/heroku/heroku-buildpack-nodejs/issues/25
我现在正在考虑一些解决方案。
在单独的分支中签入 node_modules
:核心 Node.js 维护人员实际上建议将 node_modules
文件夹签入源代码控制(用于应用程序,而不是库)。我不喜欢这个。解决它的一种方法可能是拥有一个单独的production
分支,其中包含一个不会忽略node_modules
的不同.gitignore
文件。当您要部署时,只需从您的 master 做一个 rebase,node_modules
就会被签入。至少这可以让您的 master 分支免受依赖。
将 preinstall
脚本添加到 package.json
以下载压缩的依赖项 zip:您还可以添加一个 pre-push git 挂钩来捆绑您的依赖项并将它们上传到 S3。不过这可能太慢了。
修改heroku-buildpack-nodejs
:将未完成的拉取请求与node_modules
缓存集成:
heroku config:set BUILDPACK_URL=https://github.com/opdemand/buildpack-nodejs.git
【讨论】:
【参考方案4】:我也有同样的问题(请参阅Avoid npm refresh after every deployment on Heroku)。
Heroku 强制下载/构建/等。顺序,因为他们需要以“空白状态”启动应用程序:清理以前未删除的文件,当他们将您的应用程序移动到另一台服务器时,当您分配新的网络测功机时,等等。
问题显然在于本机包和重新编译。对于所有仅 js 的包,我将它们与我的项目一起提交,并将它们从 package.json 中删除。它增加了几秒钟,但没有那么多。
如果您可以访问 Linux 机器(或 VM)相同的配置 - 截至今天,Linux [...] 2.6.32-350-ec2 #57-Ubuntu SMP [...] x86_64 GNU/Linux
。
虽然我不建议将其作为最终解决方案,因为它可能会在某一天中断 - 在我看来,heroku 不能保证应用程序运行的平台。
【讨论】:
【参考方案5】:heroku-buildpack-nodejs 似乎最近有了进展。
合并拉取请求后,您可以添加
heroku config:set BUILDPACK_URL=https://github.com/heroku/heroku-buildpack-nodejs
致您的heroku environment variables。
目前,David Dollar 的分叉存储库可在
获得https://github.com/ddollar/heroku-buildpack-nodejs
将此作为您的BUILDPACK_URL
,它应该缓存 npm 模块。
我在 .gitignore
中使用 node.js 0.10.5a、npm 版本:1.3.5 和 npm_modules 进行了尝试。到目前为止,Tt 似乎工作正常!
【讨论】:
【参考方案6】:查看新 Heroku Node.js buildpack 的这个分支,现在处于测试阶段,它支持构建之间的 node_modules 缓存:
https://github.com/heroku/heroku-buildpack-nodejs/tree/diet
使用它:
heroku config:set BUILDPACK_URL=https://github.com/heroku/heroku-buildpack-nodejs#diet -a my-node-app
git commit -am "fakeout" --allow-empty
git push heroku
【讨论】:
以上是关于加快 Heroku 上的部署 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
Heroku 无法部署 Java 11 Spring Boot App [重复]