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が安い

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を確認

先月の実績

ちゃんと無料割り当て枠内に収まっている

まとめ

GithubのPRリマインダをGAE/Goで作った話

By Takeshi Akima

GithubのPRリマインダをGAE/Goで作った話

  • 566