おでーぶでおでーぶ

いろいろ書く。いろいろ。

GitHubなどで Issue/PR ごとに情報を読み書きする

GitHub などを使っていると PR Review だのなんだのを自動化したくなりますよね。

ただ GitHub Issue などには Issue ごとの metadata attachment みたいなものがなく、何かしらの方法で情報を保存する必要があります。

CI のキャッシュを用いて、キーを PR URL などにすれば1対1のデータリレーションが作成できますが、ここにも CI ごとの特性や複数の情報保持などで少々面倒くさいことになります。

例えば CircleCI だと同じキャッシュキーへのデータ上書きはできない *1 ため、PR URL をキーにしてデータを保存するということが困難です。

そこで Issue/PR/comment Body が markdown (もとい HTML rendering) であることを利用して、Issue/PR ごとにデータを保存する方法を紹介します。

<!-- <metadata name>/<ここに json を埋め込む> -->

↑のように HTML コメントを利用するだけです。HTML コメントは見かけ上 rendering されないため、見た目を損ねることなくデータの保持が可能です。 *2

あとは以下の流れで json を取り出し、よしなにしましょう。

  • Issue/PR/comment body を DOM Tree に変換
  • Comment Node だけ filter
  • metadata name で filter
  • 該当 node の text content から <metadata name>/ を削除し、JSON にパースする
  • よしなにする

これの使い方は本当に多様で、利用方法の一例は別の記事で紹介します。

*1:expire した場合は新規書き込みと見なしており、上書きのときに限ります

*2:これは danger などで実際に利用されているテクニックです。