PullRequestに書かれたIssueやPRを自動でプロジェクトの指定したカラムに動かすやつ

というのを、そういえばこないだ作っていた。

意味わからんと思うので、Gifを見るほうがはやいはず。

https://raw.githubusercontent.com/1natsu172/github-action-auto-move-related-issue/b32ac32e466fe77b3442cc3e5cd348f5d87bd024/media/work-demo.gif

  1. PRの本文に Issue という段落を作る
  2. 段落内に #1234https://github.com/<Org名>/<Repository名>/issues/1234 という記述形式でIssueや別PRを書く
  3. PRがcloseされたりマージされたりしたら
  4. 書いておいたIssueやPRがプロジェクトの指定したカラムに自動で追加・移動される

というやつ。

リポジトリはここ。

github.com

ちなみにいまのバージョンでは GitHub自体のマージされたら自動でcloseされる fixed #1234 みたいなやつは除外するようにしている。プレフィックスキーワードがついてないIssue・PRのみ対象になる。

仕組み

PullRequestがマージされたりすると、GitHub Actionで得られる情報(Context)のなかに対象のPRのアレコレが入ったオブジェクトがある。

この中にbodyというプロパティがあり、ここにPRの本文が入っている。# Issue\n\n#1234\n\nhogefugapiyo\n\n# Summary\n\nsugoi pr desuという形式で乱暴に入っている。なのでこれをひらすら正規表現でパースしてIssueナンバーorURLを抜き取ってガンバリでやっている。

  1. bodyからIssue段落内に書かれたIssue・PRの短縮記法|URLだけを取り出す
  2. 各対象のナンバー #1234なら1234https://github.com/~~/999 なら999を取り出す
  3. GitHub APIを用いて、リポジトリ中の2.でとれたIssue/PRの内部IDを取ってくる(一緒にすでに配置してあるカンバン名やカードの内部IDもとる)
  4. GitHub APIを用いて、configに書かれた対象のカンバンとカラムの内部IDを取ってくる
  5. 3.で取った内部IDを元に4.の情報とカードの情報を突合する
  6. 対象カンバンの別カラムに既にあるカードはmove、カード未作成のものはaddの処理をGitHub APIを用いて行う

だいたいこういう具合。

めちゃくちゃ愚直だし、めちゃくちゃ地味。

所感

めちゃくちゃエッジニーズなActionのはずで、誰も彼もが使いてぇ〜〜〜ってなるやつじゃないと思っている。普通ならPRマージしたら該当のIssueはプレフィックスをつけておいて自動closeさせる、でOKだと思う。

なんでこんなものを作ったのかというと、closeしたあとに本当に正しく実装されているのかを確認する担当者がいて、そのチェックをパスしたらcloseするという運用をしたかったから。そのためにマージされたら、「このIssueに関するものが実装完了しましたよ」ということがわかる必要があり、それを一箇所に集めたいというニーズが生まれる。一箇所に集めさえすれば担当者は集まってきたものをさばくだけでOKという状態になれるので、そういうユースケースのためにこのアクションを作った。

こういう背景があるからおそらく汎用性はなくて、本当にエッジなアクションだと思っている。

正直OSSにしておくかどうか作っている最中もめちゃくちゃ悩んだのだけど、それでもまあもしかすると世界にはごくごく少数同じ気持ちの人間がいるかもしれないという気持ちになったので、一旦OSSにしておいた。

そういうわけなのでふとこういうことをやりたいなっていう気持ちになったら思い出してください、というスタンスでやっている。

TypeScriptでPromiseの返り値の型をNonNullableにする

表題の欲求が発生して、ハマったので色々調べていた結果のメモ。

こういう感じだった。

gist.github.com

ようは、Utility型を使ってPromiseの返り値をゲットしてNonNullableにしてPromiseに戻す というそれだけのはなし。ConditionalTypeの解説はここではしない。

Utility型のライブラリはいくつかあるけど以下2つが有名で、どっちも使いやすいし今回の目的に沿ったUtil型はどっちのライブラリにもある。

わかれば、そうだねってなるけど書いておかないと忘れそうなので書いた。