20

問題:自動ビルドでタスク
を実行中に RAM が不足しています。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 に基づいてイメージを作成しようとしましたが、ベースライン メモリに大きな違いはありません。

4

2 に答える 2

4

簡潔な答え

プリコンパイル用の JavaScript インタープリターとしてNodeJSを使用します (またはピーク時の RAM 使用量が少ないことを特徴とする別の JavaScript インタープリター)。

より長い答え

コンテキストとして、therubyracer v0.12.2 および therubyrhino v2.0.4 と比較して、NodeJS 4.5.0 を使用しています。

RAMを増やすことはできますか?

ばかげているように聞こえますが、ビルド プロセスを複雑にする前に、より高性能なビルド マシンが利用可能かどうか、またはスワップ スペースが利用可能かどうかを確認することは理にかなっています (ただし、ビルド時間が長くなる可能性があります)。

JavaScript インタープリターを切り替えることはできますか?

高いピーク RAM 使用率は、therubyrhino (Mozilla の Rhino JavaScript インタープリター) とtherubyracer (V8 JavaScript インタープリター) の両方の基本的な特徴のようです。アセットのプリコンパイル段階で消費される RAM の量を大幅に削減する効果的な方法はないようです。@ user4776684 が示唆するように、最も実行可能なパスは、ビルド ライフサイクル外でアセットをプリコンパイルし、プリコンパイルする代わりにフェッチできるようにどこかにキャッシュすることです。質問に対するコメントが示すように、Rails バージョンと Ruby バージョンの両方に影響がありますが、JavaScript インタープリターほどではありません。

他のすべてが失敗した場合

上記の @slowjack2k のように、 Bundlerを使用している場合、並列構成を利用して NodeJS をプリコンパイル タスク用にのみ呼び出し、元のビルドを比較的そのままにしておくことができます。インタープリターを切り替える方が簡単だったので調べませんでしたが、rake と NodeJS でアセットをプリコンパイルすることはできましたが、rake + therubyrhino の呼び出しに関しては、プリコンパイルされているとは見なされなかったようです。再プリコンパイル。BUNDLE_GEMFILEこれは、JRuby と therubyrhino の代わりに MRI Ruby と NodeJS を使用する完全に別の gemfile を指すプログラムで設定された環境変数で実現しました。

于 2016-08-29T16:03:27.817 に答える
0

私は、digitalocean の最も安いドロップレットで同様の問題を抱えています。Linux スワップ パーティションを作成しました。メインホストにスワップパーティションがない可能性があります。

于 2016-08-15T19:28:51.390 に答える