SlackとJiraを連携してタスクの自動登録してみたら超便利だった件

インフラの中嶋です。
最近、2回目のコロナワクチンの摂取が無事終わり安堵してます。
皆さんはいかがお過ごしでしょうか?

さて今回は社員からの問い合わせを自動的にタスク管理ツールJiraに登録するbotを作ったのでそのお話です。

背景

ここ1年くらいでチームに浸透してきたJiraですが、最近では運用などの既存業務に掛かっている時間や内容を把握して管理したい一方、相談のようなタスクを1つ1つ登録するのは大変であり中々管理しきれないといった悩みがありました。
インフラに対しての相談についてはSlackの「インフラに相談チャンネル」というチャンネルが窓口となっており、相談のある社員はGoogleFormで作成した問診票に必要事項を記入して送信するだけで該当チャンネルに相談が投稿される仕組みとなっています。
そこで、相談チャンネルに投稿された際にbotが自動で相談対応として内容とともに自動で登録してくれる仕組みを作ろうということになりました。

処理の流れと仕組み

  1. 社員が「Slackのインフラに相談チャンネル」に相談したい内容を投稿する。
  2. オンプレミスサーバ上で稼働しているbotが投稿を受け取る。
  3. インフラ第一U(私のチーム)宛のメンションが付いた場合に、相談内容とともにJiraにタスクを登録する。

f:id:AdwaysEngineerBlog:20211021141451p:plain

コーディング

今回のbotで利用しているのはこちら→slackbotのGithub
※導入方法などについては今回割愛します。

from slackbot.bot import listen_to
import test
from jira import JIRA
from jira.exceptions import JIRAError
import gspread
import json
import datetime

#@infra_shoyoもしくは@infra_cloudのメンションがついた際にタスクに登録
@listen_to('infra_shoyo')
@listen_to('infra_cloud')
def reaction(message):
    text = message.body['text']
    #問診票を利用した(botからの)投稿なのか、直接チャンネルに投稿されたかで処理が異なる
    if 'インフラ問診票' in text:
        sep = '`'
        t = text.split(sep)
        send_user = t[1]
    else:
        send_user = message.channel._client.users[message.body['user']][u'name']
    #ServiceAccountCredentials:Googleの各サービスへアクセスできるservice変数を生成する。
    from oauth2client.service_account import ServiceAccountCredentials
    #2つのAPIを記述しないとリフレッシュトークンを3600秒毎に発行し続けなければならない
    scope = ['https://spreadsheets.google.com/feeds','https://www.googleapis.com/auth/drive']
    #認証情報設定
    #ダウンロードしたjsonファイル名をクレデンシャル変数に設定(秘密鍵、Pythonファイルから読み込みしやすい位置に置く)
    credentials = ServiceAccountCredentials.from_json_keyfile_name('xxxx.json', scope)
    #OAuth2の資格情報を使用してGoogle APIにログインします。
    gc = gspread.authorize(credentials)
    #共有設定したスプレッドシートキーを変数[SPREADSHEET_KEY]に格納する。
    SPREADSHEET_KEY = 'xxxxxxxxxxxxxxxxxxxxxxxxxxx'
    #共有設定したスプレッドシートの一番左のシートを開く(今月の運用担当シート)
    worksheet = gc.open_by_key(SPREADSHEET_KEY).sheet1
    dt_now = datetime.datetime.now()
    day = dt_now.day + 1
    #今日の日付の担当者の値を受け取る
    import_value = worksheet.cell(day, 4).value
    #Jiraにタスクを登録
    options = {'server': 'https://adways.atlassian.net/'}
    #Jiraのアドレスとトークン
    user='xxxxxxxx@adways.net'
    token='xxxxxxxxxxxxxx'
    jira = JIRA(options, basic_auth=(user,token) )
    #Spreadsheetから取得した担当者からJiraに登録するアカウントIDを設定する。
    smr = '相談対応(' + send_user + ')_インフラに相談チャンネル'
    #pythonではswitch文を用いた分岐処理ができないため、if,elifで処理する。
    if '担当者名' in import_value:
        accountId = 'Jiraで利用しているアカウント名'
    elif '担当者名' in import_value:
        accountId = 'Jiraで利用しているアカウント名'
    elif '担当者名' in import_value:
        accountId = 'Jiraで利用しているアカウント名'
    elif '担当者名' in import_value:
        accountId = 'Jiraで利用しているアカウント名'
    else :
        accountId = ''

    new_issue = jira.create_issue(
        project='プロジェクト名',
        summary= smr,
        description= text,
        issuetype={'name': 'タスク'},
        assignee={'accountId': accountId},
        customfield_12060={'value': '相談対応'},
        customfield_12079=2
    )

テスト

問い合わせの投稿

f:id:AdwaysEngineerBlog:20211021141513p:plain

投稿から10秒程度で登録されたのを確認

f:id:AdwaysEngineerBlog:20211021141528p:plain

おわりに

こんな感じで簡単にタスクの自動登録ができてしまいます!
自動化の波はすぐそこまでやってきています。
このような簡単なところから自動化に触れ、今後は人間がやらなくてもよい仕事は機械に任せていきたいですね。
大変便利ですので皆さんも是非触ってみてはいかがでしょうか?