Bitbucket Pipelines:思ったように動かない並列のステップ
parallel のグループは、中のステップを同時に動かします。結果は早く出ますが、ビルド時間は変わりません。ステップごとに数えるからです(ビルド時間(build minutes)を使い切った)。つまずくのは、グループの中の1つのステップがほかのステップに何をできて、何をできないかです。
- parallel:
steps:
- step:
name: Unit tests
script:
- ./unit-tests.sh
- step:
name: Integration tests
script:
- ./integration-tests.sh
1つが失敗しても、ほかのステップが走り続ける
Atlassian の 並行ステップ オプションによると、fail-fast の既定は false です。単体テストが1分で失敗しても、結合テストは最後まで走り、そのぶんのビルド時間を使います。1つが失敗したらグループごと止めるには、こう書きます。
- parallel:
fail-fast: true
steps:
- step:
name: Unit tests
script:
- ./unit-tests.sh
- step:
name: Upload metadata
fail-fast: false
script:
- ./upload-metadata.sh
fail-fast は1つのステップにも書けます。ステップに fail-fast: true と書くと、そのステップが失敗したときにグループが止まります。上の upload のように fail-fast: false と書いたステップは、失敗してもほかを止めません。
失敗してよいステップ、やり直させたいステップ
ステップ オプションの on-fail は、ステップにも、並列のグループにも、ステージにも書けます。
strategy: ignore:ステップは失敗と表示されますが、パイプラインはそれで失敗になりません。隣のテストを止めたくない lint のステップに向きます。strategy: retryとmaxRetryCount(1〜10、既定は1):ステップをもう一度動かします。グループに書くと全部のステップに効き、ステップごとに上書きもできます。
同じページの決まりが2つあります。fail-fast と一緒に使えるのは既定の strategy: fail だけで、そのステップか同じグループのどれかに fail-fast があると、ignore と retry は効かなくなります。また、on-fail はデプロイのステップには書けません。
ステップ間のファイルと変数
- 並列のステップが使えるのは、グループより前のステップのアーティファクトです。同じグループのほかのステップのものは使えません(次のステップにアーティファクトが無い)。
- グループのあとのステップには、全部のステップのファイルがまとめて届きます。2つの並列のステップが同じパスにファイルを書くと、ファイルごとに、YAML であとに書いたステップのものが残ります。
- 並列のステップで書いた変数は、あとのどのステップにも渡りません(変数が空になる)。値を作るステップは、グループの前に置きます。
- 並列のステップはキャッシュを読めますが、保存はできません(キャッシュが効かない)。Atlassian は、最初のステップで依存をキャッシュしてから、テストを並列で動かすよう勧めています。
テストをステップに分ける
グループのステップには、0から数えた自分の位置の BITBUCKET_PARALLEL_STEP と、ステップの数の BITBUCKET_PARALLEL_STEP_COUNT があります。テストのファイルを各ステップに割り振る書き方の一例です。
script:
- files=$(find tests -name '*_test.py' | sort | awk -v n="$BITBUCKET_PARALLEL_STEP_COUNT" -v i="$BITBUCKET_PARALLEL_STEP" 'NR % n == i')
- '[ -n "$files" ] || exit 0'
- pytest $files
GNU Awk 5.3 で、7つのテストのファイルを2つと3つのステップに分けて試すと、どのファイルもちょうど1つのステップに入りました。sort は、どのステップでも並びを同じにするためです。空かどうかの確かめは、ファイルよりステップが多いときに効きます。pytest はファイル名が無いと、全部のテストを動かします。
上限
- 1つのパイプラインのステップは100個までで、並列のグループの中のステップも1つずつ数えます。
- 1つの並列のグループに入れるデプロイの環境は、全部同じ種類にします。本番とテストを同じグループに混ぜられません。
- ワークスペース全体で同時に動かせるステップの数にも上限があります。並行ステップ オプションのページは、Standard と Premium で600、Free で10とし、超えたステップは失敗すると書いています。Atlassian の記事 "Seems like you're running a lot of pipelines at the same time" error message(英語・2025年9月26日更新)は、並列のステップも含めて100としています。
上限に当たったビルドに出るのは、この記事の文面です。
Seems like you're running a lot of pipelines at the same time. This is usually due to an accidental push. To conserve your minutes, we won't run them all.
1回の push に5つを超えるブランチやタグがあるときと同じ文面です(push したのにパイプラインが動かない)。文面が同じ件は、Atlassian のバグ BCLOUD-22077(英語)として2022年8月から未解決です。記事の直し方は、思ったより多くビルドを動かしているリポジトリが無いかを見ることと、並列が要らないビルドの並列をやめることです。
並列のステップを1つずつ動かすセルフホストのランナー
Atlassian の記事 Restoring Parallel Step Execution in Bitbucket Pipeline after self hosted runner upgrade(英語・2026年2月17日更新)によると、ランナーの 5.x からは、ランナーで同時に動くステップの数をプランが決めます。Standard は1つ、Premium は2つで、ランナーをいくつ登録しても変わりません。ほかのステップは順番待ちになります。記事は、ビルドの枠を買い足すか上のプランにすることを挙げ、3.x のランナーのイメージに戻す手順も書いています。また、ステージの中の並列のステップはランナーでは使えないとしています。
IntelliJ IDEA で Bitbucket Pipelines を見る
Pipeline Inbox for Bitbucket Pipelines は、Lesstep が作っている JetBrains IDE(2024.1 以降)のプラグインです。Bitbucket Cloud の全部のリポジトリのパイプラインを IDE のツールウィンドウに並べ、ステップ、失敗したステップと止まったコマンド、Bitbucket が書くそばから伸びるステップのログを見せます。一覧・ステップ・ログは無料。パイプラインの実行・やり直し・停止は Pro(月 US$1.50・30日の無料試用つき)。
Atlassian・Bitbucket・Bitbucket Pipelines は Atlassian の商標、IntelliJ IDEA は JetBrains s.r.o. の商標です。このページは Atlassian・JetBrains のいずれとも提携しておらず、承認も受けていません。
ほかに:condition: changesets で飛ばされるステップ(includePaths) · Git LFS のファイルがポインターのまま届く・ステップからの LFS の push · 浅いクローンで止まる Git のコマンド(origin/main・git describe) · スケジュールしたパイプラインが動かない · 「Container 'build' failed to pull image」 · サービスに「Connection refused」(MySQL・PostgreSQL・Redis) · 「Not authorized to perform sts:AssumeRoleWithWebIdentity」(OIDC で AWS) · テストの結果が出ない · 変数が空になる · 「Host key verification failed」(SSH) · 「Cannot connect to the Docker daemon」 · 「authorization denied by plugin pipelines」(Docker) · 「Container 'docker' exceeded memory limit.」 · push したのに Pipelines が動かない · 「Container 'Build' 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