理系学生日記

おまえはいつまで学生気分なのか

GraphQLでMerge Request上のコメントを抽出する

開発プロジェクトでGitLabを使っている場合、 Merge Requestを使って開発を進めていくことが多いでしょう。 このときMerge Requestにレビュアーやレビューイが投稿していくコメントを一覧抽出するものを作りました。

こんな感じで抽出ができます。

$ node dist/index.js --repo eponas/epona --branch develop | jq -r 'select(.author == "Yuichi Kiri")' > comments.kiririmode
$ cat comments.kiririmode | jq . | head -11
{
  "mergeRequest": "gid://gitlab/MergeRequest/114245792",
  "title": "v0.2.5リリース準備",
  "approvedBy": "Ryota Yoshinouchi/Yuichi Kiri",
  "mergeRequestCreatedAt": "2021-08-27T09:11:17Z",
  "mergeRequestMergedAt": "2021-08-31T01:26:30Z",
  "id": "gid://gitlab/DiffNote/663305862",
  "author": "Yuichi Kiri",
  "body": "PR主旨とは異なるのですが、CHANGELOG に api_gateway への言及が必要ですね。",
  "url": "https://gitlab.com/eponas/epona/-/merge_requests/379#note_663305862"
}

JSONL形式の出力になっているので、jqとかを使ってフィルタリングしたり、 CSVに出力することを想定しています。

$ node dist/index.js --repo eponas/epona --branch develop \
  | jq -r 'select(.author == "Yuichi Kiri")' > comments.kiririmode 

リファクタやSIGPIPE対応も含め、やりたいことは色々ありますが、とりあえず動くところまではできた。

モチベーション

品質管理の負荷を下げたい

SIの世界では品質管理の一環として、どの程度の指摘数があったのか、どのような指摘の傾向があるのかを分析し、 それら傾向に応じた品質改善策を打つということがあります。 もちろんそのような品質管理が奏功するか否かは規模をはじめとするプロジェクト特性に依存するのですが、 いざ「必要」となったときに、指摘を手動で抽出するのは極めてダルい。 抽出するのがダルいからといって、Excelに指摘を書いていくのもまたダルい。 そういうわけで、何かしら自動あるいは半自動で指摘の抽出・集計をしたいなと感じていました。

指摘コメントを抽出できるAPIがあれば良いのですが、REST型で抽出していくのもまたダルいことは容易に想像できます。 RESTのつらみはリソースが階層構造を取る場合にあり、そうなるとリソースに対する情報参照を数珠繋ぎしていかなければ欲しい情報が抜けません。

しかし、最近はGitLab/GitHubといったVCS ProviderはGraphQLでのAPIを提供しており、 これを使えれば楽できるのではないかと考えました。

TypeScript/GraphQLを使ってみたい

ぼく自身がGraphQLを扱ったことがないこともあり、なんとか実際に使ってみたい。 そこで得るものも色々あるでしょうし、その学びこそがIT業界の楽しさですね。

GraphQL+TypeScriptの組み合わせがとてもよかった

個別の技術についてはそれぞれエントリを起こすつもりですが、 GraphQLのスキーマかたらTypeScriptの型情報を自動生成できるGraphQL Code Generatorが非常によかったです。

GraphQLはさまざまな情報が取得できますし、 Cursor-based Paginationあたりも混じってきます。 そうすると、「このフィールドの型ってなんだっけ」というのがとにかく混乱します。

当初は全部anyで記述していたのですが、console.logデバッグが極めて苦行でした。 しかし、いざ上述のgraphql-codegenを入れて開発するようになると、TypeScriptで補完が効くようになり、別次元の心地よさです。

$ npm run codegen

さえしておけば、GraphQLサーバからスキーマ情報を抽出し型を自動生成してくれるため、 GraphQLサーバ側の進化にも容易に対応できそうです。

おそらくはTypeScriptに限ったものではなく、こういったGraphQLスキーマファーストのアプローチは さまざまな言語で行われているのでしょう。技術というのはあっという間に進んでいるものだなと実感します。