🌐

GitHub Actionsを活用してアプリバージョンの更新とPR・リリースドラフト作成を行う方法

2024/05/15に公開

概要

GitHub Actionsは、GitHubのリポジトリ内にある .github/workflows ディレクトリに配置されたYAMLファイルを通じて自動化されたプロセスを実行する機能です。
これらのワークフローは、特定のイベントに基づいて自動的に、または手動でトリガーすることが可能です。

この記事では、GitHub Actionsを利用して、手動トリガー(workflow_dispatch) にてアプリのバージョンを自動で更新し、プルリクエストとリリースドラフトを作成するワークフローを設計する方法を紹介します。

実装

GitHub Actionsを用いてアプリのバージョンを自動的に更新し、関連するプルリクエストとリリースドラフトを作成するプロセスは以下の通りです。

ステップ1: ワークフローファイルの作成
まず、GitHubリポジトリ内の .github/workflows ディレクトリに新しいワークフローファイルを作成します。
ここでは、ファイル名を app-release-version-automation.yml とします。

ステップ2: app-release-version-automation.ymlの実装
サンプルコードとその詳細な解説は以下のセクションに掲載しています。
このコードには、アプリのバージョンを更新し、新しいリリースブランチを作成し、リリースドラフトを作成し、最終的にプルリクエストを生成する手順が含まれています。

ステップ3: アクセス権限の確認
GitHubリポジトリの設定にアクセスし、Settings > Actions > General の Workflow permissions セクションで以下の設定が行われていることを確認してください。

  • Read and write permissions が選択されていること
  • Allow GitHub Actions to create and approve pull requests にチェックが入っていること

これらの設定で権限を許可しておかないと、Workflowの実行に失敗しますので実行前には確認しておくことをお勧めします。

上記のステップを踏むことで、Actionsに作成したWorkflowが表示され実行できるようになります。
以下実行した際にできたPRなどです。


このようにバージョンの変更を自動で行ってくれます。


同時にRelesesも作成してくれます。


バージョン変更行ったPRを新たにブランチを切って作成してくれます。

サンプルコード

以下に示すのは、GitHub Actionsを使用してアプリのバージョンを更新し、リリース準備のための一連の自動化ステップを実行するためのYAMLファイルのサンプルです。
このワークフローは、workflow_dispatchにより手動でトリガーされ、バージョン更新、リリースブランチの作成、リリースドラフトの生成、およびプルリクエストの作成を行います。

name: App Release Version Automation

on:
  workflow_dispatch:
    inputs:
      version:
        description: 'Input version number'
        required: true

jobs:
  app-release-version-automation:
    runs-on: macos-latest
    steps:
      - name: Check out code
        uses: actions/checkout@v3
        with:
          fetch-depth: 0

      - name: Create Release Branch
        run: |
          git checkout -b release/v${{ github.event.inputs.version }}
          git push origin release/v${{ github.event.inputs.version }}

      - name: App Version Update
        run: |
          # Update the app version in Xcode project file
          sed -i '' 's/MARKETING_VERSION = .*;/MARKETING_VERSION = ${{ github.event.inputs.version }};/g' ./XcodeProject/MyApp/project.pbxproj
          git add ./XcodeProject/MyApp/project.pbxproj
          git commit -m "Update MARKETING_VERSION to ${{ github.event.inputs.version }}"
          git push origin release/v${{ github.event.inputs.version }}

      - name: Create Release
        run: |
          # Create a draft release on GitHub
          curl -X POST \
            -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \
            -H "Accept: application/vnd.github.v3+json" \
            -d '{"tag_name":"v${{ github.event.inputs.version }}","name":"Release v${{ github.event.inputs.version }}","body":"Release description here","draft":true,"prerelease":false}' \
            "https://api.github.com/repos/${{ github.repository }}/releases"

      - name: Create Pull Request
        run: |
          # Automatically create a pull request to the main branch
          PR_DATA=$(curl -s -X POST \
            -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \
            -H "Accept: application/vnd.github.v3+json" \
            -d '{"head":"release/v${{ github.event.inputs.version }}","base":"main","title":"[Release v${{ github.event.inputs.version }}]","body":"Automatically created PR"}' \
            "https://api.github.com/repos/${{ github.repository }}/pulls")
          echo "Pull Request Created: $PR_DATA"


このサンプルコードは、GitHub Actionsのワークフローを使用して以下のタスクを自動化します。

  1. コードのチェックアウト: リポジトリから最新のコードを取得します。
  2. リリースブランチの作成: 新しいバージョン番号を用いてリリース用のブランチを作成し、GitHubにプッシュします。
  3. バージョン情報の更新: project.pbxprojファイル内のバージョン情報を更新します。
  4. リリースの作成: 新しいバージョンに基づいてGitHubリリースをドラフトとして作成します。
  5. プルリクエストの作成: 更新されたリリースブランチからmainブランチへのプルリクエストを作成します。
    各ステップについては以下の通りです。

Create Release Branch

  • git checkout -b コマンドは、新しいブランチを作成してそこにチェックアウトするために使用されます。ここで ${{ github.event.inputs.version }} は、ワークフローを手動でトリガーする際にユーザーが入力するバージョン番号を指します。この値を用いて、例えば release/v1.2 のようなブランチ名が動的に生成されます。
  • git push origin release/v${{ github.event.inputs.version }} コマンドは、新しく作成したリリースブランチをGitHubのリモートリポジトリにプッシュします。これにより、リリースプロセスに必要なすべての変更がリモートに保存され、他の開発者がアクセスできるようになります。

App Version Update

このステップでは、アプリのバージョン番号を更新しています。
ここではproject.pbxproj 内の MARKETING_VERSION を更新します。

  • sed -i '' 's/MARKETING_VERSION = .*;/MARKETING_VERSION = ${{ github.event.inputs.version }};/g' ./XcodeProject/MyApp/project.pbxproj:
    このsedコマンドは、project.pbxprojファイル内のMARKETING_VERSIONエントリを検索し、ユーザーが入力した新しいバージョン番号で置き換えます。sedはストリームエディタで、テキストファイル内の文字列をパターンマッチングを使って効率的に操作することができます。
    ※./XcodeProject/MyApp/project.pbxprojに部分は適時修正してください。pathがわからない場合はリポジトリ内でproject.pbxprojを検索してください。

  • git add、git commit、git push コマンド:
    更新されたプロジェクトファイルをステージング(git add)し、変更をコミット(git commit)して、その変更をリリースブランチにプッシュ(git push)します。

Create Release

  • curl -X POST: このコマンドは、HTTP POSTリクエストを実行し、データをGitHubのサーバーに送信します。
  • -H "Authorization: このヘッダーは、リクエストが認証されることを保証します。
    ${{ secrets.GITHUB_TOKEN }}は、GitHub Actionsが提供する自動化されたプロセスで使用するための安全な方法でアクセストークンを参照します。
  • -H "Accept: このヘッダーは、GitHub APIのバージョン3を使用することを指定し、応答がJSON形式であることを要求します。
  • -d '{"tag_name":"v${{ github.event.inputs.version }}","name":"Release v${{ github.event.inputs.version }}","body":"Release description here","draft":true,"prerelease":false}': このデータは、新しいリリースの詳細を指定します。バージョン番号でタグを設定し、リリース名を提供し、説明文を加え、ドラフトとしてマークします。

Create Pull Request

  • curl -s -X POST: このコマンドは、HTTP POSTリクエストを実行して、新しいプルリクエストを作成します。-sオプションは出力を最小限に抑えるために使用されます。
  • -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}": このヘッダーはリクエストの認証に使用され、適切なアクセス権を持つGitHubトークンが必要です。
  • -H "Accept: application/vnd.github.v3+json": このヘッダーはGitHub APIのv3バージョンを使用していることを示し、JSON形式でのデータ応答を要求します。
  • -d '{"head":"release/v${{ github.event.inputs.version }}","base":"main","title":"[Release v${{ github.event.inputs.version }}]","body":"Automatically created PR"}': このデータ部分はプルリクエストの詳細を定義して、どのブランチからどのブランチへのPRか、タイトル、ボディメッセージが指定されています。

最後に

以上GitHub Actionsを活用してアプリバージョンの自動更新とPR・リリースドラフト作成の自動化でした。
簡単に自動化できるので、気になりましたら是非部分的にでもお試しください。

Discussion