Skip to main content
Skip to content

スタックされたプル要求に対する CI の最適化

ワークフロー GitHub Actions スタックに対して実行する方法、ワークフロー内のスタック メタデータにアクセスする方法、冗長な CI 使用率を減らす方法について説明します。

メモ

この機能はパブリック プレビュー段階であり、変更される可能性があります。

スタック内のすべてのプル要求は、 mainなど、スタックのベースを対象とするように評価されます。 これにより、すべてのレイヤーで品質の一貫性が保たれますが、1 つのスタックに対してワークフローを何度も実行できることも意味します。 この記事では、スタックに対してワークフローを実行する方法と、冗長な CI 使用量を減らす方法について説明します。

スタックに対してワークフローを実行する方法

GitHub アクション ワークフローは、スタック内の各プル要求がスタックのベースをターゲットにしているかのようにトリガーされます。 mainを対象とするpull_requestイベントで実行するように構成されたワークフローは、一番下のプル要求だけでなく、スタック内のすべてのプル要求に対して実行されるため、スタック全体でチェックを実行するためにワークフローの変更は必要ありません。

ワークフローはプルリクエストごとに1回実行されるため、スタックが大きいほどCIの使用量が増えます。 ただし、スタック メタデータを使用して、コストの高いジョブを必要な場所でのみ実行できます。

スタック メタデータへのアクセス

スタック メタデータは、 github.event.pull_request.stackを介してワークフロー式で使用できます。 このプロパティは、プル要求がスタックに属している場合にのみ存在するため、フィールドを読み取る前にワークフローでフィルター処理を行ってください。

ExpressionDescription
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.refgithub.event.pull_request.base.refと等しくなります。
  • 上位プル要求 — スタック内の最後のプル要求。変更の完全なセットが含まれます。 これは、 github.event.pull_request.stack.positiongithub.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"

プル リクエストは下から順にマージされるため、最も下にある未マージのプル リクエストが変更されます。 一番下のプル要求が到着すると、次のプル要求はスタック ベースを直接ターゲットにするようにリベースされるため、次のワークフロー実行で新しい最下位のマージされていないプル要求になります。

また、 github.event.pull_request.stack.position == 1を使用して元のボトム プル要求にゲートを適用したり、 positionを使用して特定のレイヤーでゲートすることもできます。