JIRAの課題をGoogleスプレッドシートでレポートしてみた

Avatar
dstn


こんにちは。アプレッソ開発部の陳です。

今回は、DataSpiderを使ってJIRAで管理している課題を読み取り、
集計した内容をGoogleスプレッドシートに出力するスクリプトをご紹介したいと思います。

JIRAとは


JIRAとは、アトラシアン社が開発した、バグトラッキング、課題管理、プロジェクト管理などで利用されているソフトウェアです。プロプライエタリソフトウェアですが、パブリックオープンソースプロジェクトで広く使用されています。

JIRAはプロジェクトの処理すべきタスクを「課題」としてプロジェクトに登録します。一つのタスクは一つの課題として、タスクの内容・優先度・担当者・期日・進捗状況などをJIRAで管理できます。ソフトウェア開発の場合、課題は対象となる新機能、修正すべきバグ、改善待ちの項目などになります。
JIRA画面

課題のエクスポートと共有をDataSpiderで自動化


JIRAを運用する際、課題の起票と解決など基本的な操作はそのままJIRAのWeb画面にアクセスすることが多いですが、プロジェクトのマイルストーンに向けて複数課題の進捗状況を横断的にまとめたり、集計したりしたい場合、スプレッドシートで共有・管理することが多いです。

JIRAには課題一覧をXML、DOC、XLSなど、いくつかの形式のエクスポート機能が用意されています。エクスポート機能は手軽で便利ですが、形式と件数は制限されているので、
例えば全件取得したい場合やフィールドの内容を加工したい場合は、エクスポート後に別途集計・整形など処理を行う必要があります。

JIRA課題の取得から集計・整形までの処理と、スプレッドシートで共有・管理を、DataSpiderで自動化すれば、これらの手間はかなり軽減できると思います。

ちなみに、最近はクラウド普及の影響で、クラウド経由でファイルを共有するケースも増えてきたので、ここでのスプレッドシート共有手段として、Googleスプレッドシートを使用したいと思います。

概要


JIRAにはREST APIが公開されていますので、DataSpiderのRESTアダプタを利用して、JIRAのREST APIを呼び出して課題を取得します。そして取得した課題を加工して、Googleスプレッドシート上にある集計先のファイルに書き込みます。
処理概要

以下ではDataSpiderのスクリプトの作成について説明していきます。スクリプトの処理すべてを説明すると今回の記事の枠に収まらないので、ポイントになる処理に絞って説明していきます。

スクリプト作成

 

エクスポートフォーマット


今回は以下のようなフォーマットでスプレッドシートに出力します。

課題キー要約タイプステータス優先度解決状況説明担当者作成日更新日コメント履歴

 

グローバルリソース


JIRAとGoogleスプレッドシートに接続するためのグローバルリソースを用意します。

REST接続設定では[URL]にJIRAのREST APIのアンカーポイントのURLを入力します。
REST接続設定

Googleスプレッドシート接続設定では、使用する認証方法とGoogleアカウントの情報に合わせて適切に設定します。パスワード認証の場合は使用するアカウントの情報を[ドメイン名]、[ユーザ名]、[パスワード]に入力します。OAuth 2.0認証の場合はアプリケーション情報を[クライアントID]、[クライアントシークレット]に入力してから、リフレッシュトークンを発行します。

[OAuth 2.0認証の場合](画面内の設定値はダミー)
スプレッドシート接続設定_OAuth2

[パスワード認証の場合](画面内の設定値はダミー)
スプレッドシート接続設定_Password

※Google AppsアダプタのOAuth 2.0認証対応は2015年3月以降リリースの製品(またはサービスパック、パッチ)に含まれる予定です。使用方法についてはドキュメントとヘルプを参照してください。

JIRAの認証


JIRAに接続するための認証方法はJIRAのユーザ情報によるBasic認証と、登録済みの連携アプリケーション情報によるOAuth認証の二種類がありますが、OAuth認証を使用するためにはかなり手間かかるので、ここではBasic認証を使用します。

Basic認証を使用する方法は以下の二通りがあります。

    1. 認証設定として指定:[認証設定]タブの[ベーシック認証]にJIRAのユーザ情報を設定します。

 

  1. リクエストヘッダとして指定:JIRAのユーザ情報を[ヘッダ設定]タブの[リクエストヘッダ]に以下の形式で追加します。太字の部分はBase64フォーマットでエンコードする必要があります。

    名前
    Authorization Basic ユーザ名:パスワード


サンプルスクリプトでは2.の方法を使用します。

課題一覧取得


課題一覧を取得するために使用したRESI APIは以下になります。このREST APIはJQL(JIRA Query Language)による、課題の検索機能を提供します。

GET /api/2/search

RESTアダプタの「GET実行」処理の設定画面は以下のようになります。

[必須設定]
課題一覧取得REST設定

オプションで以下のパラメータを[クエリパラメータ]で指定します。

名前
jql JQLで記述されたクエリ
fields 取得する課題のフィールド
(デフォルトは「*all」で全取得、「-<フィールド名>」で除外可能)
startAt 取得する課題の開始位置(0以上)
maxResults 一回のリクエストで取得するチケット数の上限
(デフォルトは「50」、最大値は「1000」)


検索処理は複数プロジェクトを横断的に行うので、ここでは対象となるプロジェクトだけ抽出します。また、検索処理では複数課題の全フィールドを取得できますが、レスポンス時間が長くなるので、ここではコメント以外の必要なフィールドだけを取得します。

設定画面のstartAtパラメータの値が${offset}になっていますが、これは「offset」というスクリプト変数を参照していることを表します。一覧取得の処理で一回のリクエストで取得できる課題の上限はmaxResultsに依存します。課題数がmaxResultsよりも多い場合は、複数回に分けて取得する必要があります。そのときは取得した課題数をoffsetに記録することで、次回のリクエストで取得済みの課題を飛ばして次の課題から取得できます。

上記設定で「GET実行」処理を実行すると、レスポンスは以下のJSONデータになります。

{
...
"startAt":0,
"maxResults":100,
"total":4,
"issues":
[
{
...
"id":"10300",
...
"key":"DSTN-4",
"fields":
{
"summary":"REST APIで課題を検索する方法を調べる",
"created":"2015-03-03T10:23:25.266+0900",
"description":"REST APIでJIRAの課題を検索する方法を調べるクモ!",
"assignee":
{
...
"displayName":"もっくん",
...
},
"priority":
{
...
"name":"中",
...
},
"resolution":
{
...
"name":"修正済み"
},
"updated":"2015-03-03T10:44:25.972+0900",
"status":
{
...
"name":"解決済み",
...
}
}
},
...
]
}

issues内の要素は課題に対応します。課題の主な子要素、属性の説明は以下のとおりです。

要素・属性名説明
summary 課題の要約
created 課題作成日時
description 課題の説明
assignee.displayName 担当者の名前
priority.name 優先度(表示値)
resolution.name 解決状況(表示値)
status.name ステータス(表示値)


レスポンスのtotalは検索に一致する課題総数で、issuesは一致した課題の一覧で、idとkeyは課題のIDとキーになります。後続の繰り返し処理で、issuesの要素ごとでコメントを取得します。

課題コメント取得


課題コメントを取得するために使用したRESI APIは以下になります。

GET /api/2/issue/[課題IDまたはキー]/comment

issuesを要素ごとで分割し、その中の課題キーを取得してスクリプト変数に代入します。設定したスクリプト変数は後続のRESTアダプタの「GET実行」処理の[パス]で参照します。

RESTアダプタの「GET実行」処理の設定画面は以下のようになります。

[必須設定]
課題コメント取得REST設定

上記設定で「GET実行」処理を実行すると、レスポンスは以下のJSONデータになります。

{
"startAt":0,
"maxResults":1,
"total":1,
"comments":
[
{
...
"author":
{
...
"displayName":"もっくん",
...
},
"body":"検索方法はここに書いてあるよ~\r\nhttps://developer.atlassian.com/jiradev/api-reference/jira-rest-apis/jira-rest-api-tutorials/jira-rest-api-example-query-issues",
"updateAuthor":
{
...
"displayName":"もっくん",
...
},
"created":"2015-03-03T10:44:25.972+0900",
"updated":"2015-03-03T10:44:25.972+0900"
}
]
}

comments内の要素は課題の1つのコメントに対応します。コメントの主な子要素、属性の説明は以下のとおりです。

要素・属性名説明
author.displayName コメント作成者の名前
body コメント内容
description 課題の説明
updateAuthor.displayName コメント最終更新者の名前
created コメントの作成日時
updated コメントの最終更新日時


 

課題をGoogleスプレッドシートに出力


Googleスプレッドシートアダプタの「書き込み」処理で、課題のデータを挿入します。書き込み先のファイルはGoogleスプレッドシートのWeb画面上で作成しておきます。

Googleスプレッドシートアダプタの「書き込み」処理の設定画面は以下のようになります。

[必須設定]
課題書き込み_必須設定

[書き込み設定]
課題書き込み_書き込み設定

スクリプト完成


スクリプトの完成イメージは以下のようになります。
スクリプト

スクリプト実行


スクリプトを実行し、処理が成功すると、Googleスプレッドシート上に用意されたファイルは更新されます。その内容は以下のようになります。
スプレッドシート出力画面

まとめ


RESTアダプタとGoogleスプレッドシートアダプタを使うことで、JIRAの課題取得と集計後のデータ共有を実現できました。

今回利用したJIRAのREST APIはGETでの課題検索とコメント取得のみですが、POSTでの処理も提供されているので、新規課題の作成やコメント追加も可能です。

以前の記事で取り上げたRedmineとの連携、そして今回の記事で説明したように、DataSpiderを利用することで、様々な課題管理システムと簡単に連携できます

コメント

ログインしてコメントを残してください。

Powered by Zendesk