❄️

GitHub Actionsでアプリ配布時のリリースノート自動追加

2024/12/21に公開

毎回開発版アプリを配布する際に、手動で対応内容を記入するのは手間がかかります。
そこで、CIで自動配布する際に、リリースノートも自動的に取得できるようにします。

リリースノートの内容は、対象ブランチにマージされた各PRのタイトルです。

権限設定

GitHubのAPIを使用してリリースノートを取得します。まずは、APIリクエスト用のトークンを作成します。

対象リポジトリに権限を持つアカウントであれば、トークンを作成可能です。以下の画面で「repo」をチェックし、トークンの有効期限を設定します。
https://github.com/settings/tokens

設定が完了したら、「Generate token」ボタンをクリックし、生成されたトークンを保存します。

jqでPRタイトルを取得

jqの使い方は公式サイトで確認できます。
https://jqlang.github.io/jq/tutorial/

プロジェクト内で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 Tech Blog

Discussion