🔄

GitHub Actionsでリリースブランチ・PRの自動生成をやる

2025/01/19に公開

GitHub Flowを採用しているチームで、リリースブランチを作成する一部Git Flow的な運用を行っている。いろんな理由があってさ〜〜

で、リリースブランチを手動で作成する手間を省くため、自動化する仕組みを構築しました。
その方法をここに記録しておきます!

ワークフローの全貌

以下のGitHub Actionsを使って、リリースブランチを自動作成し、Pull Request(以下、PR)を作成するフローを構築しました。
ついでに、作成したリリースブランチとPRのURLをSlack通知します。

name: "Create PR"

on:
  workflow_dispatch: # 手動でトリガーして動作を確認するため
  schedule:
    - cron: '0 0 * * 1-4' # UTC時間で月曜から木曜の午前0時に実行

env:
  DEST_BRANCH: main

jobs:
  build:
    runs-on: ubuntu-latest
    timeout-minutes: 5

    steps:
      - name: Checkout
        uses: actions/checkout@v2

      - name: Set current datetime as env variable
        env:
          TZ: 'Asia/Tokyo'
        run: |
          echo "CURRENT_DATETIME=$(date +'%Y%m%d%H%M%S')" >> $GITHUB_ENV
          echo "CURRENT_DATE=$(date +'%Y-%m-%d')" >> $GITHUB_ENV
          
          # 月初1日or月末の最終日の場合はブランチ作成を行わない
          CURRENT_DAY=$(date +'%d')
          LAST_DAY=$(date -d "$(date +%Y-%m-01) +1 month -1 day" +'%d')

          if [ "$CURRENT_DAY" -eq 1 ] || [ "$CURRENT_DAY" -eq "$LAST_DAY" ]; then
            echo "月初1日or月末の最終日なのでリリースブランチ作成をスキップします"
            exit 0
          fi

      - name: Generate release branch name
        run: |
          echo "RELEASE_BRANCH=release/${{ env.CURRENT_DATETIME }}_auto" >> $GITHUB_ENV

      - name: Configure Git
        run: |
          git config user.name "github-actions[bot]"
          git config user.email "github-actions[bot]@users.noreply.github.com"

      - name: Create and push a new branch
        run: |
          git switch -c ${{ env.RELEASE_BRANCH }}
          git commit --allow-empty -m "chore: Empty commit for PR creation"
          git push origin ${{ env.RELEASE_BRANCH }}

      - name: Create pull request using GitHub CLI
        run: |
          PR_URL=$(gh pr create \
            --title "${{ env.CURRENT_DATE }} リリースブランチ" \
            --body "このブランチは、GitHub Actionsのワークフローで自動生成されました。" \
            --base ${{ env.DEST_BRANCH }} \
            --head ${{ env.RELEASE_BRANCH }})
          
          echo "PR_URL=$PR_URL" >> $GITHUB_ENV
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

      - name: Post a message in a channel
        uses: slackapi/slack-github-action@v2.0.0
        with:
          webhook: ${{ secrets.SLACK_WEBHOOK_URL }}
          webhook-type: incoming-webhook
          payload: |
            text: "GitHub Action Notification"
            blocks:
              - type: "section"
                text:
                  type: "mrkdwn"
                  text: ":bookmark_tabs: *Release Branch:* `${{ env.RELEASE_BRANCH }}`"
              - type: "section"
                text:
                  type: "mrkdwn"
                  text: ":link: *PR URL:* ${{ env.PR_URL }}"

各ステップの説明

ブランチ名とPRタイトルに利用する日付を取得

      - name: Set current datetime as env variable
        env:
          TZ: 'Asia/Tokyo'
        run: |
          echo "CURRENT_DATETIME=$(date +'%Y%m%d%H%M%S')" >> $GITHUB_ENV
          echo "CURRENT_DATE=$(date +'%Y-%m-%d')" >> $GITHUB_ENV
          
          # 月初1日or月末の最終日の場合はブランチ作成を行わない
          CURRENT_DAY=$(date +'%d')
          LAST_DAY=$(date -d "$(date +%Y-%m-01) +1 month -1 day" +'%d')

          if [ "$CURRENT_DAY" -eq 1 ] || [ "$CURRENT_DAY" -eq "$LAST_DAY" ]; then
            echo "月初1日or月末の最終日なのでリリースブランチ作成をスキップします"
            exit 0
          fi
  • ポイント
    月初(1日)と月末(最終日)はリリースしないルールを設けているため、この条件で処理を終了する仕組みを組み込んでいます。

リリースブランチの作成

      - name: Configure Git
        run: |
          git config user.name "github-actions[bot]"
          git config user.email "github-actions[bot]@users.noreply.github.com"

      - name: Create and push a new branch
        run: |
          git switch -c ${{ env.RELEASE_BRANCH }}
          git commit --allow-empty -m "chore: Empty commit for PR creation"
          git push origin ${{ env.RELEASE_BRANCH }}
  • ポイント
    GitHub Flowでは、通常、リリースブランチ作成時点でmainとの差分がないです。そのため、PR作成のために空コミットを追加しています。
git commit --allow-empty -m "chore: Empty commit for PR creation"

PRの作成

      - name: Create pull request using GitHub CLI
        run: |
          PR_URL=$(gh pr create \
            --title "${{ env.CURRENT_DATE }} リリースブランチ" \
            --body "このブランチは、GitHub Actionsのワークフローで自動生成されました。" \
            --base ${{ env.DEST_BRANCH }} \
            --head ${{ env.RELEASE_BRANCH }})
          
          echo "PR_URL=$PR_URL" >> $GITHUB_ENV
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
  • ポイント
    GitHub CLIを利用してPRを作成。
    Marketplaceで公開されているPR作成ツールは、マージ先と差分がない場合はPR作成をしてくれないものが多かったのでCLIを使っています。

差分が必ずある場合は以下のようなアプリを使うと便利!
https://github.com/marketplace/actions/create-pull-request

Slack通知

      - name: Post a message in a channel
        uses: slackapi/slack-github-action@v2.0.0
        with:
          webhook: ${{ secrets.SLACK_WEBHOOK_URL }}
          webhook-type: incoming-webhook
          payload: |
            text: "GitHub Action Notification"
            blocks:
              - type: "section"
                text:
                  type: "mrkdwn"
                  text: ":bookmark_tabs: *Release Branch:* `${{ env.RELEASE_BRANCH }}`"
              - type: "section"
                text:
                  type: "mrkdwn"
                  text: ":link: *PR URL:* ${{ env.PR_URL }}"

実際はこんな感じに通知されます。


PRにはタグを付けたりするのもよさそう!!

Discussion