【GitHub Actions】特定のラベルがついたIssueをプロジェクトに追加する

# はじめに
GoQSystemではCI/CDツールにCircleCIとGitHub Actionsを採用しています。
ソースコード管理にGitHubを利用していることもあり、最近は何をするにしてもGitHub Actionsで書いています。
今回は題名通り、特定のラベルが付与されたIssueを特定のプロジェクトへ自動で追加するGitHub Actionsワークフローを作成したのでその紹介になります。

# なぜやったか
ズバリ、トイルの撲滅が目的です。
GitHubのプロジェクトでIssueを管理しだしたのが最近なので厳密にはトイルではありません。トイルになる業務だとはっきりしていたので最初から自動化しました。

# どうやったか
GitHub Actionsの[add-to-project](https://github.com/actions/add-to-project)を使いました。めちゃくちゃ簡単です！

https://github.com/actions/add-to-project

以下が実際のコードになります。これだけで「GoQ」というラベルがついたIssueが作成されるとプロジェクトに自動的に追加されるようになります。

```add_to_project.yaml
name: 「GoQ」ラベルがついたIssueをプロジェクトに自動で登録する

on:
  issues:
    types:
      - opened

env:
  PROJECT_OWNER: GoQ
  PROJECT_NUMBER: <プロジェクトID>
  TARGET_LABEL: GoQ

jobs:
  add-to-project:
    name: Add issue to project
    runs-on: ubuntu-latest
    steps:
      - uses: actions/add-to-project@v0.4.0
        with:
          project-url: https://github.com/orgs/${{ env.PROJECT_OWNER }}/projects/${{ env.PROJECT_NUMBER }}
          github-token: ${{ secrets.ADD_TO_PROJECT_PAT }}
          labeled: ${{ env.TARGET_LABEL }}
```

# 各項目の説明
## トリガー
今回作成したワークフローはIssueが作成されたタイミングで実行すればOKなので、タイプを`- opened`のみに設定しています。
なぜかというと、Salesforceと連携してIssueを作成してるフロー内で使用しており、確実に「GoQ」ラベルがIssueに付与されるという前提条件があったためです。
本来であれば特定のラベルはIssue作成後にも付与される可能性はあると考えられるので、`- labeled`もつけておくといいかなと思います。

```add_to_project.yaml
on:
  issues:
    types:
      - opened
```

## 環境変数
`PROJECT_OWNER`はプロジェクトオーナー名、`PROJECT_NUMBER`はプロジェクトIDです。
それぞれプロジェクトのURLで確認できます。

プロジェクトを開いたURL、`https://github.com/orgs/GoQ/projects/1`の`GoQ`がプロジェクトオーナーで、`1`がプロジェクトIDです。

`TARGET_LABEL`は付与されていたらアクションを実行させたいIssueのラベル名です。今回は1つだけで十分なので1つですが、2つ設定することも可能です。

```add_to_project.yaml
env:
  PROJECT_OWNER: GoQ
  PROJECT_NUMBER: <プロジェクトID>
  TARGET_LABEL: GoQ
```

## ジョブ
最初に紹介したように`actions/add-to-project`を使用します。
※ 2023年2月執筆時点では`actions/add-to-project@v0.4.0`が最新です。

以下のように書くだけで、`TARGET_LABEL`ラベルが付与されたIssueが作成されたらプロジェクト「GoQ」へ自動で追加してくれます。

```add_to_project.yaml
jobs:
  add-to-project:
    name: Add issue to project
    runs-on: ubuntu-latest
    steps:
      - uses: actions/add-to-project@v0.4.0
        with:
          project-url: https://github.com/orgs/${{ env.PROJECT_OWNER }}/projects/${{ env.PROJECT_NUMBER }}
          github-token: ${{ secrets.ADD_TO_PROJECT_PAT }}
          labeled: ${{ env.TARGET_LABEL }}
```

複数のラベルをトリガーにしたい場合、`label-operator`オプションを使うと簡単に実現できます。詳しくは[公式](https://github.com/actions/add-to-project)を確認してください。

## シークレット
上記で使用している`${{ secrets.ADD_TO_PROJECT_PAT }}`は、`repo`と`project`のscopeを持ったパーソナルアクセストークンを作成し、リポジトリのシークレットに保存し利用しています。

パーソナルアクセストークン作成やシークレットの保管や使用については公式を参考にしてください。

https://docs.github.com/ja/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token

https://docs.github.com/ja/actions/security-guides/encrypted-secrets

# まとめ
非常に簡単にトイルを撲滅できますね。
もし1件処理するのに1分かかると仮定すると、10件/日発生すると作業時間：10分/日になります。
1ヶ月（20営業日）で計算すると作業時間：205分（3.4時間）もただIssueをプロジェクトに追加する作業を行なっていることになります。
日々数件だと意識しにくいですが、確実に効果がある改善活動になります。
もしこのような業務を手作業で行なっているのであれば、GitHub Actionsを利用して自動化してみてはいかがでしょうか。

# 最後に
#### **GoQSystemでは一緒に働いてくれる仲間を募集中です！**
求人は出していませんが、SREやQAエンジニアも今後募集していこうと考えています！
ご興味がある方は以下リンクよりご確認ください。

https://goqsystem.recruit.site?qiita=27a840e34b5aa1718e21