GithubのPRリマインダをGAE/Goで作った話
@akm
Groovenauts, Inc.
秋間武志
- @akm
- Groovenauts
- テクニカルコンサルタント
- プログラマ
- 福岡に来て7年
- 週イチ副社長
gopkg.in/go-playground/validator.v9
に送ったPR
Groovenauts?
- MAGELLAN BLOCKS
- TECHPARK
MAGELLAN BLOCKS
TECHPARK
本題
現在開発中のプロジェクト
実質的なコミッタは7人
プロジェクトマネージャ的な立場からすると、できるだけ早くPRをマージしてIssueをDONEにしてほしい
手動でPull Request の
リマインダを送っていた日々
めんどくさい
外部のサービスはちょっとお高い
OSS使うなら自分でサーバを用意しなきゃ
仕方ない
自分で作ってみよう
アーキテクチャはGAE
- GAEはGoogle App Engineの略
- 本番環境の構築不要
- デプロイ簡単
- スケールアウトが簡単
- デフォルトでHTTPS
- Let's Encryptの証明書が何もしなくても使える
- 無料割り当て枠
- GAE: 28 時間の無料インスタンス時間/日
- Datastore: 1 GB まで無料。
- etc...
GAEのSEとFE
SE(Standard Environment)とFE(Flexible Environment)は
似て非なるもの
Standard Environment | Flexible Environment | |
---|---|---|
言語 | Go, Java, PHP, Node.js, Python | Dockerコンテナなら何でもOK (例えば.NETやRubyも) |
起動時間 | 速い | 遅い(だから常時起動) |
料金 | インスタンス時間に基づく | vCPU、メモリ、永続ディスクの使用量に基づく |
GAE/SEが安い
-
基本スケーリング
-
リクエストに応じて起動
- アプリケーションがアイドル状態になると無効に。
https://cloud.google.com/appengine/docs/standard/go/how-instances-are-managed#scaling_dynamic_instances
-
- 無料割り当て枠
-
1日に100回くらいしか動かないなら
余裕で無料割り当て枠に収まるはず
-
GAE/SE+Goが速い
- GAEのインスタンス(コンテナ)の起動が速い
- Go言語なら500msくらいで起動(spinup)
文系プログラマによるTIPSブログ より引用
https://www.bunkei-programmer.net/entry/2018/06/13/232912#結果と平均値まとめ
定期的な呼び出しどうする?
- cron.yaml?
- 変更したくなったらデプロイし直さないと。
- それは嫌だ
- どこかのサーバのcrontabに設定する?
- どこで設定してるのか忘れそう
- 関係ないものを混ぜるのは嫌だ
Slack の /remind でOK
- NG
- /remind @bot pull_requests every weekday at 10am
- 「すみません。リマインダーをボットに送ることはできません」と謝られる
- OK
- /remind #channel-name "@bot pull_requests" every weekday at 10am
これなら時刻の変更も簡単!
Slackのボットの実装方法
- Incomming webhooks
- Slash command
- Bot (with RTM API)
- Bot (with Events API)
https://api.slack.com/internal-integrations
メンションに応答できるのは後者2つのうちのどちらか。
RTM APIの方はクライアント側の実装なので今回は不向き。
よってEvents APIを使う必要がある
Events API
https://api.slack.com/events-api
めんどくさそう・・・
https://github.com/nlopes/slack/blob/master/examples/eventsapi/events.go
ライブラリのサンプルのおかげでめんどくなかった!
実装完了
- Cloud Datastore
- GithubのレポジトリとSlackのチャネルの関連付け
- GithubのユーザーとSlackのユーザーの関連付け
Stackdriver Loggingで
応答速度をログから確認
Slackdriver Loggingをちらっと見た感じではPRリマインダが
1秒超えで、それ以外はだいたい200〜600ミリ秒っぽく見える
Stackdriver Monitoringで
レイテンシー 50th percentileを確認
先月の実績
ちゃんと無料割り当て枠内に収まっている
まとめ
- 作ったもの
- Groovenauts
- MAGELLAN BLOCKS
- エンジニア募集中
- GAE/Go
- 安くて速い
GithubのPRリマインダをGAE/Goで作った話
By Takeshi Akima
GithubのPRリマインダをGAE/Goで作った話
- 566