Money Forward Developers Blog

株式会社マネーフォワード公式開発者向けブログです。技術や開発手法、イベント登壇などを発信します。サービスに関するご質問は、各サービス窓口までご連絡ください。

20230215130734

Jira Cloud for Sheets, Google Apps Script, Google Data Portalを使って、日次で不具合消化状況を可視化してみた

この記事はマネーフォワードアドベントカレンダー2021🎄の2日目の記事です。   こんにちは!HRソリューション本部でQAエンジニアをしている森田です。 HRのQAグループでは、HR領域の複数プロダクトに対する品質保証活動を行っています。

私は、2021年8月末に1stリリースを迎えたクラウド年末調整のテストマネージャー(自称)として、テスト計画〜テスト進捗管理〜不具合管理に携わっていました。

さて、みなさんは、どのように不具合消化状況(次のリリースで消化予定の不具合チケット件数とその進捗)を把握されていますか?

なるべく開発チームの工数(コミュニケーションコスト含む)を取らずに、不具合の消化状況を見れないか、重要度の高い不具合が溜まってきた時に気づけるようにできないか。そんなことを考え、Jira Cloud for Sheets, Google Apps Script, Google Data Portalを使って、クラウド年末調整の不具合消化状況を可視化してみることにしました。

すでに利用していたツール

  • 案件や不具合の管理:Jira Software
  • コミュニケーションツール:Slack

 

行ったこと(最終アウトプットイメージ)

1.不具合消化状況の可視化(日次)

  • 各月(リリースごと)の不具合総数、不具合残数(Sprintが今回、かつ、進捗が未完了)、完了不具合件数(Sprintが今回、かつ、進捗が完了)

2."BUG"かつ"highest"かつ"未完了"のチケット番号をSlackで通知(日次)

(余談)なぜ懐中電灯なのかについては、こちらの記事をご覧ください。 【隣のQAに聞く! #3】マネーフォワード 森田 麻沙美 氏 『QAは開発の「先」を照らす「懐中電灯」』

なぜ行ったか(目的)

関係者みんなの想い

  • 日々開発が進み、日々不具合が報告されている中で、リリース可能な品質で、期日通りに1stリリースを出したい。
    • どのくらいの量の不具合がリリース前に検知されていて、いつまでにどのくらい修正する予定なのか、その量が現実的なのか。順調に不具合を消化しているのか。
    • 👉 1.不具合消化状況の可視化
    • あまりに多くの不具合が溜まってしまうと、不具合を修正しきれないことも想定されます。
      • もちろん、インパクトが小さい不具合は修正を一旦見送ることもありますが、優先度がhighest,highの不具合がたくさん溜まっている=リリース可能な品質に到達していない=リリース延期の可能性につながります。溜まらないようにウォッチしたい。 
    • 👉 2."BUG"かつ"highest"かつ"未完了"のチケット番号をSlackで通知

まずは手動で可視化し、後にツールを利用して、自動で出力できるようにしました。 本記事は、ツールで自動出力した時の話になります。

行ったこと(詳細)

1.不具合消化状況の可視化

  概要 実行方法 頻度
1-1 JiraでLabel=BUG、かつ、スプリントに「 8月(件数を見たい月、複数月でもOK)」を含むチケットを抽出し、GSSに出力 Jira Cloud for Sheets 毎時間
1-2 各月の不具合件数をカウント GSS関数 -
1-3 カウントした値を、データポータル連携用の「対応不具合の進捗データ」シートにコピペ GAS 毎日17-18時
1-4 「対応不具合の進捗データ」シートのデータをデータポータルに反映 Google Data Portal 毎15分

1-1.JiraでLabel=BUG、かつ、スプリントに「 8月(件数を見たい月、複数月でもOK)」を含むチケットを抽出し、GSSに出力

【プログラミング不要】JIRAとスプレッドシートを連携しバグ集計する こちらの記事を参考に、

  • GSSと Jiraを連携
  • Jiraで作成済みの「フィルタ」画面にて、JQLを確認
  • GSS側でJQLと実行頻度を指定

👇すると、このような形式で、チケットデータが出力されます。

1-2.各月の不具合件数をカウント

👇1-1のチケット一覧が更新されると、「計算」シートの関数により数字が更新されます。

8月不具合総数の関数(Sprintに「Aug」を含む)

=COUNTIFS('Sprint_BUG'!L:L,"*Aug*")

8月完了不具合件数(ステータスが「完了」かつSprintに「Aug」を含む + ステータスが「WON'T FIX」かつSprintに「Aug」を含む

=COUNTIFS('Sprint_BUG'!G:G,"完了",'Sprint_BUG'!L:L,"*Aug*")+COUNTIFS('Sprint_BUG'!G:G,"WON'T FIX",'Sprint_BUG'!L:L,"*Aug*")

1-3.カウントした値を、データポータル連携用の「対応不具合の進捗データ」シートにコピペ

GASについては、以下を参考にしました。

(もっとキレイに書けるとは思うのですが・・・)

function getUsedRowCount(sheet, rowName) {
    var values = sheet.getRange(rowName + ':' + rowName).getValues();
    return values.filter(String).length;
}

function copyPaste2() {
  var sh1 = SpreadsheetApp.getActiveSpreadsheet()
  var sheet1 = sh1.getSheetByName('計算')
  var sheet2 = sh1.getSheetByName('対応不具合の進捗データ')
  //2.残不具合件数データ作成
  //8月不具合総数 コピー対象のセルを選択する
  var copyValue1 = sheet1.getRange('B26').getValues();
  console.log(copyValue1);
  
  //8月不具合総数 ペースト先のセルを指定
  var targetRow = getUsedRowCount(sheet2, 'B') + 1;
  sheet2.getRange('B'+targetRow).setValue(copyValue1);


  //8月完了不具合件数 コピー対象のセルを選択する
  var copyValue2 = sheet1.getRange('E26').getValues();
  console.log(copyValue2);

  //8月完了不具合件数 ペースト先のセルを指定
  var targetRow2 = getUsedRowCount(sheet2, 'E') + 1;
  sheet2.getRange('E'+targetRow2).setValue(copyValue2);


  //9月不具合総数 コピー対象のセルを選択する
  var copyValue1 = sheet1.getRange('F26').getValues();
  console.log(copyValue1);
  
  //9月不具合総数 ペースト先のセルを指定
  var targetRow = getUsedRowCount(sheet2, 'F') + 1;
  sheet2.getRange('F'+targetRow).setValue(copyValue1);

  //9月完了不具合件数 コピー対象のセルを選択する
  var copyValue2 = sheet1.getRange('I26').getValues();
  console.log(copyValue2);

  //9月完了不具合件数 ペースト先のセルを指定
  var targetRow2 = getUsedRowCount(sheet2, 'I') + 1;
  sheet2.getRange('I'+targetRow2).setValue(copyValue2);


  //10月不具合総数 コピー対象のセルを選択する
  var copyValue3 = sheet1.getRange('J26').getValues();
  console.log(copyValue3);
  
  //10月不具合総数 ペースト先のセルを指定
  var targetRow = getUsedRowCount(sheet2, 'J') + 1;
  sheet2.getRange('J'+targetRow).setValue(copyValue3);


  //10月完了不具合件数 コピー対象のセルを選択する
  var copyValue4 = sheet1.getRange('M26').getValues();
  console.log(copyValue4);

  //10月完了不具合件数 ペースト先のセルを指定
  var targetRow2 = getUsedRowCount(sheet2, 'M') + 1;
  sheet2.getRange('M'+targetRow2).setValue(copyValue4);


  //11月不具合総数 コピー対象のセルを選択する
  var copyValue3 = sheet1.getRange('N26').getValues();
  console.log(copyValue3);
  
  //11月不具合総数 ペースト先のセルを指定
  var targetRow = getUsedRowCount(sheet2, 'N') + 1;
  sheet2.getRange('N'+targetRow).setValue(copyValue3);

  //11月完了不具合件数 コピー対象のセルを選択する
  var copyValue4 = sheet1.getRange('Q26').getValues();
  console.log(copyValue4);

  //11月完了不具合件数 ペースト先のセルを指定
  var targetRow2 = getUsedRowCount(sheet2, 'Q') + 1;
  sheet2.getRange('Q'+targetRow2).setValue(copyValue4);
}

👇上記のGASを実行すると、「計算」シートの値を「対応不具合の進捗データ」シートの行の一番下にコピペされます。

8月残不具合件数 = 8月不具合総数 - 8月完了不具合件数 =B2-E2

1-4.「対応不具合の進捗データ」シートのデータをデータポータルに反映

データポータルでの設定

  • データソースとして該当のGSSをインポート
  • 指標で不具合総数、不具合残件数、完了不具合件数を指定
  • 並べ替えで日付昇順を指定
  • データの更新頻度を指定

👇上記の設定により15分間隔でグラフが更新されるようになります。

2.BUGかつhighestかつ未完了(Won'tFix,完了以外)のチケットをSlackで通知

  概要 実行方法 頻度
2-1 JiraでLabel=BUG、かつ、優先度がhighest、かつ、ステータスが未完了(Won'tFix,完了以外)のチケットを抽出し、GSSに出力 Jira Cloud for Sheets 毎日13-14時
2-2 チケット番号をSlackのチャンネルに通知 GAS,webhook 毎日14-15時

2-1.JiraでLabel=BUG、かつ、優先度がhighest、かつ、ステータスが未完了(Won'tFix,完了以外)のチケットを抽出し、GSSに出力

手順としては、1-1と同じになります。抽出したいチケットの条件(JQL)が異なるだけです。

2-2.チケット番号をSlackのチャンネルに通知

スプレッドシートの中身をGASでslackに流すbot作ってみた こちらの記事を参考にしました。

👇すると、このようにSlackに流れてきます。

実施した結果

可視化をしたメリット

関係者間で優先度highest,highとは何かという議論が発生しました(良いこと)。これにより、1stリリースに向けてどんな不具合が優先度高いのかという認識合わせをすることにもつながりました。

また、リリース判断の基準としても利用されました。リリースまで残り1週間以降は、highestが2件以上出たらリリース延期にならざるを得ない、という品質上の判断基準になりました。

リリース1週間前は、日次で不具合の残件数と進捗を関係者にレポートし、(highest不具合がないことを祈りながら)ドキドキしながら見守っていました。直接は開発に携わっていない上層レイヤーの関係者にもPJの進捗を品質という側面からレポートできたので、やばそうな兆候があったらすぐに気づけそうという安心感を提供することはできたと思います。

自動化をしたメリット

手動で行っていた時は、毎日15分ほどかけて作業していました。大した作業量でもないので、自動化しても大きなメリットはないかなと思っていました。

しかし、実際自動化してみて、一番メリットだと感じたのは、毎日の作業を意識しなくてよくなったことです。忘れないようにしなきゃ、なるべく同じ時間帯にデータを出力しよう、といつも頭の片隅にこのタスクが存在していたことに気がつきました。

自動化により、気になったときにデータポータルの数字を見にいけば良いという状態になりました。(もちろん、自動化した直後の1週間くらいは、毎日結果を確認して、きちんと結果が表示されているか確認してました。)

さいごに

たった15分、されど15分。 可視化する前は、何も見えない、暗闇の中を歩いているような、そんな状態でした。 そんな中で色々トライしてみようと思い、色んな指標を考えて計測して、分析して、また違う指標で計測してみたり、別の情報を付加したり。

今回は1stリリースに向けてのデータの可視化をしましたが、運用フェーズで見たい情報は違ってくることもあると思います。

まずは、手動で計測してみる。継続して計測するのが良さそうと判断した自動化して、空いた時間にまた別の指標で計測したり、蓄積されたデータを分析する。

懐中電灯くんの、不具合の可視化、品質の可視化の旅はまだまだ続きそうです。


マネーフォワードでは、エンジニアを募集しています。 ご応募お待ちしています。

【サイトのご案内】 ■マネーフォワード採用サイトWantedly京都開発拠点

【プロダクトのご紹介】 ■お金の見える化サービス 『マネーフォワード ME』 iPhone,iPad Android

ビジネス向けバックオフィス向け業務効率化ソリューション 『マネーフォワード クラウド』

おつり貯金アプリ 『しらたま』

お金の悩みを無料で相談 『マネーフォワード お金の相談』

だれでも貯まって増える お金の体質改善サービス 『マネーフォワード おかねせんせい』

金融商品の比較・申し込みサイト 『Money Forward Mall』

くらしの経済メディア 『MONEY PLUS』