GitHub Contributionsを通知してモチベを監視する
最近継続して開発ができているので監視するようにした。
連続Contributionsを絶やさないようにするのが主な目的。
slackに通知するCronJobをk8s上に置いておいた。
そのCronJobがやることは以下のようなことを行う。
- 20時と23時の2回に分けてslackにその日のcontribution状況を通知する
- 23時の通知時点でその日のcontributionが0だった場合は
@channel
メンションを行う
- 23時の通知時点でその日のcontributionが0だった場合は
- contribution情報は
https://github.com/${username}
で表示される情報から構築する- 1年分の情報+今日の情報+昨日の情報が拾える
- 昨日とcontributionのトータル値が変動したかを検出するためにstateはfirestoreに保存する
- 通知する前に昨日のcontribution情報を拾って差分を含めて通知する
このようなことをして以下のような通知を行っている。
昨日のcontributionトータル値を比較するのはfirestoreのデータを置かなくても検出可能だが楽なので使っている。
継続日数がいつの間にか割と続いてしまっているので、続けれそうなうちはこのbotで監視していきたいと思う。
今日はcommitしたっけ...?みたいな不安から解消されやすくなったので良かった。
ロジック
シンプルな実装しかしていないが一応。
- golangで
https://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円運用だと思うので採用した。
ちょっとした永続化データを置きたいときに便利。