Bitbucket Pipelines:キャッシュが効かない
bitbucket-pipelines.yml に caches を足したのに、毎回のビルドが全部をダウンロードし直す。Bitbucket がキャッシュを保存するのはいくつかの条件がそろったときだけで、保存しなかった理由はステップのログに書いてあります。まずそこを見て、下の原因と照らします。
どこを見るか
- リポジトリの Pipelines のページ、右上の近く、Schedules と Usage の間の Caches ボタン:Bitbucket が持っているキャッシュの一覧です。自分のキャッシュが無ければ、一度も保存されていません。
- キャッシュを作るはずだったステップ:ログの最後の Build teardown を開きます。ステップが失敗した・空だった・大きさの上限を超えた、のどれでアップロードしなかったかが書いてあります。
キャッシュが効かない7つの理由
Atlassian の記事(Pipeline build cache-related issues)と caches のページから:
- 足してから、成功したステップがまだ無い。キャッシュは成功したステップの後にだけ保存されます。失敗したステップは何もアップロードしません。
- 圧縮して 1 GB を超えている。それより大きいキャッシュは保存されません。ディレクトリを2つ以上のキャッシュに分けます。
- 空。道具が、書いた場所とは別の所に入れています。入れるコマンドの後に
ls -lah <キャッシュのディレクトリ>を足して中身を見て、本当のディレクトリを指します。 - 期限が切れた。キャッシュは1週間で消えます。次に成功したステップが、新しく保存します。
- 固定のキャッシュで、依存が変わった。パスだけで書いたキャッシュや定義済みのキャッシュは、依存が変わると使われも更新もされません。Docker のキャッシュでは、
Dockerfileが変わると同じことが起きます(レイヤーが合わなくなる)。Caches から消すか、ファイルを鍵にします(下)。 - Docker のキャッシュを Runtime v3 のステップで使っている。定義済みの Docker キャッシュは、そこでは廃止されています。teardown に「Docker cache upload is not supported in this environment」と出ます。Docker の buildx のキャッシュを使います。
- Docker のキャッシュを前の実行環境で使っている。既知のバグ(BCLOUD-23193)で、いつも使われるとは限りません。直るまでは、そのステップを Runtime v3 にして buildx のキャッシュを使うよう、Atlassian は勧めています。
caches のページにある上限があと2つ:並列のステップはキャッシュを読めても書けません。キャッシュはいつ消えてもおかしくないので、ビルドはキャッシュ無しでも通るようにしておきます。
定義済みのキャッシュと、その中身
| 名前 | ディレクトリ |
|---|---|
node | node_modules |
composer | ~/.composer/cache |
maven | ~/.m2/repository |
gradle | ~/.gradle/caches |
pip | ~/.cache/pip |
dotnetcore | ~/.nuget/packages |
ivy2 | ~/.ivy2/cache |
docker | /var/lib/docker |
一覧に無い道具や、別の場所に入れる道具には、definitions に自分のキャッシュを書きます。たとえば ~/.npm や ~/.cache/Cypress。
ロックファイルに合わせて変わるキャッシュ
ファイルを鍵にすると、そのファイルが変わったときに Pipelines がキャッシュの新しい版を作るので、古い依存を使い続けません:
definitions:
caches:
npm-deps:
key:
files:
- package-lock.json
path: node_modules
pipelines:
default:
- step:
caches:
- npm-deps
script:
- npm ci
- npm test
手でやり直すには、キャッシュの名前を変える(npm-deps-v2)か、Caches ボタンから消します。
ビルドの時間を IntelliJ IDEA で見る
Pipeline Inbox for Bitbucket Pipelines は、Lesstep が作っている JetBrains IDE(2024.1 以降)のプラグインです。Bitbucket Cloud の全部のリポジトリのパイプラインを IDE のツールウィンドウに並べ、ステップごとの時間、パイプラインのビルド時間(build minutes)、teardown まで含めたステップのログを見せるので、キャッシュが保存されたか、次のビルドが速くなったかが分かります。一覧・ステップ・ログは無料。実行・やり直し・停止は Pro(月 US$1.50・30日の無料試用つき)。
Atlassian・Bitbucket・Bitbucket Pipelines は Atlassian の商標、Docker は Docker, Inc. の商標、IntelliJ IDEA は JetBrains s.r.o. の商標です。このページは Atlassian・Docker・JetBrains のいずれとも提携しておらず、承認も受けていません。
ほかに:push したのに Pipelines が動かない · 「Exceeded build time limit of 120 minutes」 · 「Container 'Build' exceeded memory limit.」 · 「Container 'docker' exceeded memory limit.」 · 「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