839の日記

趣味の話を書くブログです。

GitHub Contributionsを通知してモチベを監視する

最近継続して開発ができているので監視するようにした。
連続Contributionsを絶やさないようにするのが主な目的。

slackに通知するCronJobをk8s上に置いておいた。
そのCronJobがやることは以下のようなことを行う。

  • 20時と23時の2回に分けてslackにその日のcontribution状況を通知する
    • 23時の通知時点でその日のcontributionが0だった場合は @channel メンションを行う
  • contribution情報は https://github.com/${username} で表示される情報から構築する
    • 1年分の情報+今日の情報+昨日の情報が拾える
  • 昨日とcontributionのトータル値が変動したかを検出するためにstateはfirestoreに保存する
    • 通知する前に昨日のcontribution情報を拾って差分を含めて通知する

このようなことをして以下のような通知を行っている。

f:id:husq:20191110183828p:plain
slack

昨日のcontributionトータル値を比較するのはfirestoreのデータを置かなくても検出可能だが楽なので使っている。
継続日数がいつの間にか割と続いてしまっているので、続けれそうなうちはこのbotで監視していきたいと思う。
今日はcommitしたっけ...?みたいな不安から解消されやすくなったので良かった。

ロジック

シンプルな実装しかしていないが一応。

  • golanghttps://github.com/${username} をhttp.Get
    • stringとしてparseして必要な情報を拾う(rectとtotal値)
    • total値は計算可能のはずだが、計算するのとUIで微妙に違うのでUIの値を採用
  • 上記で取得した日付ごとの情報を構造体に落とす
type Contribution struct {
    Date  time.Time
    Count int
}
  • 他にもう少しメタ情報を付与してfirestoreに永続化
  • 昨日の情報をfirestoreから引き、昨日からの差分を検出する
  • 結果をまとめてslackにpost
    • 昨日より下がってたらcolorをdangerにしたり
    • 一定時間を超えても0だったらchannelメンションをするようにしたり

色々goのライブラリで便利そうなものはあったが、依存を増やすとイメージサイズがかさむし、依存の管理も面倒になる。
このぐらいのツールであれば自分で書いたほうが楽かな、という判断でライブラリは使わなかった。

firestoreにデータを置いているが、多分1日数回程度の通信なら0円運用だと思うので採用した。
ちょっとした永続化データを置きたいときに便利。