この記事は Slack Advent Calendar 2018 17日目の記事です。
はじめに
普段、Goで様々なツールをTerminal上で開発しています。そのなかで、何かしらの標準出力を整形してSlackに投げたくなるときがありますよね?
そんなとき github.com/kaneshin/gate
というツールを使うと、簡単にSlackに投げることが出来るので本日はそちらを紹介します。
UNIX哲学
私の登壇を聞いたことがある人は何度か聴講したことがあると思います。Goはシンプルな言語なので、UNIX哲学に則って標準入出力を設計すると良いです。サムネイルにある画像は、標準出力から「突然の死」を suddendeath
コマンドに渡して、突然の死をジェネレートしています。
$ echo '突然の死' | suddendeath _人人人人人人_ > 突然の死 <  ̄YYYYYY ̄
インターフェースとして、下記のようにすることもよいですが、パイプで渡すのが少し面倒になります。
$ suddendeath '突然の死' _人人人人人人_ > 突然の死 <  ̄YYYYYY ̄
よく使われる歴史あるコマンドたちは標準入出力をうまく活用しているので、そちらを踏襲している形になります。
モット読む?
深夜に投稿しちゃったので再掲。技術書典5で売り切れになってしまったGo言語らしさ本の電子書籍をBOOTHにて販売しているのでどうぞ〜。コーヒー二杯分で買えるのでぜひ // Go言語らしくGoコードを実装するための手法と思想 | kaneshin https://t.co/d3ORSadZ7I #booth_pm
— kaneshin / eureka (@kaneshin0120) October 21, 2018
上記の本にもう少し突っ込んで書いているので、もしお読みしたい人がいればぜひ購入してください。
gateサーバーとgatecliコマンド
さて、本題です。gateのリポジトリには gate
というアプリケーションと gatecli
というコマンドツールが同梱されています。具体的には、gate
がリクエストを待っており、それに対して gatecli
でリクエストを送る機構になっています。
gate
をパブリックなサーバーで稼働させていれば、そこに gatecli
でリクエストを送るだけで通知が可能です。ただし、ただのWebアプリケーションなため、外部から悪用されないように気をつけてください。
インストール
$ go get github.com/kaneshin/gate/cmd/...
上記のようにして、 gate
と gatecli
をインストールします。
gateサーバー
[slack.incoming] url = "[your-incoming-url]" channel = "general" username = "gate" icon_emoji = ":ghost:"
上記のようにconfigファイルを作成し、 gate -config=/path/to/config.toml -port=8080
のように起動します。基本的にデーモン化させたほうが良いので、下記のようにsystemdのサービスに登録しておきましょう。
[Unit] Description=The Gate Server After=syslog.target [Service] Type=simple ExecStart=/usr/local/bin/gate -config=/home/foobar/.config/gate.tml WorkingDirectory=/home/foobar KillMode=process Restart=always User=root Group=staff [Install] WantedBy=multi-user.target
gatecliコマンド
アプリケーションが起動したら、あとは標準入力経由で gatecli
を叩くだけです。
$ echo "foobar" | gatecli
このようにパイプで渡すので、冒頭にもあったようにパイプで連鎖させることが可能です。
$ echo '突然の死' | suddendeath | gatecli # 下記がSlackに送信される # _人人人人人人_ # > 突然の死 < #  ̄YYYYYY ̄
おわりに
このように、標準入出力をうまく活用したツールでSlackに限らずツールを作成することで幅が広がったりします。今回はいろいろな標準出力をそのままSlackへ通知するためのツールです。例えば、gitのdiffをそのままエンジニアに投げることも可能です。
コピーしてペーストも良いですが、ちゃちゃっとSlackに投げてしまうことで省エネになりますね。