GitHub Actions を用いて issue が更新されたら LINE に通知する方法

## はじめに

[コマンドラインから LINE にメッセージを送れる LINE Notify](https://engineering.linecorp.com/ja/blog/using-line-notify-to-send-messages-to-line-from-the-command-line) を参考にしながら **GitHub Issue が新しく投稿された時、またはコメントが付いた時に LINE に通知する** という GitHub Actions のワークフローを書きました。

## 実行結果

![20190927i.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32736/a51b9bdb-b233-4194-5788-fa27ab5fae9b.png)

## ワークフローのサンプル

``` yml:.github/workflows/notify_line_on_issue.yml
name: notify_on_issue

on:
  issues:
    types: opened
  issue_comment:
    types: created

jobs:
  notify_line:
    runs-on: ubuntu-latest
    steps:
    - name: Create messages for new issue
      if: github.event_name == 'issues' && github.event.action == 'opened'
      env:
        TITLE: ${{ github.event.sender.login}} が新しい issue を公開しました
        ISSUE_TITLE: ${{ github.event.issue.title}}
        ISSUE_LINK: ${{ github.event.issue.html_url }}
      run: echo -ne "${TITLE}\n${ISSUE_TITLE}\n${ISSUE_LINK}" > contents

    - name: Create messages for new comments
      if: github.event_name == 'issue_comment' && github.event.action == 'created'
      env:
        TITLE: ${{ github.event.sender.login}} がコメントしました
        ISSUE_TITLE: ${{ github.event.issue.title}}
        ISSUE_LINK: ${{ github.event.comment.html_url }}
      run: echo -ne "${TITLE}\n${ISSUE_TITLE}\n${ISSUE_LINK}" > contents

    - name: Run | Send LINE Notification
      env:
        LINE_TOKEN: ${{ secrets.LINE_TOKEN}}
        URL: https://notify-api.line.me/api/notify
      run: |
        curl -X POST \
             -H "Authorization: Bearer ${LINE_TOKEN}" \
             --data-urlencode message@contents \
             ${URL}
```

## ポイントの紹介

### LINE Notify へのアクセストークンを発行して `secrets` に登録する

``` yml
- name: Post LINE Notification
  env:
    LINE_TOKEN: ${{ secrets.LINE_TOKEN}}
```

まずは [LINE Notify](https://notify-bot.line.me) から通知用のアクセストークンを発行します。初めての方は [[超簡単]LINE notify を使ってみる](https://qiita.com/iitenkida7/items/576a8226ba6584864d95) が参考になると思います。このトークンがあれば HTTP POST リクエストを送るだけでメッセージやスタンプが送ることができます。ただし、直接コードにトークンを書いてしまうと誰でもメッセージが送れてしまうので `secrets` 変数として扱う必要があります。`secrets` 変数の登録と利用方法については以下が参考になります。

- [virtual-environments-for-github-actions#creating-and-using-secrets-encrypted-variables](https://help.github.com/en/articles/virtual-environments-for-github-actions#creating-and-using-secrets-encrypted-variables)

今回は `LINE_TOKEN` という変数名でアクセストークンを登録しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32736/579199fc-21c4-23f8-74d0-fd1b640e7958.png)


### types でワークフローのトリガーを細かく制御する

``` yml
on:
  issues:
    types: opened
  issue_comment:
    types: created
```

ここではワークフローをトリガーするアクティビティタイプを変更しています。以下のドキュメントによると `issues` や `issue_comment` は、デフォルトのままではすべてのアクティビティタイプでトリガーされるので `types` で制限をしました。こうしないと、例えば Issue にラベルを追加したり、コメントを削除したりするたびに LINE 通知が飛ぶことになるからです。

- [events-that-trigger-workflows#issues-event-issues](https://help.github.com/en/articles/events-that-trigger-workflows#issues-event-issues)
- [events-that-trigger-workflows#issue-comment-event-issue_comment](https://help.github.com/en/articles/events-that-trigger-workflows#issue-comment-event-issue_comment)


### アクティビティタイプ別に処理を分岐させる

``` yml
if: github.event_name == 'issues' && github.event.action == 'opened'
```

ステップを実行する条件を `if` で制御することができます。今回は Issue が新しく投稿された時と、コメントが追加された時で、メッセージの文面を変えたかったので上記のように条件分岐を設けました。

- [workflow-syntax-for-github-actions#jobsjob_idstepsif](https://help.github.com/ja/articles/workflow-syntax-for-github-actions#jobsjob_idstepsif)

### コンテキストへの参照ができる

``` yml
env:
  TITLE: ${{ github.event.sender.login}} がコメントしました
  ISSUE_TITLE: ${{ github.event.issue.title}}
  ISSUE_LINK: ${{ github.event.comment.html_url }}
```

`${{ github.event }}` はワークフローをトリガーした webhook のペイロードで、投稿者や Issue のタイトル、追加されたコメントへのアンカーリンクを参照することができます。

- [contexts-and-expression-syntax-for-github-actions#github-context](https://help.github.com/en/articles/contexts-and-expression-syntax-for-github-actions#github-context)

## おわり

外部ライブラリやスクリプトを使わずに、GitHub Actions のワークフローだけで LINE 通知を実現することができました。今回は LINE 通知を自作しましたが、一方で Slack 通知は [Slatify](https://github.com/marketplace/actions/slatify) のような便利な仕組みが既に [Marketplace](https://github.com/marketplace?type=actions) に公開されています。LINE 通知も多くの方が気軽に利用できてニーズもあるはずなので、今後ワークフローが公開されるのかもしれません。