Bitbucket Pipelines:condition: changesets で飛ばされるステップ
condition: changesets: を付けたステップは、変わったファイルがパターンに合うときだけ動きます。合わないと、Pipelines はそのステップを失敗ではなく Skipped にして、パイプラインを先へ進めます(Atlassian の Dynamic step conditions・英語)。つまずくのは、Pipelines がどの変更を数えるかです。
- step:
name: Test API
condition:
changesets:
includePaths:
- "services/api/**"
script:
- cd services/api && npm test
ブランチのビルドが見るのは最後のコミットだけ
Atlassian のステップ オプションのページによると、プルリクエストのパイプラインでは全部のコミットを数え、ほかのパイプラインでは最後のコミットだけを見ます。3つのコミットをまとめて push して、services/api/ に触れたのが1つ目だけなら、上のステップは飛ばされます。
Git 2.53 で、そういうブランチを作りました。services/api/app.js を変えるコミット、docs/ のコミット、README.md のコミットの順です。1つ前のコミットと比べると、出てくるのは最後の1つだけでした。
$ git diff --name-only HEAD~1 README.md
同じページは、裏返しの注意も書いています。失敗しているパイプラインが、次の実行で失敗のステップが飛ばされたというだけで緑になることがあります。あるコミットで API のテストが壊れてステップが失敗し、次のコミットはドキュメントだけ。するとステップは飛ばされ、API は壊れたままなのにパイプラインは緑です。
push の全部のコミットを数えてほしいという要望は BCLOUD-20648(英語)で、2020年12月からの提案が、まだ賛同を集めている段階です。重複として閉じられた BCLOUD-22212(英語)には、コミットを1つずつ push するという回避策が書かれています。
Dynamic step conditions のページには、ほかに2つあります。リポジトリの最初のコミットでは全部のファイルが変わった扱いになり、プルリクエストのパイプラインでは宛先のブランチと比べます。
main との違いを自分のステップで調べる
機能ブランチなら、最初のステップで main から分かれたあとの変更を調べ、その答えを次へ渡せます。値を次のステップへ運ぶのは変数の共有(英語)で、それを state の条件で読みます。
pipelines:
branches:
'feature/*':
- step:
name: Detect changes
script:
- git fetch origin "+refs/heads/main:refs/remotes/origin/main"
- |
if git diff --name-only origin/main...HEAD | grep -q '^services/api/'; then
echo "API_CHANGED=true" >> $BITBUCKET_PIPELINES_VARIABLES_PATH
fi
output-variables:
- API_CHANGED
- step:
name: Test API
condition:
state: API_CHANGED == true
script:
- cd services/api && npm test
試したブランチでは、3点の diff に3つのファイルが全部並び、API_CHANGED=true になりました。git fetch の行は、ステップのクローンに origin/main が無いためです。ブランチが main から分かれたのが50コミットより前だと、diff は「no merge base」で止まります(浅いクローンで止まる Git のコマンド)。
調べるステップは parallel の中に入れず、条件も付けません。並列のステップで書いた変数はあとのステップへ渡らず、飛ばされたステップは何も書かないので、読む側には空の値が届きます。
いつまでも合わないパターン
- パターンは
$BITBUCKET_CLONE_DIR、つまりリポジトリの一番上からの相対です。Atlassian の例は、先頭に/も./も付けていません。 "path1/*.xml"に合うのはpath1の直下のファイルだけで、"path2/**"はその下のどの深さのファイルにも合います(Atlassian の例のコメント)。- パターンは Atlassian と同じく、全部を引用符で囲みます。YAML では
*で始まる値はエイリアスとして読まれ、引用符なしの- **/*.tsで js-yaml はunidentified alias "*/*.ts"と止まりました。 includePathsとexcludePathsは、同じステップやステージに一緒には書けません(Atlassian の 2025年6月の excludePaths の告知・英語)。excludePathsでは、変わったファイルが全部リストに入るとステップが飛ばされます。- 1つの条件に書ける
includePathsは50個までです。
条件を調べるタイミング
ステップ オプションのページによると、自動で始まるステップは、1つ前のステップが終わったときです。手動のステップは、条件が changesets だけなら始められる状態になったとき、state の条件があれば Run か Deploy が押されたときです。やり直しの設定(retry)があるステップは、やり直すたびに調べ直します。止まった(halted)ステップを再開するときは、調べ直しません。
飛ばされたステップが残さないもの
Dynamic step conditions のページによると、飛ばされたステップはビルドの時間を使わず、アーティファクトも出力の変数も作りません。飛ばされたステップが作るはずだったファイルを待つあとのステップは、自分のコードとは関係のない理由で失敗します。
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 のいずれとも提携しておらず、承認も受けていません。
ほかに: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」(デプロイ) · 1つが失敗しても走り続ける並列のステップ(fail-fast) · IntelliJ IDEA の Bitbucket Pipelines 用プラグインの比較 · English