955
0
0

GitHubのpull requestで特定のラベルが付与されたらslackに通知されるようにしました

Published at December 20, 2019 10:51 a.m.

この投稿は12/20付のアドベントカレンダー投稿記事になります。

GitHubで特定のラベルが付与されたらslackに通知するようにしてみました。
対応内容について以下に記述します。

はじめに

ソースコードのレビュアーの管理をGitHubのラベルで行なっています。
pull requestに対してXXレビュー待ち、XX確認済み、のような感じです。(XXのところには人の名前が入ります)

また、社内のコミュニケーションツールとしてslackを使用しており、レビュー待ちをつけたあとに「XXさん、レビューお願いします」と連絡していました。

二度手間なのでラベルつけたらslackに通知するようにできれば・・・と考えたのが対応しようと思ったきっかけです。

本来ならば

Github Actionsを使って対応する方が簡単ですし、オススメです!
が、現在会社が使っている課金プランだと使用できないため下記のような対応をしています。

解決策に向けて

既にslackとGitHubで連携してくれる「GitHub Enterprise Server」を使用していたのですが、ラベルの付与は通知の対象外でした。

そこでslackの「Incoming Webhook」を使うことにしました。

構成

GitHub Webhooks => AWS API Gateway => AWS Lambda => slack Incoming Webhook => slackへ通知

slack Incoming Webhook

文言やiconは後で上書きされるので適当に設定して大丈夫です。
あとで使用するので、Webhook URLをメモしておきます。

slack apiのtestができるサイトがあるので、ここでどんなjsonを投げればどんな動きをするのか確認できます
https://api.slack.com/methods/api.test

AWS Lambda

GitHubから投げられたリクエストをそのまま通知するとpull requestに関するすべての挙動を通知するので、ラベルが付与されたアクションのみ通知するようにします。
また特定のラベルに対応した人に対してメンションを投げるようにもします。

import json
from urllib.request import Request, urlopen

def lambda_handler(event, context):
  encode = json.dumps(event)
  decode = json.loads(encode)
  if decode['action'] == 'labeled':
      pull_request_dumps = json.dumps(decode['pull_request'])
      pull_request_loads = json.loads(pull_request_dumps)

      label_dumps = json.dumps(decode['label'])
      label_loads = json.loads(label_dumps)

      mention = ""
      if label_loads['name'] == "山田確認待ち":
        mention = "<@taro.yamada>\n"
      elif label_loads['name'] == "鈴木確認待ち":
        mention = "<@ichiro.suzuki>\n"

      send_data = {
          "channel":"#test", # チェンネル名
          "username": "github_label", # ユーザー名
          "icon_emoji": "ok",
          "text": mention + pull_request_loads['title'] + "\n" + pull_request_loads['html_url'] + "\n" + label_loads['name']
      }
      payload = "payload=" + json.dumps(send_data, ensure_ascii=False)
      request = Request(
          "slack Incoming WebhookでメモしたWebhook URL",
          data=payload.encode("utf-8"),
          method="POST"
          )
      with urlopen(request) as response:
          response_body = response.read().decode("utf-8")

AWS API Gateway

先ほど作ったAWS Lambdaを指すようにします。

GitHub Webhooks

Payload URLには先ほど作ったAWS API Gatewayを指すように指定します。

結果

通知されるようになり、面倒な手間が少しだけ減りました。