APIGatewayとLambda経由でGitHubのコミット情報をbacklogの課題に通知する

# backlogの課題からその課題によってどのようなコード修正が行われたのかスムーズに知りたい!
と思った。
成果物
https://github.com/mYahagi/postBacklog
(Lambdaではデフォルトで使えないモジュールも含まれているので↓を参考にしてよしなに)

# 実現方法
1. BacklogのAPIKeyを発行する
2. lambdaにbacklogのAPIを叩くスクリプトを記述する
3. AWSのAPIGatewayにPOSTの受け口を作る 
4. GitHubの該当リポジトリにAPIGatewayに対して通知を送るWebhookを設定する

# 1. BacklogのAPIKeyを発行する
右上の自分のアイコンから個人設定 > API　と遷移してAPIKeyを発行する

# 2. lambdaにbacklogのAPIを叩くスクリプトを記述する
今回使用していいるbacklogAPIの仕様は[こちら](https://developer.nulab-inc.com/ja/docs/backlog/api/2/add-comment/)を参照
APIKeyはくれぐれも公開されないように
→今回はlambda側の環境変数に定義しているよ

また、lambdaでのpip installが必要なモジュールの使用の仕方は[こちら](https://qiita.com/Hironsan/items/0eb5578f3321c72637b4)を参考にしました

```python
import requests
import os
import re
import logging

logger = logging.getLogger()
logger.setLevel(logging.INFO)

def lambda_handler(event, context):
    pattern = r'xxxx_xx-[0-9]{3,}'
    baseUrl = 'https://xxx.backlog.jp/api/v2/issues/'

    issueIdArr = []

    def findIssueId(match, str):
        if match:
            issueId = match.group(0)
            issueIdArr.append(issueId)
            # すでに検出した課題番号はヒットしないよう空文字に置き換え
            str = str.replace(issueId, '')
            match = re.search(pattern, str)
            # 複数の課題番号が含まれているか再帰的に確認
            findIssueId(match, str)

    def postBacklog(issueIdArr, message, commitUrl):
        for issueId in issueIdArr:
            postUrl = baseUrl + issueId + '/comments'
            
            content = '''
            {message}
            {url}
            '''.format(message=message, url=commitUrl).strip()
        
            payload = {
                'content': content,
                'apiKey': os.environ['apiKey']
            }
        
            response = requests.post(postUrl, params=payload)
            logger.info(response.text)
    
    # 配列としてevent['body']['commits']内にローカルで溜め込んだコミットの情報が含まれている
    for commitRireki in event['body']['commits']:
        issueIdArr = []
        message = commitRireki['message']
        commitUrl = commitRireki['url']
        issueIdCheck = re.search(pattern, commitRireki['message'])
        # 課題番号が含まれているか確認
        findIssueId(issueIdCheck, commitRireki['message'])
        if len(issueIdArr) != 0:
            logger.info(issueIdArr)
            postBacklog(issueIdArr, message, commitUrl)
```

ざっくりと全体像はこんな感じ
<img width="1300" alt="スクリーンショット 2018-06-14 18.05.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/247146/986a5760-9d93-d05f-5492-0ad8c3d7f81c.png">


# 3. AWSのAPIGatewayにPOSTの受け口を作る
<img width="1168" alt="スクリーンショット 2018-06-14 14.56.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/247146/acdda723-4457-23bf-110b-783386cb2632.png">
<img width="1192" alt="スクリーンショット 2018-06-14 14.58.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/247146/82443f7a-3685-b261-4cf4-03d0f13310a4.png">
<img width="1072" alt="スクリーンショット 2018-06-14 14.59.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/247146/a416bb85-5f45-1fdd-c3a1-fff6e9f369ac.png">
画像の順に設定します。
マッピングテンプレートのスマートな書き方知ってるよ! って人はぜひ教えてください！！

# 4. GitHubの該当リポジトリにAPIGatewayに対して通知を送るWebhookを設定する
Payload URL : APIGatewayで作ったPOST先のURLを指定するよ
画像のように設定しておくと、masterブランチにプッシュされる度にGitHubがApiGatewayをたたいてくれるよ

<img width="731" alt="スクリーンショット 2018-06-14 18.07.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/247146/de67fdd6-89ca-b7a1-02af-79008218c5be.png">

# まとめ
ざっくりとした説明でしたが以上が今回作った連携機能になります。
コミットメッセージにbacklogの課題番号を含めてpushしてもらうとlambda側でその番号を拾って指定された課題にコメントを追加しています。

　こんな感じ
<img width="751" alt="スクリーンショット 2018-06-14 18.13.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/247146/831e473f-67b1-c02d-e370-2a99547e1b62.png">


backlogの課題からそれの修正のためにどのようなコード修正が行なわれたのかすぐに追えるので個人的にはとても便利です。

今回は外部のリポジトリとの連携でしたが、backlog自体のgitリポジトリを用いて開発している場合はもっと簡単に連携できるみたいですね。

拙い文章ですが、最後まで読んでいただきありがとうございました。