BacklogのチケットをSlackに投げてみる

記事タイトルとURLをコピーする

こんにちは。技術3課の森です。
ここ数年、ほぼ毎日仕事終わりにコンビニに寄って、お酒を買って飲んでます。春になって暖かくなってきたので、そういうお友達を募集しております。一緒に飲みながら帰りましょう。

BacklogのチケットをSlackに投げてみる

先日ふとしたことから、Backlogの残チケットをわざわざブラウザでチェックしなくてもslackで見れないかなということで、Lambdaを使ってslackに通知するプログラムを作成してみました。
構成はざっくりと以下のような感じです。

実装環境

AWS Lambdaを使って実行しますので、またもやPythonでコードを書きます。
先日ブログに書いた「【必見】」か「【続】」をご覧いただければと思います。
ちなみに、今回はvirtualenv/python-lambda-local/lambda-uploaderを利用します。

実装

実装準備

ライブラリのインストール

今回のプログラムには「slackweb(1.0.5)」と「PyYAML(3.12)」を使いますので、最初に利用するライブラリを準備します。

$ mkdir backlog2slack
$ cd backlog2slack
$ virtualenv .
$ source bin/activate
$ pip install slackweb
$ pip install PyYAML
$ echo slackweb==1.0.5 > requirements.txt
$ echo PyYAML==3.12 >> requirements.txt

lambda.jsonの作成

AWS Lambdaにデプロイする際に利用する情報を定義します。
IAMRoleに「LambdaBasicRole」という名前のロールを先に定義しておいてください。 ポリシーは「arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole」を設定してください。

 
{
    "name": "backlog2slack",
    "description": "Send Backlog Issue to Slack",
    "region": "ap-northeast-1",
    "handler": "backlog2slack.main",
    "role": "arn:aws:iam::123456789012:role/LambdaBasicRole",
    "timeout": 300,
    "memory": 128
}

実装

いくつか関数を作ります。大きく分けてこの3つ。順番に解説していきます。

  • Backlogからデータを取得するところ
  • いっぱい取れることも考えて、text snippetを作るところ
  • Slackに投げるところ

Backlogからデータを取得するところ

Backlogからデータを取得するときに必要なURL情報は以下の通りです。

項目
説明
参考
URL
スキーム

ホスト名
Backlogのスペース名を含んだ情報です。
https://<のスペース名>>.backlog.jp」
「<<Backlogのスペース名>>」は適宜ご利用のスペース名に変えてください
-
APIのURLと
クエリパラメータ
先ほどのスキームとホスト名の後に引っ付けるURL部分です。参考URLをご確認いただければと思います。
なお、プロジェクトIDはご利用のプロジェクト設定のURLの最後についてる数字になります。
ココ
APIキーBacklogへの操作を行う際に必要なAPIキーを取得します。取得したら、「apikey」というクエリパラメータとともにURLとして追加してください。ココ

URLの例として、チケットのステータスが「未対応」「処理中」「処理済み」で「子課題」のチケットを検索するものです。

https://<<スペース名>>.backlog.jp/api/v2/issues?apiKey=<>&projectId[]=<<プロジェクトID>>&statusId[]=1&statusId[]=2&statusId[]=3&parentChild=2

これを基にして、プログラムはこんな感じです。

def getBacklogIssue():
    url = "https://<<スペース名>>.backlog.jp/api/v2/issues?apiKey=<<APIキー>>&statusId[]=1&statusId[]=2&statusId[]=3&parentChild=2"
    response = urllib2.urlopen(url)
    jsondata = json.loads(res.read())
    issuedata = ''
    for record in jsondata:
        summary = u'課題の件名: ' + record['summary']
        viewlink = u'URL: https://<<スペース名>>.backlog.jp/view/' + record['issueKey']
        assignName = ''
        if record['assignee'] == None:
            assignName = '-'
        else:
            assignName = u"担当: " + record['assignee']['name']
        issuedata = issuedata + summary + os.linesep viewlink + os.linesep + assignName
    return issuedata

いっぱい取れることも考えて、text snippetを作るところ

次にtext snippetにするところです。
Backlogのチケットが大量にデータが取得できて、そのままSlackに投げた場合は驚くほどのスクロールをしないといけないので、
text snippetにしておくことでキュッと縮めておくようにします。

def slackAttachments(conf):
    attachments = []
    textStr = getBacklogIssue()
    attachment = {
        "pretext": u"*未完了課題の一覧*",
        "text": textStr,
        "mrkdwn_in": ["text", "pretext"]
    }
    attachments.append(attachment)
    return attachments

Slackに投げるところ

では、Slackに投げるところです。
Backlogから課題情報を取得して、text snippetにする状態までできましたので、最後にSlackに投げます。
incoming webhookのURLを先に取得しますが、手順は今回は省略しますが、ココから取得してください。

def slacknotify(attachments):
    slackWebHookUrl = 'https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX'
    slack = slackweb.Slack(url=slackWebHookUrl)
    slack.notify(attachments=attachments)

まとめ

3つの関数を呼び出す関数を作れば完成です。
プロジェクトの大小に関わらずBacklogを利用することがあるかと思いますが、プロジェクトIDだけをなんとかしておけば、チケットを取得してslackに投げることができます。これで、ふと忘れてたチケットを解決するために動かせていけるかと思います。