【GitHub】Actions と Projects を使って issue の状態を可視化する

GitHub には CI/CD の機能を提供する [Actions](https://github.co.jp/features/actions) とカンバンツールである[プロジェクトボード](https://docs.github.com/ja/issues/organizing-your-work-with-project-boards/managing-project-boards/about-project-boards)がありますので、これらの機能をつかって issue を管理してみたいと思います。

## プロジェクトボードを作る

適当なリポジトリを作り、[Projects]タブを選択し、[New project]からプロジェクトボードを作成できます。
![create-project.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/780549/be956376-af1e-fd48-5af7-67dcf232e627.png)

プロジェクトボードを作成できたら、ステータス毎に issue を分類するために「Backlog」「In Progress」「Done」の列を作成します。
![project-board.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/780549/6f5779fd-1e0b-ba5e-b9ab-30ad13a08b2f.png)

## ワークフローを作成する

issue が新しく作成されたら「Backlog」へ、issue に担当者がアサインされたら「In Progress」、issue がクローズしたら「Done」へプロジェクトボード上にマッピングされるように Actions でワークフローを作成します。ワークフローは``yaml``ファイルに記述し``.github/workflows/issue-status-label.yml``で保存します。``${{ secrets.PAT }}``は``GitHub``の``Personal access token``になりますので事前に用意し、Actions から使用できるように``secrets``に設定しておく必要があります。

```yaml:.github/workflows/issue-status-label.yml
name: Label issues
on:
  issues:
    types:
      - reopened
      - opened
      - closed
      - assigned
env:
  PROJECT_NAME: todo
jobs:
  issue_labels:
    runs-on: ubuntu-latest
    permissions:
      issues: write
    steps:
      - name: Add backlog label
        if: "github.event.action == 'opened'"
        uses: andymckay/labeler@1.0.2
        with:
          add-labels: "backlog"
          remove-labels: "inprogress, close"
          repo-token: ${{ secrets.PAT }}
      - name: Add inprogress label
        if: "github.event.action == 'assigned' || github.event.action == 'reopened'"
        uses: andymckay/labeler@1.0.2
        with:
          add-labels: "inprogress"
          remove-labels: "backlog, close"
          repo-token: ${{ secrets.PAT }}
      - name: Add close label
        if: "github.event.action == 'closed'"
        uses: andymckay/labeler@1.0.2
        with:
          add-labels: "close"
          remove-labels: "inprogress, backlog"
          repo-token: ${{ secrets.PAT }}

  assign_issue_to_project:
    name: Assign issues to project
    runs-on: ubuntu-latest
    steps:
      - name: Assign issues to project
        uses: technote-space/create-project-card-action@v1
        if: "github.event.action == 'opened'"
        with:
          PROJECT: ${{env.PROJECT_NAME}}
          COLUMN: Backlog

  move_assigned_card:
    runs-on: ubuntu-latest
    name: Move assigned card
    steps:
      - uses: alex-page/github-project-automation-plus@v0.3.0
        if: "github.event.action == 'assigned'"
        with:
          project: ${{env.PROJECT_NAME}}
          column: In Progress
          repo-token: ${{ secrets.PAT }}
      - uses: alex-page/github-project-automation-plus@v0.3.0
        if: "github.event.action == 'reopened'"
        with:
          project: ${{env.PROJECT_NAME}}
          column: In Progress
          repo-token: ${{ secrets.PAT }}
```

``env.PROJECT_NAME``には作成したプロジェクトの名前を設定します。ワークフローを作成したらリポジトリにプッシュしておきます。

## issue の作成

ワークフローのテストのために適当な issue を作成します。issue が作成されるとワークフローが実行されて issue に backlog ラベルが付与されます。
![issue-create.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/780549/bd04e91c-1247-1198-769d-e5e54c75ae5c.png)

プロジェクトボードを確認すると、「Backlog」列に作成した issue が配置されています。
![issue-project-board.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/780549/6e2347ed-ed3d-6e5c-2bdc-6d86537bac76.png)

### 担当者アサイン

作成した issue に担当者をアサインしてみます。すると、backlog ラベルが削除されて inprogress ラベルが付与されます。プロジェクトボードを見ると「In Progress」列に issue が移動されているのが確認できます。
![issue-moved.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/780549/a0c32d5a-c93f-638a-028c-720de2ae83e2.png)

### issue クローズ

issue をクローズしてみます。プロジェクトボードで確認すると、「Done」列に issue が移動し close がラベルが付与されています。
![issue-done.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/780549/f2f39e08-f77d-1916-5fc9-c45039569d36.png)

## 参考

issue を作成したらプロジェクトに追加
https://github.com/marketplace/actions/create-project-card-action

カードがプロジェクトボードの列に追加されたときにラベルを削除する
https://docs.github.com/ja/actions/guides/removing-a-label-when-a-card-is-added-to-a-project-board-column

label の作成
https://github.com/marketplace/actions/simple-issue-labeler