はじめに
勉強会の情報を定期的にpush通知してくれるslackアプリを作った。
こんな感じでpush通知したい勉強会の条件を設定すると、
条件に合致した勉強会が、設定した時刻に定期的に通知される。
![スクリーンショット 2020-03-22 21.39.24.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F131625%2Ff1b9e7db-7fc6-fd8e-6e22-183868f76be6.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=8e5e2eaa98add3f541826bfe74e09626)
アーキテクチャは以下の理由からherokuを使うことにした。
- サーバー代が無料
- dockerでのデプロイに対応してる
- スケジューラの仕組みもある
需要があるかわからないが、他の人もこの仕組みを使えるように環境構築の手順を書いていく。
構築手順
0) 事前にやっておくこと
- herokuのアカウントの用意
- herokuのcliをインストールしておく
$ brew tap heroku/brew && brew install heroku
- コードをローカルへクローンしておく。
- slackアプリを作成し、ワークスペースへ追加しておく。
やり方はこの記事とかが参考になる
1) herokuへのリリース
事前にherokuのアカウントがない人は作っておく。
# 事前にアプリケーションのルートディレクトリに移動しておく
$ heroku container:login # ログイン
$ heroku create -a app_name # herokuアプリの作成。アプリ名は適当に決める。(heroku内で一意なアプリ名である必要あり)
$ heroku git:remote -a app_name # herokuリポジトリをgit登録。
$ heroku addons:create scheduler:standard # スケジューラのアドオンを追加(事前にherokuアカウントにクレジットカード登録が必要)
$ heroku addons:add cleardb:ignite # mysqlのアドオンを追加
$ heroku config # CLEARDB_DATABASE_URLが登録されていることを確認
$ heroku config:set DATABASE_URL="<ユーザー名>:<password>@tcp(<ホスト名>:3306)/<DB名>?parseTime=true" # CLEARDB_DATABASE_URLの値を元にgolangのsql.Open()に渡す用の文字列に整形
$ heroku config:set SLACK_TOKEN="<slackのトークン>" # slackアプリのトークンを環境変数に設定
$ heroku config:set WEB_HOOK_URL="<slackのwebHookURL>" # slackのwebHookURLを環境変数に設定
$ heroku stack:set container # heroku.ymlを使う時はこれがいるぽい
$ git push heroku master # リリース
2) slackの設定
作成しておいたslackアプリの設定画面に移動しておく。
2-1) slashコマンドの設定
通知する勉強会の条件設定は、slashコマンド経由で開くダイアログから行うようにしている。
そのslashコマンドの設定をしていく。
- コマンドを新規作成
![スクリーンショット_2020-03-22_18_42_14.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F131625%2F9af73710-4167-3597-295e-ee96d10c9e71.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=d8e99dda9a3aa9dd82934ca3d7628b92)
- コマンド実行時のAPI先を設定
![スクリーンショット_2020-03-22_18_42_29.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F131625%2Ff81bb764-a0ea-c9d9-71a0-04a181291a32.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=273fee89a93cfd24992f776033faa483)
2-2) Interactive Componentsの設定
勉強会の条件設定をするダイアログをsubmitした際に叩くAPI先の設定。
![スクリーンショット_2020-03-22_18_53_12.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F131625%2F26c26d10-9b99-150c-4202-4aee484ebe78.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=066c7902da6df659f020ce90f0dbf6fd)
3) スケジューリングの設定
herokuの画面に行って、スケジューラーのアドオンをクリック
![スクリーンショット_2020-03-22_19_04_21.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F131625%2F089492ad-0ac4-89b4-cbf5-aab47e23009a.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=cc3dfd72de9082f8706d86c9944aa03e)
/main connpass slack
を実行するジョブを作成する。実行間隔はお好みで。
4) 勉強会通知の設定をする
作成したslashコマンドを実行し、開いた設定ダイアログ上で通知条件の設定をする。
![スクリーンショット 2020-03-22 19.10.57.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F131625%2F2ffe36e9-2aaa-20a9-db8d-00b29b732b08.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=ad231018ea8d94a711557a278f3e4f6d)
5) 設定完了
ここまでやれば、herokuの環境変数で設定したwebHookURL宛てに、勉強会情報が定期的にポストされるようになる。
アーキテクチャ
golang、gin、docker、mysql、slack api、connpass api、herokuな感じで作っている。
一つのイメージでapiサーバーとしてもコマンド実行サーバーとしても起動させたかったため、起動時にフラグを渡すことでapiサーバー、コマンド実行サーバーが切り替わるようにしている。
また、ホットリロードのツールに air を使っている。
goでホットリロードといえば realize が使われているのをよく見かけるが、realizeはmodulesに対応していなかったり、最近メンテもされなくなったりと微妙な感じ。いいのが他にないのかなと思っていたが、最近はairが流行ってきてる?ぽい。