GitHub Actions PRマージにラベル付与を必須化する

## 概要

https://qiita.com/ucan-lab/items/4b02dec969df399253f7

前回、PR作成時にラベルを自動付与するワークフローを作成しました。

ブランチ名は自由に設定したいとかあるかもしれません。
自動付与だと強制できないので、PRにラベルが設定されない可能性はあります。

そこでPRに特定のラベルが付与されてない場合はマージできないようにするワークフローを作成します。

## Gitシリーズ記事まとめ

https://qiita.com/ucan-lab/items/33c63a402f533aa92f3e

## 利用ツール

今回、ツールは未使用です。

## 実装

前回作成した `.github/workflows/assign-label.yaml` に追記します。
ラベル付与された後に、ラベルの必須チェックが実行されて欲しいためです。

丸々コードを上書きしてもらえればokです。

### .github/workflows/assign-label.yaml

```yaml:.github/workflows/assign-label.yaml
name: Assign Label
on:
  pull_request:
    types: [opened, labeled, unlabeled, synchronize, reopened]
jobs:
  assign-label:
    permissions:
      contents: read
      pull-requests: write
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

	  - uses: actions/labeler@v5
        if: ${{ github.event.action == 'opened' }}
        with:
          configuration-path: .github/labeler-branch.yaml
      - uses: actions/labeler@v5
        if: ${{ contains(fromJson('["opened", "synchronize"]'), github.event.action) }}
        with:
          configuration-path: .github/labeler-files.yaml
  check-require-label:
    needs: assign-label
    permissions:
      pull-requests: read
    runs-on: ubuntu-latest
    steps:
      - id: labels
        shell: bash
        env:
          GH_REPO: ${{ github.repository }}
          GH_TOKEN: ${{ github.token }}
          PR_NUMBER: ${{ github.event.number }}
        run: |
          json=$(gh pr view "$PR_NUMBER" --json labels | jq -c '.labels|map(.name)')
          echo "json=$json" >> "$GITHUB_OUTPUT"
      - name: Echo Label
        run: echo "${{steps.labels.outputs.json}}"
      - name: bug, feature, document, chore, refactor, dependencies, release の中からいずれかのラベルを指定してください。
        if: >-
          ! contains(fromJSON(steps.labels.outputs.json), 'bug') &&
          ! contains(fromJSON(steps.labels.outputs.json), 'feature') &&
          ! contains(fromJSON(steps.labels.outputs.json), 'document') &&
          ! contains(fromJSON(steps.labels.outputs.json), 'chore') &&
          ! contains(fromJSON(steps.labels.outputs.json), 'refactor') &&
          ! contains(fromJSON(steps.labels.outputs.json), 'dependencies') &&
          ! contains(fromJSON(steps.labels.outputs.json), 'release')
        run: exit 1
      - name: Successfully
        run: exit 0
```

## 実行結果

![ScreenShot 2024-04-05 10.57.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52879/39637d10-de57-6214-8f83-01f20d065655.png)

ラベルを設定しないとCI通らないんやでと怒られるようになりました。

![ScreenShot 2024-04-05 11.00.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52879/a79bcaf4-810d-1312-a9c9-eeb49ebb78cf.png)

ラベルが設定されてる時はステップがskipされるので、怒られません。

## 補足

`needs: assign-label` が設定されているので、 `assign-label` ジョブが実行された後に `check-require-label` が実行されます。

`id: labels` ではPRに設定されているラベルを取得しています。

自動付与した上で必須チェックしています。
自動付与が不要な場合は assign-label のジョブと関連の設定を削除してください。

### ラベルの取得について

`${{ fromJSON(github.event.pull_request.labels.*.name) }}` でラベルを取得することも可能ですが、こちらだと最新のラベルを取得できませんでした。

https://zenn.dev/hkusu/articles/a4053fd6feede6

### 出力パラメータ

`$GITHUB_OUTPUT`
https://docs.github.com/ja/actions/using-workflows/workflow-commands-for-github-actions#setting-an-output-parameter

## 業務改善度: ★★★☆☆

星3つです。
ラベル付与を強制できるので、便利は便利になったと思います。

ただ、作っておいてなんですが、必須チェックまでしなくてもいいんじゃないかとは個人的に思います笑

手動で付与するのもそもそも負担ないですからね

せっかくラベルをファイル管理するようにしたので、良い使い方ができないかなと考えてみました。

なんだか業務改善に繋がるのか怪しくなってきたので使ってみた感想とかあったらフィードバックコメント欲しいです。