Bitbucket Pipelines の「No space left on device」
ステップのコマンドが tar: …: Cannot write: No space left on device のような行で止まり、ステップが失敗します。コマンドを動かしたマシンのディスクが一杯です。最初に見るのは、それがどのマシンだったかです:セルフホストのランナーのホスト、Atlassian のビルドのマシン、パイプがログインした別のサーバー。
消す前に測る
失敗するコマンドの直前にこの行を入れ、パイプラインをもう一度動かします。df -h はつながっているディスクごとの埋まり具合を、du は取ってきた中身の大きさを出します:
script: - df -h - du -sh "$BITBUCKET_CLONE_DIR" - ./build.sh
セルフホストのランナーでは
ランナーは、ステップに要るものをホストの作業フォルダに取ってきます:リポジトリの中身と、そのステップのアーティファクトとキャッシュ。そこでホストの空きが尽きると、ステップは no space left on device で失敗し、Pipelines のログにもランナーの runner.log にも出ます(Atlassian の記事 Self-hosted runner failing with error "no space left on device")。作業フォルダは既定で、Linux の Docker のランナーなら /tmp、Linux のシェル・macOS・Windows のランナーなら、ランナーを展開したフォルダの中の temp です。
Linux か macOS のホストなら、df -h /tmp(またはランナーのフォルダ)で残りが分かります。そのうえで、要らない大きなファイルを消す、別のディスクへ移す、ディスクを大きくする、または大きいディスクの上にランナーの作業フォルダを移します:
- Linux の Docker のランナー:ボリュームと
WORKING_DIRECTORYを同じパスにして動かします(Set up runners for Linux):
docker run … \ -v /data/runner:/data/runner \ -e WORKING_DIRECTORY=/data/runner …
- Linux のシェル・macOS・Windows のランナー:ランナーを動かすコマンドに、フルパスを付けた
--workingDirectoryを足します(Atlassian の記事 Pipeline build failed with no space left on device error)。
Docker のランナーがどのフォルダを使っているか分からなければ、同じ記事の手順で、docker container ls でそのコンテナを見つけ、docker inspect -f '{{ .Mounts }}' <コンテナの ID> で載せているフォルダを、コンテナの中の env で WORKING_DIRECTORY を読みます。
Atlassian のマシンでは
Atlassian の Limitations of Bitbucket Pipelines は、ビルドの分数・Git LFS の容量・パイプラインあたりのステップの数を挙げていますが、今はビルドのディスクの大きさを書いていません。前の版は 5 GB と書いていて、ディスクを設定できるようにという開いたままの要望 BCLOUD-15343 がそれを引いています。小さくできるもの:
- Git LFS のファイル:ファイルの一番上に
clone: lfs: trueがあると、ステップごとに始めに全部を取ってきます。Atlassian の Git clone behavior は、要るステップだけで LFS を有効にするか、git lfs pull --include=…で要るファイルだけ取ることを勧めています。 - ステップ自身が書くもの:次の大きなコマンドの前に、もう要らないビルドの出力やダウンロードしたアーカイブを消します。ステップのファイルが次のステップに届くのは、アーティファクトかキャッシュとして取ってこられるときだけなので、渡す量を減らすと次のステップのディスクに余裕ができます。
パイプがコマンドを動かしたとき
atlassian/ssh-run のようなパイプは、コマンドを SSH で別のサーバーの上で動かし、そのサーバーのエラーがステップのログに出ます。コミュニティの質問では、ssh-run の中でこのメッセージで失敗した tar は、リモートのサーバーの空き不足で、そこを空けて直りました。Atlassian の担当者は、パイプの新しい版も勧めています。
IntelliJ IDEA で失敗したコマンドを見る
Pipeline Inbox for Bitbucket Pipelines は、Lesstep が作っている JetBrains IDE(2024.1 以降)のプラグインです。Bitbucket Cloud の全部のリポジトリのパイプラインを IDE のツールウィンドウに並べ、失敗したパイプラインでは、ステップが失敗したコマンドとその最後の数行を見せます。No space left on device の行と、それに当たったコマンドが、ログを開かずに見えます。ランナーの空きを作っただけなら、push する新しいコミットがありません。Pro なら Run again で、同じコミットを IDE からもう一度ビルドできます。一覧・ステップ・ログは無料。実行・やり直し・停止は Pro(月 US$1.50・30日の無料試用つき)。
Atlassian・Bitbucket・Bitbucket Pipelines は Atlassian の商標、Git は Software Freedom Conservancy の商標、Docker は Docker, Inc. の商標、Windows は Microsoft グループの商標、macOS は Apple Inc. の商標、IntelliJ IDEA は JetBrains s.r.o. の商標です。このページはそのいずれとも提携しておらず、承認も受けていません。
ほかに:「No online runner available」 · 「We couldn't clone the repository」 · サブモジュールを取ってこない · 「command not found」 · 「unexpected system error」 · キャッシュが効かない · push したのに Pipelines が動かない · 「Exceeded build time limit of 120 minutes」 · 「Container 'Build' exceeded memory limit.」 · 「Container 'docker' exceeded memory limit.」 · 「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