Bitbucket Pipelines:「Container 'Build' exceeded memory limit.」
Bitbucket がステップを外から止めました。script が動くビルドのコンテナが、ステップに残された分より多くのメモリを使ったからです。そのとき動いていたコマンドが自分で失敗したわけではないので、ログの最後の数行は手がかりにならないことが多いです。何がメモリを使ったかを見て、上限をかけるか、ビルドのコンテナに多く渡します。
メモリの行き先
Atlassian の Step options と Databases and service containers から:
- Bitbucket Cloud のステップは 4 GB(size
1x)。これをスクリプトとステップのサービス全部で分け合います。 - サービスは
memoryを書かなければ1つ 1024 MB(書けば 128〜3072 MB)。ビルドのコンテナは残りで、最低 1024 MB。 - たとえば 1x のステップに
services: [docker, postgres]を既定のまま付けると、スクリプトに残るのは 4096 − 1024 − 1024 = 2048 MB。 - pipe も数に入ります。pipe を使うステップには、書いていなくても Pipelines が docker のサービスを足します。
Linux の Docker 型のセルフホストランナーでも大きさは同じです。シェル型のランナー(Windows PowerShell・macOS・Linux シェル)は、そのマシンのメモリを全部使います。
1. 何が増えたかを見る
このメッセージについての Atlassian の記事(Bitbucket Pipelines build fails: "Container 'Build' exceeded memory limit")は、失敗するステップのスクリプトの先頭に、裏で回る2つのループを置く方法を挙げています。本来のコマンドが動く間、コンテナのメモリの使用量とプロセスの一覧がステップのログに出ます:
- step:
script:
- while true; do echo "Memory usage in bytes:" && cat /sys/fs/cgroup/memory.current; sleep 2; done &
- while true; do date && ps aux && echo "" && sleep 2; done &
- npm ci
- npm test
止まる直前の数字で上限までの近さが、プロセスの一覧でどれが大きかったかが分かります。同じイメージで、Linux の手元でビルドして、そもそもそれだけ要るのかを見る方法も記事にあります。
2. 増える道具に上限をかける
- Java・Gradle・Maven:ヒープを収まる大きさにします。たとえば
-Xmx2048m(Atlassian の記事は-Xmx2048ですが、mが無いと 2048 バイトになり、Java 21 は「Too small maximum heap」で起動しません)。JVM はヒープより多く使うので、余裕を残します。 - Node.js:
NODE_OPTIONS=--max-old-space-size=2048(メガバイト)で、Node のプロセスごとの JavaScript のヒープを抑えます。 - Jest:Jest は見えている CPU の数から1を引いた数のワーカーを起こします。Atlassian は Pipelines で7つを見ています。テストのコマンドに
--maxWorkers=2を足すか、Jest の設定にmaxWorkersを書きます。
3. ビルドのコンテナに多く渡す
- サービスを減らす:1024 MB も要らないサービスは小さくします。残りがビルドのコンテナに回ります:
definitions: services: redis: image: redis:7 memory: 512 - ステップを2倍にする:
size: 2x(8 GB)。2x のステップは 1x の2倍のビルド時間(build minutes)を使います。- step: name: Test size: 2x script: - npm test
Step options の大きさ:1x 4 GB・2x 8 GB・4x 16 GB・8x 32 GB・16x 64 GB・24x 96 GB・32x 128 GB。4x 以上は Standard と Premium のプランだけです。ビルド時間はその倍数だけ使います(4x なら4倍)。
「Build」でなく「docker」と出たとき
「Container 'docker' exceeded memory limit.」は docker のサービスのほうで、ステップの大きさにかかわらず 1024 MB のままです。docker のサービスにメモリを足す方法へ。
IntelliJ IDEA で Bitbucket Pipelines を見る
Pipeline Inbox for Bitbucket Pipelines は、Lesstep が作っている JetBrains IDE(2024.1 以降)のプラグインです。Bitbucket Cloud の全部のリポジトリのパイプラインを IDE のツールウィンドウに並べ、ステップ、失敗したステップと止まったコマンドを見せます。動いているステップのログは Bitbucket が書くそばから IDE の中で伸びるので、上のメモリの行もブラウザを開かずに追えます。一覧・ステップ・ログは無料。パイプラインの実行・やり直し・停止は Pro(月 US$1.50・30日の無料試用つき)。
Atlassian・Bitbucket・Bitbucket Pipelines は Atlassian の商標、IntelliJ IDEA は JetBrains s.r.o. の商標です。このページは Atlassian・JetBrains のいずれとも提携しておらず、承認も受けていません。
ほかに:push したのに Pipelines が動かない · 「Container 'docker' exceeded memory limit.」 · 「Exceeded build time limit of 120 minutes」 · キャッシュが効かない · 「unexpected system error」 · 「command not found」 · サブモジュールを取ってこない · 「We couldn't clone the repository」 · 「No online runner available」 · 「No space left on device」 · 「Step exceeded processing limits」 · 次のステップにアーティファクトが無い · 前は通ったビルドが今は落ちる · Build setup に時間がかかる · ビルド時間を使い切った · 「Permission denied to update branch」 · 「You have reached your pull rate limit」(Docker Hub) · 「There is an error in your bitbucket-pipelines.yml」 · 「This pipeline was paused」(デプロイ) · IntelliJ IDEA の Bitbucket Pipelines 用プラグインの比較 · English