GitHubでIssueが作成されたらGitHub ActionsでSlackへ通知する

## はじめに
GitHubでIssueが作成されたらチャットへ通知がほしい、なんてことありますよね。
本記事では、GitHubでIssueが作成されたらGitHub ActionsでSlackへ通知する、ということをやってみたいと思います。

## 1. Slack側で通知先のチャンネルのIncoming Webhooks URLを取得

以下のSlackのページを参照し、通知先のチャンネルとIncoming WebhooksのURLを取得します。
https://api.slack.com/messaging/webhooks

以下のような形でWebhook URLが生成されるのでコピーしておきます。
![スクリーンショット 2023-11-17 230506.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23101/9284fa20-7cdf-29dc-4b1e-1d074a981cff.png)

## 2. GitHub Actionsを利用したいリポジトリのSecrets and variablesにWebhook URLを保存
ワークフローファイルにWebhook URLをハードコーディングしても良いのですが、ここはSecrets and variablesに保存しましょう。
GitHub側でGitHub Actionsを利用したいリポジトリを選択し、一番右のSettingsタブを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23101/a9636519-fa0a-3da1-efc7-bd1e9161fb89.png)

左サイドメニューのSecrets and variables→Actionsを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23101/c39a6cba-4656-35ad-a78e-2c18a2be5184.png)

New repository secretボタンをクリックし、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23101/eae42c0c-c85d-fc36-447c-6a8f5902f1d9.png)

NameにSLACK_WEBHOOK_URL(これは任意の名前でOK)、Secretに1で取得したWebhook URLを貼り付けてAdd secretボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23101/2437ddd9-c3aa-eb55-fe61-a6659d3fc95b.png)

これでSecrets variablesにWebhook URLの保存は完了です。

## 3. ワークフローファイルの作成
ここからが本題になります。まずはワークフローファイルを作成していきます。
ワークフローファイルは、リポジトリルートに「.github/workflows」というディレクトリを作成し、その中に作成する必要があります。
そのため、今回の例では「.github/workflows/created-issues.yml」という形で作成します。
実際に作成してみたものが以下になります。

```.github/workflows/created-issues.yml
name: Created Issues
on: issues

jobs:
  Slack-Notification:
    name: Send-Notification
    runs-on: ubuntu-latest
    steps:
      - name: Send GitHub Action trigger data to Slack workflow
        id: slack
        uses: slackapi/slack-github-action@v1.24.0
        with:
          payload: |
            {
              "text": "Created Issues"
            }
        env:
          SLACK_WEBHOOK_URL: ${{secrets.SLACK_WEBHOOK_URL}}
```

### 3-1. 各ステップ(構文)の説明

##### 1行名：name（非必須）
ワークフローの名前を指定するものです。Actoinsの画面の左サイドバーに表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23101/38604254-bf3d-9675-911c-96889de8155b.png)
省略すると相対パス「.github/workflows/ワークフローファイル名」がワークフロー名になります（この例ですと「.github/workflows/created-issues.yml」

#### 2行目：on（必須）
ワークフローを実行するトリガーを指定します。今回の場合はIssueが作成されたタイミング(正確には「issues」はissueが作成もしくは変更されたタイミングがトリガーとなる)をトリガーとしたいので「issues」を指定しています。トリガーは様々なものが用意されており、以下から確認できます。
https://docs.github.com/ja/actions/using-workflows/events-that-trigger-workflows

#### 4行目：jobs（必須）
ワークフローはジョブと呼ばれる関連する一連の操作の塊単位で実行されます。ジョブの中の各操作はステップと呼ばれます。ジョブは一つ以上の複数のジョブで構成されます。以下はジョブとステップの概念図です。
※GitHub Actions公式より引用
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23101/297ded15-045a-c495-5fcf-4382df3542a7.png)

#### 5行目：Slack-Notification
ジョブIDになります。命名方法は任意ですがどのようなジョブなのかが分かるように命名します。今回の例ではSlackへ通知を送るジョブのため「Slack-Notification」としています。
使える文字は「数字」「アルファベット」「-」「 _ 」のみで、「アルファベット」もしくは「 _ 」で始める必要があります。ジョブを複数作る場合、重複はできません。

#### 6行目：name（非必須）
ジョブの名前になります。Actionsの実行サマリの画面で表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23101/7ce7998d-60cc-a4ac-374d-2828ae660472.png)
省略するとジョブIDが表示されます。

#### 7行目：runs-on（必須）
ジョブが実行されるマシンを指定します。runs-onに関しては別記事で詳細を投稿します。

#### 8行目：steps（必須）
ジョブ内のステップを定義するものです。この定義の下から具体的なステップを定義していきます。

#### 9行目：-name（非必須）
ステップの名前を指定するものです。Actionsの実行詳細の画面で表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23101/6e4e26ee-bd33-bfc4-2567-f6177da44e5e.png)
省略するとそのステップで実行するコマンドが表示されます。

#### 10行目：id（非必須）
ステップのIDを指定するものです。ステップのIDを指定することで別のステップから参照することができます。今回は使っていませんが便宜上あえて記述しています（なくても動きます）。
https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsid

#### 11行目：uses（非必須）
GitHub Actionsでは、繰り返し利用されることが想定されるタスクはアクションとして事前に定義されています。また、サードパーティ製のアクションも[GitHubのMarketplace](https://github.com/marketplace?type=actions)で提供されており、そこのアクションも利用することができます。こういったアクションを利用することで、ワークフローファイルのコード量を削減することができます。
今回の例では、「SlackのIncoming Webhook URLに対してPostリクエストを送信する」ということをやりたいのですが、その処理は既にMarketplaceで「[slack-send](https://github.com/marketplace/actions/slack-send)」というアクションが提供されいているため、そのアクションを利用しています。

#### 12行目～18行目：
上述した[slack-send](https://github.com/marketplace/actions/slack-send)の使い方に倣って定義しています。単純に送信したいテキストと「2. GitHub Actionsを利用したいリポジトリのSecrets and variablesにWebhook URLを保存」で保存したWebhook URLをenvで指定します（GitHub Actionsではenv句を利用して変数が利用できます）。


## 4. 動作確認
これで準備は完了したので、動作確認として適当にIssueを作成します。

次にリポジトリのActionsタブをクリックし対象のワークフローを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23101/3a297f71-507a-a5e7-9773-df6352dac703.png)
成功していますね。

次にSlackも確認してみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23101/7076e4dc-5dbd-ef7c-290d-0b71de4e6f6e.png)

ちゃんと通知が来ていることを確認できました。

## 最後に
今回の例では、簡単な通知のアクションを作成してみました。
Issuesに関するトリガーは他にも、
```Issueにコメントがついた場合.
on:
  issue_comment:
```

```issueが削除された場合.
on:
  issues:
    types: [deleted]
```

といった具合に様々なものがあります。詳細は以下のIssuesトリガーに関するドキュメントで確認することができます。
https://docs.github.com/ja/actions/using-workflows/events-that-trigger-workflows#issues

以上です。

## 参考
https://docs.github.com/ja/actions