🔄
GitHub Actionsでリリースブランチ・PRの自動生成をやる
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を使っています。
差分が必ずある場合は以下のようなアプリを使うと便利!
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 }}"
- Slack通知には公式のGitHub Actionを利用しています。
https://github.com/marketplace/actions/slack-send-to-slack
実際はこんな感じに通知されます。
PRにはタグを付けたりするのもよさそう!!
Discussion