在执行rake资产时,我的RAM已经用尽:自动构建中的预编译任务.是否有任何策略来进行增量预编译,或者以某种其他方式执行预编译阶段,而不占用多少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的映像,但它在基线内存方面没有太多的区别.
解决方法
使用NodeJS作为预编译的JavaScript解释器(或另一种以低峰值RAM使用为特征的JavaScript解释器).
更长的答案
对于上下文,我使用NodeJS 4.5.0与therubyracer v0.12.2和therubyrhino v2.0.4相比较
你可以增加RAM吗?
听起来很愚蠢,但在构建过程复杂化之前,看看是否有更多能力的构建机器可用,或者是否有可用的交换空间可能是有意义的(尽管它可能会增加构建时间).
你可以切换JavaScript解释器吗?
高峰RAM利用率似乎是therubyrhino(Mozilla的Rhino JavaScript解释器)和therubyracer(V8 JavaScript解释器)的基本特征.在资产预编译阶段,显着降低RAM占用量的方法似乎不是一种有效的方式.最可行的路径似乎是预编译构建生命周期之外的资产,并将它们缓存到某个地方,以便可以获取它们,而不是预编译,as suggested by @user4776684.作为对该问题的意见建议,Rails版本和Ruby版本都有影响,但不会就像JavaScript解释器一样.
如果一切都失败
作为@slowjack2k mentioned above,如果使用Bundler,则可以利用并行配置来仅为预编译任务调用NodeJS,并保持原始版本相对不变.我没有看到这一点,因为它更容易切换口译员,但是当我能够用rake和NodeJS预编译资源时,他们似乎没有被认为是预编译的,当它来到耙子的时候,他们是re -precompiled.我使用程序设置的BUNDLE_GEMFILE环境变量完成了这一点,该变量指向一个完全独立的gemfile,它使用了Ruby Ruby和NodeJS而不是JRuby和therubyrhino.