ChatOps!

JIRAとHipChatを使ったChatOps!

定常タスクを自動化したお話 JIRAにサブタスクを作成

定常タスクを自動化したお話 Atlassian-JIRAのサブタスクの作成

ホットペッパービューティーで開発を担当している藤本です。
今回はABテストの案件管理に利用している「JIRA」に関するお話です。

ホットペッパービューティーで実施するABテストは、1案件に対して1課題を作成しています。
そして、各担当者のタスクは課題に紐づくサブタスクを作成して、質問やメモをやり取りしたり、
作業記録を付けたりしています。

イメージはこんな感じです。 サブタスクのイメージ

これまではこのサブタスクを毎回人力で作成して(もらって)いたのですが……。
ちりも積もればエベレスト。貴重な時間は、人間にしかできないお仕事に振り向けましょう!
というわけで自動化に取り組んでみました。

目指したこと

今回はこの3点が実現できるようにしました。

  • JIRAに新しい課題が作成されたら、自動でサブタスクが追加されるようにしたい
  • 作成するサブタスクの名称は、親課題から継承したい
  • 作成されたサブタスクの報告者と担当者も一緒に設定したい

用意したもの

  • JIRA(この文章を書いている時の社内は、6.4.11を使用)
  • JIRA REST APIのドキュメント(最新版
  • HipChat

どうやった?

もともとHipChat上に常駐させていたHubotに、機能を追加しました。

1) JIRAに新しい課題が作成されたらHipChatに通知されるように設定

JIRAからHipChatへの通知設定 JIRAからHipChatへの通知例

2) HubotでHipChatのメッセージを拾って、APIでJIRAにアクセスする

拾う条件は、こんな感じにしています。

  • JIRAユーザーの投稿であること
  • 正規表現で"HPB-[0-9]+“の形式を含むこと
  • Reported byの文言を含むこと

3) Hubotで該当するメッセージを拾ったら、課題IDをもとにGETで情報を取得(参考:API

1
2
3
4
curl -X GET \
 -H "Content-Type: application/json" \
 -H "'Basic ' + base64encode('JIRAアカウントのメールアドレス:JIRAアカウントのパスワード')" \
 https://jira.example.com/rest/api/2/issue/HPB-XXXX

取得例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
{
        "expand": "renderedFields,names,schema,transitions,operations,editmeta,changelog",
        "id": "XXXXXX",
        "self": "https://jira.example.com/rest/api/2/issue/XXXXXX",
        "key": "HPB-XXXX",
        "fields": {
                "summary": "ABテスト案件課題名",
                "issuetype": {
                        "self": "https://jira.example.com/rest/api/2/issuetype/10415",
                        "id": "10415",
                        "description": "ABテスト",
                        "iconUrl": "https://jira.example.com/secure/viewavatar?size=xsmall&avatarId=12441&avatarType=issuetype",
                        "name": "ABテスト",
                        "subtask": false
                },
                "project": {
                        "self": "https://jira.example.com/rest/api/2/project/10707",
                        "id": "10707",
                        "key": "HPB",
                }
        ...省略...
        }
}

4) 取得したJSONを解析して、タスク名を基準に、必要なサブタスクが揃っているか確認

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
{
        ...省略...
        "fields": {
                "subtasks": [
                        {
                                "id":"XXXXXX",
                                "key":"HPB-XXXX",
                                "self":"https://jira.example.com/rest/api/2/issue/XXXXXX",
                                "fields":{
                                        "summary":"VISUAL_ABテスト案件課題名",
                                }
                        },
                        {
                                "id":"191991",
                                "key":"HPB-XXXX",
                                "self":"https://jira.example.com/rest/api/2/issue/XXXXXX",
                                "fields":{
                                        "summary":"FE_ABテスト案件課題名",
                                }
                        }
                        ...省略...
                ]
        }
}

5) サブタスクが足りない場合は、PUTで追加(参考:API

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
curl -X PUT \
 -H "Content-Type: application/json" \
 -H "'Basic ' + base64encode('JIRAアカウントのメールアドレス:JIRAアカウントのパスワード')" \
 -d "{\
        'fields': { \
            'project'    : { 'key': 'HPB' }, \           # プロジェクトの識別子
            'parent'     : { 'key': 'HPB-XXXX' },\       # 親の課題ID
            'summary'    : '接頭辞_' + '課題のタイトル', \
            'description': '課題の説明', \
            'issuetype'  : { 'id': '5' }, \              # サブタスクに該当する課題タイプのID
            'reporter'   : { 'name' : '報告者に設定したい人の名前' }, \
            'assignee'   : { 'name' : '担当者に設定したい人の名前' } \
        } \
    } \
 https://jira.example.com/rest/api/2/issue/HPB-XXXX

6) HTTPステータスと追加したサブタスクの情報が返却される

1
2
3
4
5
6
HTTP: 200
Body: {
        "id": "191990",             # 全プロジェクト通して連番
        "key": "HPB-YYYY",          # プロジェクトの識別子+プロジェクト内の連番
        "self": "https://jira.example.com/rest/api/2/issue/YYYYYY"  # そのままAPIでアクセスできるURL
}

7) 取得したレスポンス等をもとに、必要に応じて成否をHipChatへ通知する

今はこのように通知しています。 サブタスク作成通知例

どうなった?

無事にサブタスクを生成することに成功しました。 サブタスク生成結果

おわりに

サブタスクの作成には、プラグインで実現する方法もあるようなのですが、

  • ランニングコストがかからない!(作成とメンテの時間は掛かるけど軽微)
  • 自由にカスタマイズできる!

ということから、今回はChat+Botを使った方式でやりました。
今後もJIRA、HipChatを使った自動化を進めていこうと思います。

ホットペッパービューティーは、いつでもヘア・ネイル・まつげ・リラク・エステサロンをご予約いただけるサービスです。
スマートフォンやパソコンからぜひご利用ください!(宣伝)

藤本 拓也

(リーン開発チーム)

雰囲気Javaエンジニア。自宅PCをWindowsからMacに変えてから、職場もMacにしたい熱が上昇中。最近はどうやって手抜きをするか考えながらBotと戯れる日々。

NEXT