GitHub Actionsでアプリ配布時のリリースノート自動追加
毎回開発版アプリを配布する際に、手動で対応内容を記入するのは手間がかかります。
そこで、CIで自動配布する際に、リリースノートも自動的に取得できるようにします。
リリースノートの内容は、対象ブランチにマージされた各PRのタイトルです。
権限設定
GitHubのAPIを使用してリリースノートを取得します。まずは、APIリクエスト用のトークンを作成します。
対象リポジトリに権限を持つアカウントであれば、トークンを作成可能です。以下の画面で「repo」をチェックし、トークンの有効期限を設定します。
設定が完了したら、「Generate token」ボタンをクリックし、生成されたトークンを保存します。
jqでPRタイトルを取得
jqの使い方は公式サイトで確認できます。
プロジェクト内でtest_get_pr_title.sh
を作成し、以下のコードを入力します。
#!/bin/sh
# 外部から対象ブランチ名と権限トークンを取得
branch_name=$1
github_token=$2
# 上記パラメーターをチェック
if [ $# -ne 2 ]; then
echo "Usage: $0 <branch_name> <github_token>"
exit 1
fi
# releaseブランチの最後のコミット時刻を取得
# 目的は最新作業ブランチへマージしたPRを取得するためです。
branch_creation_date=$(curl -s -H "Authorization: token $github_token" \
"https://api.github.com/repos/{github名}/{Repo名}/branches/release" | jq -r '.commit.commit.committer.date')
if [ "$branch_creation_date" == "null" ]; then
echo "Failed to fetch branch creation date. Please check the branch name."
exit 1
fi
echo "$branch_name branch created at: $branch_creation_date"
# jqで上記時刻より遅くマージされたPRを取得
curl -s -H "Authorization: token $github_token" \
-H "Accept: application/vnd.github.v3+json" \
"https://api.github.com/repos/{Githubアカウント名}/{Repo名}/pulls?state=closed&merged=true&base=${branch_name}" \
| jq -r --arg branch_creation_date "$branch_creation_date" '.[] | select(.merged_at > $branch_creation_date) | .title'
自分のチームでは、以下のようなブランチ運用ルールを採用しています。
各タスクブランチをメイン作業ブランチへマージする。
リリース後、メイン作業ブランチをreleaseブランチへマージする。
リリース内容を特定するために、最新の release ブランチのタイムスタンプを取得し、その時刻以降にメイン作業ブランチへマージされたPRを今回のリリース内容として扱います。
github actionsに利用する前に、まずローカル環境でPRタイトルを正しく取得できるか確認します。
github actionsのimage環境にはjqがあります。ローカル環境ではjqをインストールする必要があります。
以下のコマンドを実行して動作確認をしてみます。
動作確認が完了したら、GitHub ActionsのワークフローにPRタイトルを取得するステップを追加します。
{自分のパソコンのローカルパス}/test_get_pr_title.sh {対象ブランチ名} {先ほど生成したtoken}
actionsでPRタイトル取得ステップ追加
特殊文字(フリガナや漢字)が直接GITHUB_ENV
に保存できない、base64エンコードをする必要があります。
GitHubの環境で走るの場合、{自分のパソコンのローカルパス}
を$GITHUB_WORKSPACE
に変更します。
サンプルコード
- name: Get PR Titles
run: |
PR_TITLE=$({自分のパソコンのローカルパス}/test_get_pr_title.sh {対象ブランチ名} {token}
PR_TITLE_ENCODED=$(echo -n "$PR_TITLE" | base64)
# 取得したPR_TITLE_ENCODEDをGITHUB_ENV環境変数として保存
echo "PR_TITLE_ENCODED=${PR_TITLE_ENCODED}" >> $GITHUB_ENV
- name: Use PR Title
run: |
PR_TITLE=$(echo "$PR_TITLE_ENCODED" | base64 --decode)
echo "The decoded PR title is: $PR_TITLE"
PRタイトルをfastlaneへ渡す
配布前に、Git環境からPRタイトルを取得し、firebase_app_distributionのrelease_notesにPRタイトルを追加します。
desc "Build and archive dev app"
lane :build_dev do
# git環境からPRタイトルを取得
pr_title_encoded = ENV['PR_TITLE_ENCODED']
pr_title = `echo #{pr_title_encoded} | base64 --decode`.strip
puts "Decoded PR Title: #{pr_title}"
以下略...
# 配布文言にPRタイトルを追加
firebase_app_distribution(
app: {firebase app id},
groups: {配布対象グループ},
release_notes: "配布文言\n\n#{pr_title}",
debug: true
)
end
FirebaseのリリースノートでPRタイトルを確認できます。
株式会社SKIYAKIのテックブログです。ファンクラブプラットフォームBitfanの開発・運用にまつわる知見や調べたことなどを発信します。主な技術スタックは Ruby on Rails / React / AWS / Swift / Kotlin などです。 recruit.skiyaki.com/
Discussion