LoginSignup
15
13

More than 3 years have passed since last update.

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

Last updated at Posted at 2018-06-14

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の仕様はこちらを参照
APIKeyはくれぐれも公開されないように
→今回はlambda側の環境変数に定義しているよ

また、lambdaでのpip installが必要なモジュールの使用の仕方はこちらを参考にしました

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)

ざっくりと全体像はこんな感じ
スクリーンショット 2018-06-14 18.05.33.png

3. AWSのAPIGatewayにPOSTの受け口を作る

スクリーンショット 2018-06-14 14.56.16.png
スクリーンショット 2018-06-14 14.58.41.png
スクリーンショット 2018-06-14 14.59.23.png
画像の順に設定します。
マッピングテンプレートのスマートな書き方知ってるよ! って人はぜひ教えてください!!

4. GitHubの該当リポジトリにAPIGatewayに対して通知を送るWebhookを設定する

Payload URL : APIGatewayで作ったPOST先のURLを指定するよ
画像のように設定しておくと、masterブランチにプッシュされる度にGitHubがApiGatewayをたたいてくれるよ

スクリーンショット 2018-06-14 18.07.43.png

まとめ

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

 こんな感じ
スクリーンショット 2018-06-14 18.13.52.png

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

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

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

15
13
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
13