GitHubActions でプルリクの情報をレビューアにメンションをつけてSlack通知する

# GitHubActions でプルリクの情報をレビューアにメンションをつけてSlack通知する

 - [1.はじめに](#1-はじめに)
 - [2.実装](#2-実装)
 - [3.GitHub Actionsを使用したSlack通知ワークフローの解説](#3-実装)
   - [3.1. ワークフローのトリガ](#31-ワークフローのトリガ)
   - [3.2. ジョブの実行](#32-SPOから最新版を手動で取得できるAPI)
     - [3.2.1 メンションをつけて通知するための準備](#321-メンションをつけて通知するための準備)
     - [3.2.2 Slack通知](#321-Slack通知)
 - [4.実行結果](#4-実行結果) 
 - [5.おわりに](#5-おわりに) 



## 1. はじめに
現在、自分の所属する開発チームでは、プルリク作成後、レビューアにSlackでその情報を送信しています。　　
今回はGitHubActionsでプルリクの情報をSlackにメンション付きで通知するyml構文を書きました。　　
これで、slackへの通知を自動化します。　　

## 2. 実装
今回作成したコードのサンプルは以下です。
```yml:sample.yml
name: Send_Pullrequest-Message
on:
  pull_request:
   types:
    - ready_for_review
jobs:
  send_pullrequest-message:
    timeout-minutes: 2
    runs-on: ubuntu-latest
    steps:
    - name: member1
      if: github.event.pull_request.requested_reviewers[0].login == 'member1'
      run: echo "Login_Name=Slack_memberID" >> "$GITHUB_ENV"
    - name: member2
      if: github.event.pull_request.requested_reviewers[0].login == 'member2'
      run: echo "Login_Name=Slack_memberID" >> "$GITHUB_ENV"
    - name: member3
      if: github.event.pull_request.requested_reviewers[0].login == 'member3'
      run: echo "Login_Name=Slack_memberID" >> "$GITHUB_ENV"       
    - uses: slackapi/slack-github-action@v1.16.0
      if: env.Login_Name != '' 
      with:
        payload: "{\"text\":\" <@${{ env.Login_Name }}>\\n 以下のプルリクエストを作成しました。\\n 
         Title     : ${{ github.event.pull_request.title}}\\n 
         URL       : ${{ github.event.pull_request.html_url}}\\n
         Assignees : ${{ github.event.pull_request.assignees[0].login}}\\n
         Revwer    : ${{ github.event.pull_request.requested_reviewers[0].login}}\"}"     
      env:
        SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
```

## 3. GitHub Actionsを使用したSlack通知ワークフローの解説
### 3.1  ワークフローのトリガー
このワークフローは、Pull Requestの状態が"ready_for_review"に変化したときにトリガーされます。これにより、コードレビューの準備が整ったときにSlack通知を送信できます。　　
運用に合わせて、「レビューアが割り当てられた」、「プルリクが作成された」時などにトリガーを変更できます。ワークフローのトリガについては[こちら](https://docs.github.com/ja/actions/using-workflows/triggering-a-workflow#about-workflow-triggers)を参照。　　
※"ready_for_review"はドラフトプルリクエストからプルリクエストを作成したときのことです。

```yaml
on:
  pull_request:
    types:
      - ready_for_review
```
### 3.2  ジョブの実行
ワークフローのジョブは、以下のステップから成り立っています。
#### 3.2.1 メンションをつけて通知するための準備
Pull Requestが特定のレビュアーにアサインされたとき、それに対応するSlackメンバーに通知を送信します。  
Slackにメンションをつけてメッセージを送信するためには、メンバーIDが必要になります。  
SlackのメンバーIDの取得方法はこちらを参考  
以下のコードはレビューアのGitのアカウント名を取得し、SlackのメンバーIDをマッピングし、環境変数に格納しています。

```yaml
- name: member1
  if: github.event.pull_request.requested_reviewers[0].login == 'member1'
  run: echo "Login_Name=Slack_memberID" >> "$GITHUB_ENV"
```
同様のステップがmember2およびmember3のメンバーに対して設定されています。
#### 3.2.2 Slack通知
条件に合致したメンバーがいる場合、Slack通知を送信します。これにはGitHub Actionsのワークフローが提供する環境変数を使用します。  


```yaml
- uses: slackapi/slack-github-action@v1.16.0
  if: env.Login_Name != ''
  with:
    payload: "{\"text\":\" <@${{ env.Login_Name }}>\\n 以下のプルリクエストを作成しました。\\n 
     Title     : ${{ github.event.pull_request.title}}\\n 
     URL       : ${{ github.event.pull_request.html_url}}\\n
     Assignees : ${{ github.event.pull_request.assignees[0].login}}\\n
     Revwer    : ${{ github.event.pull_request.requested_reviewers[0].login}}\"}"     
  env:
    SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
```

このステップでは、SlackのWebhookを介してメンション付きのメッセージを送信し、プルリクエストの詳細情報を表示します。  
``github.event.pull_request``　を使用してプルリクのタイトルやURL、reviewer、assignee を取得し、メッセージを送信しています。

## 4. 実行結果
実行してみると、以下のようにメンション付きでSlackにメッセージが送信されました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3131319/5d5d0417-e230-e9cf-86fd-ad0760f4f981.png)  

開発チームで運用する際は、ドラフトプルリクエストをはじめに作成しておき、すべて完了してからプルリクエストに変更することでレビューアにメッセージを自動で通知してくれます。

## 5. おわりに
今回はGitHubActions でyml構文を使用してSlackにプルリク情報をメンション付きで送信しました。　　
サンプルを元に少し変更するだけで、チームにあった運用が可能になると思いますので参考までにご活用ください。
今後チームで運用しながら、より便利なものに仕上げたいと考えております。