2019/12/06
Slack から Jira Service Desk の障害報告チケットを起票樋口 晃Akira Higuchi
こんにちは。Atlassianのパートナー Ricksoft の樋口です。今年もアドベントカレンダーの季節がやって来ました。ここ数年は毎年参加させていただいています。去年のアドベントカレンダーを読み返してみると、もう1年たってしまったのかと思います。今年もあっという間の1年でした。今年から、リックソフトは Workato というサービスの取り扱いを開始し、さらに Slack のパートナーにもなりました。自分は新しいプロダクトに興奮しつつ Workato社、Slack社 の人と一緒に仕事をしたり、米国カリフォルニア州の Slack社、Workato 社に出張で訪問させて貰ったりしました。また最近は Atlassian User Group のお手伝いを以前よりもさせて貰うようになり、いろいろな方とお話できるので刺激を受けております。振り返ってみれば、今年は去年よりも楽しい1年でした。来年も、Atlassian + Workato + Slack でバリバリやって行きたいと思いますので、よろしくお願いいたします。
今年のアドベンドカレンダーでは、私が出会って5分で「これを使えば、あんな事もこんな事もできる。えっそんな事もできるの」と夢が膨らんでしまった Workato を利用して、 Slack と Jira の連携事例についてご紹介したいと思います。
Workato は、複数のサービス/アプリケーションを連携するCloudサービスで、いわゆる iPaaSソリューションです。他の製品よりも簡単に連携ができて、とくにSlack を利用した連携がおもしろいと思います。Workato を利用すれば、簡単な承認処理や申請などを、ユーザーはSlackの中からできてしまいます。
このブログではサーバー運用チームから相談を受けた内容に基づき、課題を解決するための Slack ボットを作ってみた例を記載します。それがどれ位の時間で実装できるかやってみましょう。
相談を受けた内容は
「サーバーで障害が発生したら、Jira Service Desk で障害報告のチケットを起票してユーザーに連絡しなければいけない、これが面倒。もっと簡単にしたい」
というものでした。障害対応は大変な作業なので、報告などの付随的な作業は少しでも簡単にしたいというのはもっともな話です。どこが大変なのか確認するために、現在の作業手順を聞いてみました。
というものでした。
運用担当の人は、2の「会社名」や「担当者名」を普段意識していないので、間違えてしまうか心配で何度も確認するのが面倒。また、サーバーのIDで課題を検索してもその課題に顧客の情報があるのではなく、親課題にあるというのも面倒。との事でした。運用情報を管理している Jira と Jira Service Desk が同じ インスタンスなら、最近 Atlassian に買収されることが決定した Automation for Jira などの Jira の自動化ツールで解決できますが、複数のインスタンスとなると Workato の方が簡単だと思います。
Workato で下記の Slack ボットを作ってみましょう。
イメージは下記の様な感じです。
上記の処理は、通常の Slack ボットでも作成する事ができますが、Workato を利用すると素早くできます。私は Workato に慣れているので、1時間程度で実装できました。実装した内容は下記の通りです。Workato は レシピというフローを作成する事で処理を実装します。
Workato でアプリと連携するためには、AppConnection というアプリケーションのコネクションを作成します。今回は情報の通り、3つのコネクションが必要です。下記は Jira に接続する場合のコネクションの設定画面です。設定するのは、URL、ユーザー名、パスワードだけです。Workato の接続用にアカウントを作成する事をお勧めします。Slack の場合は、Slackにアプリを導入する関係上ちょっと手間が増えますが、ウイザード形式で簡単に設定する事ができます。コネクションはレシピ別に設定するのではなく、一度設定してしまえば各レシピで利用できます。
最初にレシピを起動するトリガーを定義します。今回は Slack からの起動なので、Slack の New commad を指定します。これで、Slack から workbot をメンションしてメッセージを送信する事で レシピを起動できるようになります。トリガーの中では、起動するコマンド名とパラメータを指定します。Slack のアプリと連携すれば、スラッシュコマンドとして実行する事もできます。
パラメータとして、サーバーIDを定義します。
レシピ内には、トリガーにつづいて 処理を実装するためのアクションを定義します。アクションは複数定義する事ができます。最初に Jira の検索を実行します。その前に、検索の JQL を確認しておきます。JQLに不慣れな方は、通常のベーシック検索で検索して最後にアドバンスをクリックすれば、JQLに切り替ります。
今回必要なJQLは下記のようになります。
project = INFRA AND issuetype = リソース管理 AND server-id ~ xyz-jira
Workato には JQL検索アクションが用意されているのでこれを利用すれば簡単に検索できます。上記のJQLでは、xyz-Jira とサーバーIDが指定されていますが、実際のレシピではSlackのパラメータで指定された値を挿入するので下記のように トリガーのデータピルから取得できます。
トリガーとアクションを一つ定義すると、レシピとしては動くので試しに動かしてみます。検索はできるはずですので、実行してみましょう。今回は、infra create jsd-ticket というコマンドにしました。Workato ではコマンドは3個の単語にする事になっています、下記のように指定すると、サーバーIDの入力を求められます。ここで指定したメッセージは、トリガーのパラメータで指定したメッセージです。レシピでは検索するだけで、何も返していないので何も起こりません。
ですが、Workato の画面で見ると検索が成功しています。下記の通り、期待通りに子チケットを検索できています。parent のkey で親チケットのIDも取れています。
また、検索ができなった場合のロジックも入れましょう。検索結果の件数により処理を分岐する様にします。分岐処理を追加する場合は、下記の+ボタンを押して、
Conditional を追加します。Conditional は 条件分岐のロジックです。この他に、Conditional with else や 繰り返しを実装する、Repeat action が有ります。
検索結果の List Size が 0 だった場合は検索できなかった事になるので、Jiraの検索の結果の「List Size」を使って条件を指定します。
条件が成立した場合は、下記のように Slack にメッセージを表示して処理を中断するようにします。
テストしてみましょう。
期待通りですね。ここまでは順調です。
次に親課題の情報を取得するために、Get Issue というアクションを追加します。このアクションに 親課題のキーを指定すれば簡単に見つかるはずです。親課題のキーは検索できているので、検索結果の中から選べるはずです。
ですが、上記の 「Search Issue by JQL」 のデータピル(上記画面の赤枠の部分)の中に、parent に相当するものが有りません。どうやら、Workato は親チケットを取得する事を考慮してくれていない様です。ちょっとピンチな感じですが、大丈夫です。こういう時のために、Custom Action という REST API を直接呼んでしまう方法が有ります。Jira の検索をする REST API は下記のURLで取得できます。
REST API を直接呼ぶのですが、Workato は JSON データを解析してくれるのでそれ程大変ではありません。というよりも、Workato に出会う前に python でコーディングしていた頃と比べると、めちゃめちゃ簡単です。Jira のCustom Actionの設定画面は下記のようになっています。まずはURLとメソッド(この場合は Get) を指定します。
サーバーからのアウトプット については、サンプルのJSONデータをペーストすればよいのです。下記の Use JSON ボタンを押すと、
下記のエディタ画面が表示されます。ここに JSON データをコピペします。
するとこうなるので、NEXT ボタンを押します。
下記の通りに解析してくれますので、Generate Scheme を押します。
これで下記の通りスキーマーができます。これで親課題のキー(下記のグレーの下線部分)を取得できるようになりました。以降は Custom Action である事を意識する必要は有りません。
これで親課題のキーを取得できたので次のステップで、再度 Get Issue を実行して親課題の情報を取得できます。
これで課題の検索までできました。必要な情報の検索できましたので、この情報を元に Jira Service Desk にチケットを作ってみます。チケットの作成は、Create Issue アクションで実行できます。
上記のProject Issue type で、チケットを作成するプロジェクトと課題タイプを決めるのですが、Select from list と表示されている通りリストから選択する事ができます。Workato は 連携するアプリの情報を読んでくれるのでこの辺は楽です。そして、Summary が説明で Description が要約になります。その他の Jira のフィールドも指定できます。ここでは「要約」は固定の文字列。説明欄は、Jiraから取得した情報としています。ここで、reporter に Service Desk アカウントを指定する事もできるのですが、そうするとチケットを起票した時にユーザーに連絡が行ってしまいます。Workato ではひな形を作るだけにして、後で reporter を指定できる様に説明欄に Jira Service Desk アカウントを記載しておきます。
最後に、Slack にメッセージを出力します。下記のように Message text に固定のメッセージを出力して、作成したチケットのキー+要約を表示して、チケットへのリンクも提示するようにしました。
これで完成しました。全体のフローは下記のようになります。
各ステップに表示されている文言はステップコメントです。下記のように自由に入力する事ができますので、適宜入力してレシピを解りやすくできます。
ここまででレシピができましたので、実行してみます。 Workato のボットユーザーである @workbot をメンションする事で実行できます。
おっと、エラーになってしまいました。こういう時は、recipe の job タブを開くとエラーの内容が確認できます。どうやら検索処理でエラーになっていました。
レシピを開くと、たしかに検索文字列の最後の server_id が入っていません。どうやらこの記事の説明のためにスクショを取ったりしていて消してしまった様です。
これを修正して再度実行してみましょう。今後は成功しました。
そして、Jira Service Desk のチケットもできています。
上記の通りレシピができたので、インフラチームに見てもらいました。反応はとてもよく「すぐに使いたいです」と言われました。そしてレシピを見たら「これをベースにわたしたちで要件に合わせて修正できますね」と言われました。Workato のレシピ作りは簡単で楽しいです。そして成果がすぐに目に見えて、上記の通りエラーの時の原因究明も簡単です。今回は、workbot にメンションする形にしましたが、Slack の Slack Commands を利用すれば 、スラッシュコマンドで起動する事もできます。
これから年末に向けてレシピをたくさん作りたいです。来年もよろしくお願いいたします。そしていつかは、アドベント レシピ カレンダーを作りたいです。
ご不明な点がございましたらお気軽にお問い合わせください。
アトラシアン社ではサポート範囲外となっているサードパーティ製のアドオンをリックソフトのRS標準サポートではサポートします。
リックソフトのRS標準サポートは開発元が提供するサポート以上の価値があります。
ツールを導入しただけでは成功とはいえません。利用者が効果を感じていただくことが大切です。独自で制作した各種ガイドブックはツール活用を促進します。
リックソフトからライセンス購入を頂いたお客様にはガイドブックを無料進呈いたします。
ツール操作の研修だけでなく「ウォータフォール型開発」「アジャイル型開発」のシミュレーション研修も提供。
日本随一の生産性向上にも効果のある研修サービスです。
リックソフトからライセンス購入を頂いたお客様には無料招待や割引特典がございます。