薄いブログ 〜全てが薄い〜

だいたい酔った勢いで書いてる

github issueを精査するのが嫌だったのでapp scriptで一括取得してみた

エンジニアのタスクを工数管理表に自動的に反映する

 

githubでソフトウェア開発を管理していると、issueというものが溜まっていきます。

 

簡単に言うと「〇〇さん、こういうタスクをやってね」

という約束毎をissueという形にして、githubというwebサービスで管理しているのですが、これが開発終盤の受け入れテスト時期に差し掛かってくると

 

「あれ、このタスクお願いしたはずなのに進んでいない・・・」とか

「そろそろ開発終わるのに、妙に残課題(issue)が多い・・・」

みたいなことが気になります。

 

というか、まさに今日それが気になっていました。

多分、開発現場に関わらず企画や営業の部署でも似たようなことは起きてるんじゃないでしょうか。

 

なので帰宅してから早速google app scriptを使って、githubのissueを一覧化しつつ、工数管理に使っているspreadsheetに担当者毎に反映するスクリプトを書いてみました。

 

以下のサイトを参考にしました(というか、ほぼコピーしています・・・) 

GoogleSpreadSheetにGitHub Issueの一覧を表示させる方法 - 連携の仕方 - Qiita

 

こんな感じ:

function myFunction() {

const GITHUB_ACCESS_TOKEN = PropertiesService.getScriptProperties().getProperty('api_token');
const GITHUB_API = 'https://api.github.com/repos' + '/' + GITHUB_OWNER + '/' + GITHUB_REPOSITORY + '/issues?access_token=' + GITHUB_ACCESS_TOKEN;
const COLUMN_TAG = 1;
const COLUMN_ASSIGNEE = 2;
const COLUMN_ISSUENUMBER = 3;
const COLUMN_TITLE = 4;
const COLUMN_URL = 5;

// ここからfetch

const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(SHEET_NAME).clear();
// ページ番号
var page = 1;

while (true) {
// GitHubAPIにアクセス
var url = GITHUB_API + '&page=' + page;
var response = UrlFetchApp.fetch(url);
var issues = JSON.parse(UrlFetchApp.fetch(url));

if (issues.length == 0) {
break;
}
// 取得した件数分を出力する
var skip_index = 0;
for(var index = 0; index < issues.length; index++) {

var range = START + index + 20 * (page - 1) - skip_index;
var milestone = issues[index]["milestone"];
var assignee = issues[index]["assignees"][0];

// issueのみ出力する
if (issues[index]["pull_request"] == null) {
if (milestone != null) {
sheet.getRange(range, COLUMN_TAG).setValue(milestone["title"]);
}
if (assignee != null) {
sheet.getRange(range, COLUMN_ASSIGNEE).setValue(assignee["login"]);
}
sheet.getRange(range, COLUMN_ISSUENUMBER).setValue(issues[index]["number"]);
sheet.getRange(range, COLUMN_TITLE).setValue(issues[index]["title"]);
sheet.getRange(range, COLUMN_URL).setValue(issues[index]["html_url"]);
} else {
// プルリクエストは除外するためカウントして出力行を調整する
skip_index++;
}
}
page++;
}

// 最終更新日時を記載
var lastRow = sheet.getDataRange().getLastRow();
var now = new Date();
var stringDate = Utilities.formatDate(now, "GMT+9", "yyyy-MM-dd HH:mm");
sheet.getRange(lastRow + 2, 1).setValue('最終更新: ' + stringDate);

// 入りきらないのでカラム幅を調整
sheet.autoResizeColumn(COLUMN_TITLE);

// 担当者毎にソート
var range = sheet.getDataRange();
range.sort(COLUMN_ASSIGNEE);
}

 

const使ってないとか変数使いすぎとか残念な出来ですが

一旦はこれにスクリプトプロパティから取ったapi_tokenやエンドポイントを入れれば

app scriptが定期的にissueを吐き出してくれるようになります。

(ごめんなさい、一部プロパティ取得してる部分を抜いてます)

 

更にissueのカテゴリ毎に工数見積もりを追加して各担当者に割り振れば、issueに紐づいてL2程度のスケジュールまで自動的に引けます。

 

チケットがcloseされたら工数管理表から削除することも可能なので、エンジニアが使うgithubとマネジメント層が使うspreadsheetを自動的に結びつけられて、報告の手間が省けます。

 

・閉じ忘れているissueの精査

・issue管理と工数管理の重複

・issueとL2の差分がたまに生じて、背景確認が必要

 

みたいな、コードを書く以外の無駄時間を省けるのでapp scriptは今後重宝しそう。

使ってみてよかった〜

 

 

相談できるエンジニアが身近にいる環境

 

エンジニアになってもうすぐ半年になりますが

やはり各部署に最低一人はエンジニアを飼っておくべきだな、と感じます。

 

営業や企画の部署では工数管理をexcel(マクロなし)で手作業コピペして運用していることも多々あるし、そういった部署にちょろりとapp scriptを入れれば相当の工数削減になると思うんですよね。

 

往往にしてそういった部署では

 

「技術的な話を相談する相手がいない」

「どのくらい費用がかかるのか相場がわからなくて頼みにくい」

「どこまで案件を検討した状態で相談すればいいのかわからない」

 

といった声が聞かれます。

 

とはいえ去年も営業部の方々にお話を伺ってから1ヶ月くらいで作った営業支援系のiPadアプリが大ウケした経験も経て

 

「エンジニアにとってはチョロだけど依頼側にとっては効果絶大」

 

みたいな案件がまだまだ社内外にゴロゴロ転がっているんだろうな、と。

相談できるエンジニアが近くに居る環境を整える大切さを感じた今日でした。