GoとGoogle App EngineでBackLogの鬼メールから解放される方法


何がしたい?

タスク管理をBacklogでやってるプロジェクトの場合、バンバンメールが飛びまくってしまう&メールのフィルタリングがしづらいのでメールの山になってしまうのがいまいちです(自分とそんなに関係ない細かい会話まで全部見るのはちょっと)。そこで、自分と関係ありそうな通知だけをある程度まとめてslackに流すボットを作ります。

なぜGo

以前javaでGAEのアプリ作ろうとしたときに、手順のあまりのめんどくささに挫折した記憶があるので、シンプルなGoでリベンジです。(appengine-web.xmlとか、web.xmlとか、、。そもそもGetしてPostするだけのクソアプリを作るのにeclipse開いてプロジェクト作るのも嫌です)。
hubotの使い方を覚えるのすらめんどいのでGoでべたべた書きます。

準備

API

Backlogの、自分へのお知らせ取得するAPIと
Slackの通知APIのエンドポイントをゲットします。(自分だけ使うので@Slackbotへ通知します)

BacklogのAPIドキュメント
SlackのAPIドキュメント

GAE

App Engineのチュートリアルを参考にSDKをダウンロードしたりします。

私はhomebrewでいれましたが。

$ brew install go-app-engine-64

ちょっと困ったところとして、Go GAEライブラリをインポートする際は

import "appengine"

という書き方をするのですが、appengineライブラリをシンプルに$GOROOT配下にgetしてくる事はできません

$ go get appengine # できない

"appengine"をimportする為にはGOROOTを、GAE SDK配下の"goroot"ディレクトリに設定してやる必要があります。

ただ私はGOROOT をいちいち切り替えるのがめんどくさかったので
GOROOT/packages/pkgの下と、GOPATHの下に、goroot下の"appengine"ディレクトリと"appengine_internal"へのシンボリックリンクを張る事にしました。
(go buildしたら、あともう一つ何か必要だとエラーが出ましたが、これは普通にgo getできます。なんだったか忘れました)

書く

ソース

GAEアプリとして認識させるためにはapp.yamlを作って、チュートリアルから8行ほどコピペするだけです。
(appengine-web.xmlとは大違いの簡単さ)

main.goでやってる事はBacklog APIからお知らせをGetしてSlackボットへPostするだけです。
お知らせは既読のものを弾いたり前回取得した物はとらないようにMinIdを指定したりしてます。

注意点は、httpクライアントはgoのhttpパッケージのものではなく、appengine/urlfetchというパッケージの物を使う必要があることです(GAEのURL Fetch Quotaの制御のためですね)

で、これはappengineのContextから貰う必要があり、appengineのContextを取得するためにはhttp.Requestが必要になります。
つまり必ずwebアプリにする必要があるようです(多分)
goroutine内でぐるぐる回してGet,Postしようかと思ってましたが、できません。

どうやって定期的にGet,Postするかですが、GAEはcronを用意してくれているのでそれを使って定期的にURLを叩きます。cronを使うには、簡単なcron.yamlをコピペして作るだけです。

動かす

ローカルで動かすには

$goapp serve

デプロイは、web上のGAEのコンソールへログインしてプロジェクトを作り、

$goapp deploy -oauth -application project_id

をたたきます。立ち上がりが早いです。

GAE簡単で良い

herokuよりもさくさくデプロイまでたどり着いたイメージです。
必要なファイルは3ファイルのみ。