at kaneshin

Free space for me.

標準入力からSlackに通知するツール

f:id:laplus-knsn:20181218190317p:plain

この記事は Slack Advent Calendar 2018 17日目の記事です。

はじめに

普段、Goで様々なツールをTerminal上で開発しています。そのなかで、何かしらの標準出力を整形してSlackに投げたくなるときがありますよね?

そんなとき github.com/kaneshin/gate というツールを使うと、簡単にSlackに投げることが出来るので本日はそちらを紹介します。

github.com

UNIX哲学

私の登壇を聞いたことがある人は何度か聴講したことがあると思います。Goはシンプルな言語なので、UNIX哲学に則って標準入出力を設計すると良いです。サムネイルにある画像は、標準出力から「突然の死」を suddendeath コマンドに渡して、突然の死をジェネレートしています。

$ echo '突然の死' | suddendeath                                    
_人人人人人人_
> 突然の死 <
 ̄YYYYYY ̄

github.com

インターフェースとして、下記のようにすることもよいですが、パイプで渡すのが少し面倒になります。

$ suddendeath '突然の死'
_人人人人人人_
> 突然の死 <
 ̄YYYYYY ̄

よく使われる歴史あるコマンドたちは標準入出力をうまく活用しているので、そちらを踏襲している形になります。

モット読む?

上記の本にもう少し突っ込んで書いているので、もしお読みしたい人がいればぜひ購入してください。

gateサーバーとgatecliコマンド

さて、本題です。gateのリポジトリには gate というアプリケーションと gatecli というコマンドツールが同梱されています。具体的には、gate がリクエストを待っており、それに対して gatecli でリクエストを送る機構になっています。

gate をパブリックなサーバーで稼働させていれば、そこに gatecli でリクエストを送るだけで通知が可能です。ただし、ただのWebアプリケーションなため、外部から悪用されないように気をつけてください。

インストール

$ go get github.com/kaneshin/gate/cmd/...

上記のようにして、 gategatecli をインストールします。

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に投げてしまうことで省エネになりますね。