dependabotの作成したPRを自動でGithubのプロジェクトボードに追加する

# 概要

dependabot が自動でプルリクエストを作成してくれる機能は素晴らしいですね。

ただ、開発で Github のプロジェクトボードを利用している場合には、
下記のようなことを思います。

- dependabot が作ったプルリクエストを手動でプロジェクトボードに追加しているけど、作業が面倒・・・:disappointed:
- プルリクエストを作ったら、自動的にプロジェクトボードに追加しておいてほしい:tired_face:

これを解決する Github Actions があったので、設定方法を紹介します。
記事の最後に参考リンクをいくつか貼りましたので、そちらも参照ください。

:::note warn
**2023/8/15追記:**
この方法はクラシックなプロジェクトボードで利用できた方法です。
現在のプロジェクトボードではうまく動作しません。
:::

# 設定方法

今回は、[Create or Update Project Card](https://github.com/marketplace/actions/create-or-update-project-card) というアクションを利用します。
念のため、dependabot の自動プルリクエスト作成の設定方法も記載します。

## [Create or Update Project Card](https://github.com/marketplace/actions/create-or-update-project-card) を導入

今回は、下記の Action を利用します。
色々なリポジトリやユーザー、組織などに所属するプロジェクトボードを指定してカードが追加できるので、この Action にしました。

- [Create or Update Project Card · Actions · GitHub Marketplace](https://github.com/marketplace/actions/create-or-update-project-card)

### アクセストークンの設定

プロジェクトボードにプルリクエストのカードを追加するために、
リポジトリからプロジェクトボードにアクセスできるアクセストークンを作成する必要があります。
※複数名で開発している場合、アクセストークンを追加しても問題ないかをメンバーに確認するようにしましょう。

1. 下記にアクセスして、アクセストークンを作成してください。  
  - プロジェクトボードにアクセスする権限のあるユーザーでログインしている必要があります。
  - https://github.com/settings/tokens/new
  - `repo`と`admin:org`の権限が必要(下記の画像のようになります。)
![アクセストークン新規作成画面で選択するスコープ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261148/89c8c97f-5cd3-1e32-5346-507f90fccb21.png)
1. 先ほど作成したアクセストークンを、リポジトリのシークレットに追加します。
  - https://github.com/ユーザー名または組織名/リポジトリ名/settings/secrets/actions/new
  - `GHPROJECT_TOKEN` という名前で追加してください。  
    (もし違う名前にする場合は、後で作成する YAML ファイル内の`GHPROJECT_TOKEN`の部分を変更してください。)  
  ![シークレット新規作成画面.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261148/91f13b7d-f2ef-8aec-d1d0-e8e0e0e62315.png)


### YAML ファイル追加

`.github/workflows` に、下記の YAML ファイルを追加します。
下記のようなプロジェクトボードやリポジトリという設定で、サンプルの YAML ファイルを作成しました。

- プロジェクトボードのある場所の名前: `TestUser`  
  - リポジトリやユーザー、組織名等を指定
  - デフォルトはこの YAML ファイルがあるリポジトリのプロジェクトボードが指定される
- プロジェクトボードの名前: `サンプルプロジェクト`
- プルリクエストを追加したいカードの名前: `To do`

```yml:.github/workflows/dependabot-pulls-todo.yml
name: Move dependabot pull requests into To do

on:
  pull_request_target:
    types: [opened]

jobs:
  automate-project-columns:
    runs-on: ubuntu-latest
    steps:
      - uses: peter-evans/create-or-update-project-card@v1
        with:
          project-location: TestUser
          project-name: サンプルプロジェクト
          column-name: To do
          issue-number: ${{ github.event.number }}
          token: ${{ secrets.GHPROJECT_TOKEN }}
```

試しにプルリクエストを作成してみてください。
ワークフローの実行が成功すれば、
作成したプルリクエストはプロジェクトボードに追加されます。

## 「dependabot が作成したプルリクエストのときだけ」ジョブを動かしたい

今のままだと、誰がプルリクエストを作成してもアクションが動いてプルリクエストがプロジェクトボードに追加されてしまいます。
**「dependabot が作成したときだけ」** という制限をつけます。

```diff:.github/workflows/dependabot-pulls-todo.yml
 jobs:
   automate-project-columns:
     runs-on: ubuntu-latest
+    if: ${{ github.actor == 'dependabot[bot]' }}
     steps:
       - uses: peter-evans/create-or-update-project-card@v1
         with:
```

- 参考
  - [Automating Dependabot with GitHub Actions - GitHub Docs](https://docs.github.com/ja/code-security/supply-chain-security/keeping-your-dependencies-updated-automatically/automating-dependabot-with-github-actions#handling-pull_request-events)

## dependabot の自動プルリクエスト作成導入

dependabot の自動プルリクエスト作成導入は、
今回ワークフローを追加したリポジトリに `.github/dependabot.yml` を追加するだけです。
今回は一般的なRailsアプリケーションを想定して、
「週に 1 回、gem のバージョンアップをチェックする」という設定を追加します。

```yml:.github/dependabot.yml
version: 2
updates:
  - package-ecosystem: "bundler"
    directory: "/"
    schedule:
      interval: "weekly"
```

- 他の設定(npm など)にしてみたい方は、下記を参考にしてください。  
  `dependabot.yml`で使えるオプションが載っています。
  - [依存関係の更新の設定オプション - GitHub Docs](https://docs.github.com/ja/code-security/supply-chain-security/keeping-your-dependencies-updated-automatically/configuration-options-for-dependency-updates)

これで、更新の必要な gem がある場合はプルリクエストが自動的に作成されます。

先ほど追加したワークフローがあるので、
dependabot が作成したプルリクエストは、自動的にプロジェクトボードに追加されます。

# おわりに

際限なくなんでも面倒だと思ってしまうのはどうにかした方がいいような気もするのですが、
便利にできるところはやっぱり便利にしたいですね:blush:

# 参考サイト・記事

- [Create or Update Project Card · Actions · GitHub Marketplace](https://github.com/marketplace/actions/create-or-update-project-card)
  - 今回使った Action です。詳しくはこちらの README.md を読んでください。
- [GitHub Project Automation+ · Actions · GitHub Marketplace](https://github.com/marketplace/actions/github-project-automation)
  - 利用を検討していたが、今回は使わなかった Action です。  
    `project-location` の指定ができないので、こちらの利用は見送りました。
- [個人アクセストークンを使用する - GitHub Docs](https://docs.github.com/ja/github/authenticating-to-github/keeping-your-account-and-data-secure/creating-a-personal-access-token)
  - アクセストークンの作り方
- [OAuth App のスコープ - GitHub Docs](https://docs.github.com/ja/developers/apps/building-oauth-apps/scopes-for-oauth-apps)
  - アクセストークンのスコープについて。適切なスコープを指定しましょう。
- [Automating Dependabot with GitHub Actions - GitHub Docs](https://docs.github.com/ja/code-security/supply-chain-security/keeping-your-dependencies-updated-automatically/automating-dependabot-with-github-actions#handling-pull_request-events)
  - dependabot を Github Actions で自動化する方法
- [依存関係の更新の設定オプション - GitHub Docs](https://docs.github.com/ja/code-security/supply-chain-security/keeping-your-dependencies-updated-automatically/configuration-options-for-dependency-updates)
  - `dependabot.yml`内で使えるオプションの一覧