Actionsで特定のラベルがついたissueをスプレッドシートで管理する

表題の通り。 会社で問合せ内容をissue管理しているのだが、それをデータベースにして傾向分析をしたい、となった。

スプレッドシートにissueの一覧を持ってきて、問合せの調査結果などを踏まえて事象をうまく分類していきたい。 最終的にはDatastudioにインポートしていい感じに傾向の可視化ができれば、というようなモチベーション。

GitHubのAPIを使って直接Datastudioにインポートすることもできるし、そういうデータ基盤づくりも進んではいる。 がしかし、対応結果などをそれに紐付けて分類していくとなると、より自由度の高いスプレッドシート上で管理・編集するのが都合が良かった。 それとGithubのAPIでまとめて取得するよりもできるだけリアルタイムでスプレッドシートに反映させたかったというのがありこのような仕組みを考えた。

ActionsとGASの準備

issueで特定のラベルが付いたらアクションを実行

これは調べたら割とすぐ出てきた。 まず、issueにラベルが付与されたときに実行する方法は、こんなかんじ。

1on:
2  issues:
3    types:
4      ['labeled']

これでラベルが付与されたときに実行されるアクションがつくれる。 特定のラベルがついたときだけに限定したい場合は、つづけて条件を記載することもできる。

1if: |
2    (github.event.label.name == 'wontfix') || (github.event.label.name == 'bug')

日付の取得

アクションが実行される日時をこんなふうに取得できる。 Tokyoにタイムゾーンを設定しておけばOK。

当初はちょっと別の目的もあったので、ラベルがついた日時をスプレッドシート側に持っておきたかった。

最終的な今回の目的に照らせば、別にこの方法でなくてもどうとでもなりそう。 GAS側でPOSTされた日時を得ることも可能だし…

1- name: Setup timezone
2  uses: zcong1993/setup-timezone@master
3  with:
4    timezone: Asia/Tokyo
5- name: Get current date-time
6  id: date
7  run: echo "::set-output name=date::$(date +'%Y%m%d-%H%M')"

GASでスプレッドシート書き込み用のエンドポイントを用意する

これも調べたら割とすぐ出てくる。 doPostという関数が用意されてるので、そこにデータを突っ込むだけ。

スプレッドシートからスクリプトエディタを起動して、編集→保存→デプロイする。 すべてのユーザーに公開しないとcurlからたたけないので注意。

IDEの自動保存に慣れてしまっている私は、保存を忘れて変更が反映されてないままデプロイする、というのを数回繰り返してしまった。

 1function doPost(e) {
 2  var ss       = SpreadsheetApp.getActiveSpreadsheet();
 3  var sheet    = ss.getSheetByName('issue data');
 4  var PostData = JSON.parse(e.postData.contents);
 5  insertPostData(sheet, PostData);
 6}
 7
 8function insertPostData(sheet, data) {
 9  var url = data.url;
10  var title = data.title;
11  var label = data.label;
12  var time = data.time;
13  sheet.appendRow([url, title, label, time]);
14}
15

ActionsからデータをPOST

envをつかってアクションの中で使う環境変数を定義できる。 今回テストのためにissue上にもコメントを残して、GASにもPOSTする、というのをやったのでこうなっている。

GitHubのissueにコメントをPOSTするにはアクセストークンが必要なので別途用意して、リポジトリのsecretsに設定している。 ${{ secrets.ACCESS_TOKEN }} という形でsecretsの値は取得できる。

おなじく先程デプロイしたURLもsecretsに保存しておいて、そこに対してデータをPOSTする。

 1- name: Data post
 2  env:
 3    GITHUB_TOKEN: ${{ secrets.ACCESS_TOKEN }}
 4    URL: ${{ github.event.issue.url }}
 5    LABEL_NAME: ${{ github.event.label.name }}
 6    TIME: ${{ steps.date.outputs.date }}
 7    TITLE: ${{ github.event.issue.title }}
 8  run: |
 9    comments="$GITHUB_API_URL"
10    curl -X POST -H "Authorization: token $GITHUB_TOKEN" -d "{\"body\": \"$TIME\n$LABEL_NAME\"}" ${{ github.event.issue.comments_url }}
11    curl -X POST -H "Content-Type: application/json" -d "{\"url\": \"$URL\", \"title\": \"$TITLE\", \"label\": \"$LABEL_NAME\", \"time\": \"$TIME\"}" -L ${{ secrets.SPREAD_SHEET }}    
12

実行結果

こういうかんじで、ラベルをつけるとすぐにActionsがはしる。 ラベルの下のコメントはActionsからPOSTされたもの。

Actionsタブで実行の様子が確認できる。

スプレッドシートに追加された。 こちらで更に詳細な分類を入力して、Datastudioとかに突っ込んで分析に役立てることができる。

リポジトリ