メモ
この機能はパブリック プレビュー段階であり、変更される可能性があります。
スタック内のすべてのプル要求は、 mainなど、スタックのベースを対象とするように評価されます。 これにより、すべてのレイヤーで品質の一貫性が保たれますが、1 つのスタックに対してワークフローを何度も実行できることも意味します。 この記事では、スタックに対してワークフローを実行する方法と、冗長な CI 使用量を減らす方法について説明します。
スタックに対してワークフローを実行する方法
GitHub アクション ワークフローは、スタック内の各プル要求がスタックのベースをターゲットにしているかのようにトリガーされます。
mainを対象とするpull_requestイベントで実行するように構成されたワークフローは、一番下のプル要求だけでなく、スタック内のすべてのプル要求に対して実行されるため、スタック全体でチェックを実行するためにワークフローの変更は必要ありません。
ワークフローはプル要求ごとに 1 回実行されるため、大きなスタックによって CI 使用率が乗算されます。 ただし、スタック メタデータを使用して、コストの高いジョブを必要な場所でのみ実行できます。
スタック メタデータへのアクセス
スタック メタデータは、 github.event.pull_request.stackを介してワークフロー式で使用できます。 このプロパティは、プル要求がスタックに属している場合にのみ存在するため、フィールドを読み取る前にワークフローでフィルター処理を行ってください。
| Expression | Description |
|---|---|
github.event.pull_request.stack.number | リポジトリにスコープが設定されたスタックの番号。 |
github.event.pull_request.stack.size | スタック内のプル要求の合計数。 |
github.event.pull_request.stack.position | スタック内でのこのプル要求の 1 から始まる位置 (1 は下部)。 |
github.event.pull_request.stack.base.ref | スタック全体が最終的にターゲットとする分岐 ( mainなど)。 |
github.event.pull_request.stack.base.sha | スタックのベース ブランチの HEAD SHA。 |
たとえば、次のワークフローは、スタック メタデータを読み取り、名前が release/ で始まるブランチをスタックが対象とする場合にのみ、2 番目のステップを実行します。
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- name: Show stack info
if: github.event.pull_request.stack != null
run: |
echo "Stack base ref: ${{ github.event.pull_request.stack.base.ref }}"
echo "PR ${{ github.event.pull_request.stack.position }} of ${{ github.event.pull_request.stack.size }} in the stack"
- name: Run only when the stack targets a release branch
if: github.event.pull_request.stack != null && startsWith(github.event.pull_request.stack.base.ref, 'release/')
run: echo "This stack targets a release branch"
CI 使用量の削減
ワークフローはスタック内のすべてのプル要求に対して実行されるため、 stack フィールドを使用して、重要な位置でのみ高価なジョブを実行できます。 次の 2 つの条件が特に便利です。
- 結合されていない最も低いプル要求 — 現在残りのスタックの一番下にあるプル要求。 スタック ベースを直接対象とするため、
github.event.pull_request.stack.base.refはgithub.event.pull_request.base.refと等しくなります。 - 上位プル要求 — スタック内の最後のプル要求。変更の完全なセットが含まれます。 これは、
github.event.pull_request.stack.positionがgithub.event.pull_request.stack.size等しい pull request です。
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- name: Run for the lowest unmerged pull request in the stack
if: github.event.pull_request.stack != null && github.event.pull_request.stack.base.ref == github.event.pull_request.base.ref
run: echo "Lowest unmerged pull request in the stack"
- name: Run for the top pull request in the stack
if: github.event.pull_request.stack != null && github.event.pull_request.stack.position == github.event.pull_request.stack.size
run: echo "Top pull request in the stack"
pull requests merge from the bottom up, the lowest unmerged pull request changes. 一番下のプル要求が到着すると、次のプル要求はスタック ベースを直接ターゲットにするようにリベースされるため、次のワークフロー実行で新しい最下位のマージされていないプル要求になります。
また、 github.event.pull_request.stack.position == 1を使用して元のボトム プル要求にゲートを適用したり、 positionを使用して特定のレイヤーでゲートすることもできます。