GitHub ActionsでPull Requestの作成者を自動アサインする方法

## はじめに

GitHubでのPull Request（PR）の作成者を自動的にアサインする方法をまとめています。

## 実装までの試行錯誤

### 1. 実装で発生したエラーと解決策
初期実装では以下の問題が発生しました

問題点
* GITHUB_EVENT_PATHからPR情報を直接取得しようとしていた
* permissionsの設定が不足していた

改善点
* GitHub Contextを使用してPR情報を取得するように変更
* permissionsブロックで権限を明示的に設定

### 2. ワークフロー実行の最適化
問題点
ドキュメント更新などでも不要な実行が発生していました

改善点
以下のようにpaths-ignoreを設定し、特定のファイル変更時はワークフローを実行しないようにしました

```yaml
paths-ignore:
  - '**/*.md'
  - '**/*.csv'
  - '.gitignore'
  - '.github/**'
  - 'docs/**'
```

## 実装方法
### ワークフローファイルの作成
`.github/workflows/`ディレクトリに以下の2つのワークフローファイルを作成します

メインワークフロー（main_workflow.yml）
```yaml
name: Main Workflow

on:
  push:
    branches:
      - main
    paths-ignore:
      - '**/*.md'
      - '**/*.csv'
      - '.gitignore'
      - '.github/**'
      - 'docs/**'
  pull_request:
    types:
      - opened
      - reopened
      - synchronize

permissions:
  pull-requests: write

jobs:
  trigger-assign-pr:
    name: Trigger Assign PR Creator
    uses: ./.github/workflows/assign_pr_creator.yml
    secrets: inherit
```

PRアサインワークフロー（assign_pr_creator.yml）
```yaml
name: Assign PR Creator

on:
  workflow_call:

permissions:
  pull-requests: write

jobs:
  assign-pr-creator:
    runs-on: ubuntu-latest

    steps:
      - name: Install Dependencies
        run: sudo apt-get update && sudo apt-get install -y curl

      - name: Assign PR Creator
        run: |
          if [ "${{ github.event_name }}" = "pull_request" ]; then
            PR_NUMBER="${{ github.event.pull_request.number }}"
            PR_AUTHOR="${{ github.event.pull_request.user.login }}"
            
            curl -L \
              -X POST \
              -H "Accept: application/vnd.github+json" \
              -H "Authorization: Bearer ${{ secrets.GITHUB_TOKEN }}" \
              -H "X-GitHub-Api-Version: 2022-11-28" \
              "https://api.github.com/repos/${{ github.repository }}/issues/${PR_NUMBER}/assignees" \
              -d "{\"assignees\":[\"${PR_AUTHOR}\"]}"
          else
            echo "This is not a pull request event"
            exit 0
          fi
```

## ポイント
### 1. 権限設定
* `permissions`ブロックで`pull-requests: write`を設定
* GitHubが自動生成するトークンを使用（追加設定不要）

### 2. パスの除外
* `paths-ignore`で不要なファイル変更時のワークフロー実行を防止
* ドキュメントや設定ファイルの変更時は実行しない

### 3. シークレットの継承
* `secrets: inherit`で親ワークフローから子ワークフローへトークンを継承

## まとめ && 所感
* PRのレビュー時に数が多いと対象PRを探しにくく、せめてレビュイーが登録されているといいなと思いながら幾年
* 「自動化すればいいじゃん」と思い、個人開発しているリポジトリへの実装に挑戦しましたが、権限周りや不要な実行の調整で予想以上に時間がかかりました（笑）
* 今回のことで`GitHub Actions`の理解も深まり、他の自動化にも応用できそうです
* それはそうとfolio構築の最後終わらせないとな（ ￣\-￣）ﾄｵｲﾒ

## Appendix: 関連する公式ドキュメント
### 1. GITHUB_TOKENの認証
- [Automatic token authentication](https://docs.github.com/ja/actions/security-for-github-actions/security-guides/automatic-token-authentication)
  - GitHub Actionsで自動的に生成されるGITHUB_TOKENの仕組み
  - トークンの権限とスコープについて

### 2. ワークフローの構文
- [Workflow syntax for GitHub Actions](https://docs.github.com/ja/actions/writing-workflows/workflow-syntax-for-github-actions)
  - `on`イベントトリガーの詳細
  - `paths-ignore`の設定方法
  - `permissions`の設定方法

### 3. ワークフローの再利用
- [Reusing workflows](https://docs.github.com/ja/actions/sharing-automations/reusing-workflows)
  - `workflow_call`トリガーの使用方法
  - `secrets: inherit`の動作について

### 4. GitHub REST API
- [GitHub REST API Documentation](https://docs.github.com/en/rest/issues/assignees?apiVersion=2022-11-28#add-assignees-to-an-issue)
  - アサイン用エンドポイント `/repos/{owner}/{repo}/issues/{issue_number}/assignees`
  - 必要なヘッダーとパラメータ

### 5. GitHub Actions Permissions
- [Permissions for the GITHUB_TOKEN](https://docs.github.com/jp/actions/security-guides/automatic-token-authentication#permissions-for-the-github_token)
  - `pull-requests: write`の詳細
  - デフォルトの権限設定