减少 rake assets:precompile 中的内存消耗

Reduce memory consumption in rake assets:precompile

问题:
在自动构建中执行 rake assets:precompile 任务时,我 运行 内存不足。是否有任何策略可以进行增量预编译,或者以其他方式执行预编译阶段而不消耗那么多 RAM?该任务似乎比构建的基准多消耗了大约 850 MB。

上下文:
我正在尝试获取我们自动构建的单个 Docker 容器 Bitbucket Pipelines 版本。应用程序堆栈包括 Rails 4.2.7、PostgreSQL 9.3、Java 8、Maven 3.3.9 和 JRuby 9.1.2.0。我试过基于 Debian Jessie 和 Alpine Linux 创建图像,但它在基线内存中没有太大区别。

我在 digitalocean 上的 cheapest droplet 上有类似的问题。我创建了 linux 交换分区。 可能你的主主机没有交换分区。

简答

使用 NodeJS 作为 JavaScript 解释器进行预编译(或另一个 JavaScript 以低峰值 RAM 使用为特征的解释器)。

更长的答案

就上下文而言,与 therubyracer v0.12.2 和 therubyrhino v2.0.4 相比,我使用的是 NodeJS 4.5.0

你能增加 RAM 吗?

听起来很愚蠢,但在使构建过程复杂化之前,查看是否有更多功能强大的构建机器可用,或者交换 space 是否可用(尽管它可能会增加构建时间)可能是有意义的。

你能切换 JavaScript 口译员吗?

高峰值 RAM 利用率似乎是两者的基本特征 therubyrhino (Mozilla's Rhino JavaScript interpreter) and therubyracer (V8 JavaScript interpreter). There does not appear to be an effective way to significantly drop the amount of RAM consumed during the asset precompilation stage. The most viable paths appear to be precompiling the assets outside the build lifecycle and caching them somewhere so they can be fetched instead of precompiled, 。正如对该问题的评论所暗示的那样,Rails 版本和 Ruby 版本都有影响,但不如 JavaScript 解释器那么大。

如果一切都失败了

, if using Bundler一样,可以利用并行配置只为预编译任务调用 NodeJS,并保持原始构建相对不变。我没有研究这个,因为它更容易切换解释器,但是虽然我能够用 rake 和 NodeJS 预编译资产,但当涉及到 rake + therubyrhino 调用时,它们似乎没有被认为是预编译的,所以它们是重新预编译。我通过编程设置 BUNDLE_GEMFILE 环境变量来完成此操作,该变量指向一个完全独立的 gemfile,它使用 MRI Ruby 和 NodeJS 而不是 JRuby 和 therubyrhino。