📖

GitHub Actions: 特定のブランチパターンのマージ時にワークフローを実行する方法

に公開

はじめに

GitHub Actionsを使用して、特定のパターンのブランチが特定のブランチにマージされた時だけワークフローを実行する方法を解説します。今回は「feature-」から始まるブランチ名からmainブランチへのマージをトリガーとするケースを例に説明します。

ワークフロー設定の解説

まず、完全なワークフロー設定を見てみましょう:

name: Branch Merge Workflow
on:
  pull_request:
    branches:
      - "main"
    types: [closed]
jobs:
  check-should-run:
    runs-on: ubuntu-latest
    outputs:
      should_run: ${{ steps.check.outputs.should_run }}
    steps:
      - name: Check should run
        id: check
        run: |
          if [[ "${{ github.event.pull_request.merged }}" == "true" && \
                "${{ startsWith(github.head_ref, 'feature-') }}" == "true" && \
                "${{ github.base_ref }}" == "main" ]]; then
            echo "should_run=true" >> $GITHUB_OUTPUT
          else
            echo "should_run=false" >> $GITHUB_OUTPUT
          fi

重要なポイントの解説

  1. トリガー条件の設定

    on:
      pull_request:
        branches:
          - "main"
        types: [closed]
    
    • pull_requestイベントをトリガーとして使用
    • mainブランチへのPRが対象
    • types: [closed]でPRがクローズされた時のみ実行
  2. 実行環境の設定

    runs-on: ubuntu-latest
    
    • GitHub提供の標準的なUbuntuランナーを使用
  3. 条件チェックの実装

    if [[ "${{ github.event.pull_request.merged }}" == "true" && \
          "${{ startsWith(github.head_ref, 'feature-') }}" == "true" && \
          "${{ github.base_ref }}" == "main" ]]; then
    
    • github.event.pull_request.merged: PRがマージされたかチェック
    • startsWith(github.head_ref, 'feature-'): ブランチ名が"feature-"で始まるかチェック
    • github.base_ref: マージ先が"main"かチェック
  4. 出力の設定

    outputs:
      should_run: ${{ steps.check.outputs.should_run }}
    
    • 条件に合致した場合はtrue、そうでない場合はfalseを出力
    • この出力は後続のジョブで条件分岐に使用可能

使用方法

  1. このワークフローファイルを.github/workflows/ディレクトリに配置します(例:branch-merge-workflow.yml

  2. ブランチ名の例:

    • feature-add-login → main
    • feature-update-ui → main
    • bugfix-xyz → main(実行されない)
    • feature-add-login → staging(実行されない)

カスタマイズのポイント

  1. ブランチ名のプレフィックス変更

    "${{ startsWith(github.head_ref, 'your-prefix-') }}"
    
    • feature-を任意のプレフィックスに変更可能
  2. ターゲットブランチの変更

    branches:
      - "your-branch"
    
    • mainを任意のブランチ名に変更可能
  3. ランナーの変更

    runs-on: your-runner
    
    • 必要に応じて適切なランナーを選択

後続ジョブの例

  next-job:
    needs: check-should-run
    if: needs.check-should-run.outputs.should_run == 'true'
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v2

まとめ

このワークフローを使用することで:

  • 特定のパターンのブランチからのマージのみを検知
  • 不要なワークフロー実行を防止
  • 後続ジョブの制御が可能

カスタマイズ可能な部分を適切に設定することで、様々なワークフローに対応できます。

Discussion