UnityでGitHub Actions(2) -PRと特定コメントをフックにしてビルドを行う

# 前回

https://qiita.com/tanikura/items/42085f24e83644258c53

今回は、PRとPRにつけられたコメントをフックにしてUnityのWebGLビルドを行うワークフローを作ります。

# ワークフロー
初めにワークフローの全体を示します。
この`webgl_build.yml`を前回と同様リポジトリ直下の`.github/workflows`ディレクトリに配置します。

```YAML:webgl_build.yml
name: Run the WebGL build
on:
  pull_request:
    types: [opened, reopened]

  issue_comment:
    types: [created, edited]

jobs:
  build:
    name: Run the WebGL build
    if: |
      github.event_name == 'pull_request' ||
      ( contains(github.event.comment.html_url, '/pull/') && startsWith(github.event.comment.body, '/retry build') )
    runs-on: ubuntu-latest
    steps:
      - name: Get upstream branch
        uses: xt0rted/pull-request-comment-branch@29fe0354c01b30fb3de76f193ab33abf8fe5ddb0 #1.2.0
        id: upstream_branch
        with:
          repo_token: ${{ secrets.GITHUB_TOKEN }}
        
      - name: Notify pending status
        uses: hkusu/status-create-action@1040f888115fc10b2e0fa8efc8ef3b85a916af2e #1.0.0
        if: contains(github.event.comment.html_url, '/pull/')
        with:
          sha: ${{ steps.upstream_branch.outputs.sha }}
          state: pending

      - name: Check out when pr #PRで起動した時
        uses: actions/checkout@v2
        if: github.event_name == 'pull_request'

      - name: Check out when comment #コメントで起動した時
        uses: actions/checkout@v2
        if: contains(github.event.comment.html_url, '/pull/')
        with:
          ref: ${{ steps.upstream_branch.outputs.head_ref }}

      - name: Cache library
        uses: actions/cache@v3
        with:
          path: Library
          key: Library-WebGL
          restore-keys: |
            Library-

      - name: Run the WebGL build
        uses: game-ci/unity-builder@v2
        env:
          UNITY_LICENSE: ${{ secrets.UNITY_LICENSE }}
        with:
          targetPlatform: WebGL
          unityVersion: 2021.3.12f1

      - name: Upload the WebGL Build
        uses: actions/upload-artifact@v2
        with:
          name: Build
          path: build
    outputs:
      commit_sha: ${{ steps.upstream_branch.outputs.head_sha }}

  notify_succeed:
    if: ${{ success() }}
    name: Notify succeed
    needs: build
    runs-on: ubuntu-latest
    steps:
      - name: Notify success status
        uses: hkusu/status-create-action@1040f888115fc10b2e0fa8efc8ef3b85a916af2e #1.0.0
        if: contains(github.event.comment.html_url, '/pull/')
        with:
          sha: ${{ needs.build.outputs.commit_sha }}
          state: success

  notify_failure:
    if: ${{ failure() }}
    name: Notify failure
    needs: build
    runs-on: ubuntu-latest
    steps:
      - name: Notify failure status
        uses: hkusu/status-create-action@1040f888115fc10b2e0fa8efc8ef3b85a916af2e #1.0.0
        if: contains(github.event.comment.html_url, '/pull/')
        with:
          sha: ${{ needs.build.outputs.commit_sha }}
          state: failure
```

## PRのコメントをフックにする時
PRのコメントをフックにしたいときは、`pr_comment`のようなイベントはないため`issue_comment`を指定して、ワークフロー内で条件分岐を行います。コード内ではこの部分です。
```YAML
if: |
    github.event_name == 'pull_request' ||
    ( contains(github.event.comment.html_url, '/pull/') && startsWith(github.event.comment.body, '/retry build') )
```

他の判定方法もあると思いますが、ここでは`github.event_name == 'pull_request'`でPRでフックされたかどうかの確認を行なっており、2行目の`( contains(github.event.comment.html_url, '/pull/') && startsWith(github.event.comment.body, '/retry build') )`で、プルリクエストのコメントかどうかと、コメントの内容についての検証をしています。
ここでは`/retry build`というコメントでワークフローを起動したいので、`startsWith(github.event.comment.body, '/retry build')`のようにコメントが`/retry build`で始まっているのかどうかを確認しています。

# 次回
次回は、このワークフローにGitHub Pagesにデプロイ、またDiscordに通知する処理を加えます。