notify_slackの使い方

6 min読了の目安(約3600字IDEAアイデア記事

この記事ではnotify_slackの使い方などを紹介します。

catatsuy/notify_slack

notify_slackは機能追加があったり、Slack側の仕様変更があったりしたので、現時点の状況(2020/07/26現在)を簡単にまとめておきます。

ISUCONでの情報共有など、Slackに投稿できる便利CLIツールとして広く使ってもらえたらうれしいです。

設計思想

「とにかくシンプルに」「使うときに細かいことは意識させずに」「Slackに投稿するCLIを提供する」

を設計思想にして開発しています。

機能

機能は2つあります。

  • 標準出力を流すコマンドの内容を1秒に1回(頻度は変更可能)Slackに投稿する
    • ストリーミング機能と呼びます
    • teeも内部で実装しているので画面への出力は止まらない
  • ファイルをSnippetとしてSlackにアップロードする
    • Snippet投稿機能と呼びます

ストリーミング機能は口で説明しにくいので、是非YouTubeの動画を見てみて下さい。

それぞれの機能は以下のようなコマンドで使うことができます。

./deploy.sh | notify_slack
notify_slack README.md

ファイル名を渡す際は拡張子によってシンタックスハイライトを付けてくれる機能がSlackにあります。適切な拡張子を付けた上でアップロードすることをおすすめします。

Snippetとして投稿する内容をpipeで渡したい場合もあると思います。その場合は-snippetオプションを使用できます。

その場合は-filename-filetypeオプションのどちらかを渡すことを強く推奨します。

適切な-filetypeオプションを渡せば、Slackはシンタックスハイライトを付けてくれます。-filenameに拡張子を含めて指定すれば-filetypeは自動で判定してくれます。なので拡張子を含めたファイル名を-filenameで指定して、-filetypeオプションは付与しないという使い方が個人的にはおすすめです。

使用できる-filetypeSlackのドキュメントを参照して下さい。コマンドは以下のようになります。

git diff | ./bin/notify_slack -snippet -filename git.diff

インストール方法

GitHub Releases上でバイナリも配布しているのでこちらを利用することがおすすめです。最新版をダウンロードして使用してください。

Go言語の開発環境がある場合は手元でコンパイルしてもインストールできます。ただしバージョン情報は含まれないので notify_slack -version の出力は適切なものではなくなります。

設定

tomlによる設定ファイルを用意します。設定ファイルは以下の順番で一番最初に見つかった設定が読み込まれます。

  1. -cオプションで指定したファイル
  2. $HOME/.notify_slack.toml
  3. $HOME/etc/notify_slack.toml
  4. /etc/notify_slack.toml

個人的なおすすめは手元のマシンでは$HOME/.notify_slack.tomlを使用して、サーバー用途のマシンでは/etc/notify_slack.tomlを使用することです。

設定ファイルは以下のような内容です。

[slack]
url = "https://hooks.slack.com/services/**"
token = "xoxp-xxxxx"
channel = "#general"

ストリーミング機能はIncoming Webhooks、Snippet投稿機能はSlack APIのfiles.uploadを使用しています。

もし使い方が分からない場合はSlackのAPIの仕様を調べてもらえれば理解できると思います。以下でオプションを解説します。

オプションの解説

urlはIncoming WebhooksのURLを指定します。ストリーミング機能を使用する場合はこのオプションのみが必須です。ストリーミング機能しか使用しない場合はこのオプションだけ渡せば動かすことができます。

tokenはSnippet投稿機能を使用するときに設定します。Snippet投稿機能はchannelsnippet_channel も必須なので気をつけて下さい。作成方法はこれまでに何回も変更されています。作成方法はcatatsuy/notify_slack: post to Slack on the command lineを参照して下さい。できる限り追従するようにしています。手順が少し煩雑ですが「Slack Apps」などで検索すれば最新の情報が手に入るかもしれません。

channel は投稿するチャンネルを指定する機能です。ストリーミング機能・Snippet投稿機能両方で使用されます。古いIncoming Webhooksはチャンネルを自由に変更できましたが、新しいIncoming Webhooksでは指定したチャンネルしか指定できないので気をつけて下さい。Incoming Webhooksはチャンネルを指定しない場合はIncoming Webhooksのデフォルトのチャンネルに投稿されます。Slack APIにはデフォルトのチャンネルという概念はないので、必ずチャンネルを指定する必要があります。

snippet_channel はSnippet投稿機能で投稿するチャンネルを指定する機能です。 channel のみを指定した場合はSnippet投稿機能でも channel を使用しますが、snippet_channelも指定した場合はSnippet投稿機能ではsnippet_channelが使用されます。

重要なオプションは以上です。他のオプションを知りたい場合はREADME.mdを確認して下さい。

またすべてのオプションはコマンドラインオプションでも渡すことができます。コマンドラインオプションで渡した場合はそちらのオプションが優先されます。これらのオプションを環境変数で渡す機能もあります。コンテナー上で使用したい場合などに有用でしょう。

具体的な利用方法紹介

自分のチームのISUCONでの戦い方 | by catatsuy | Medium

具体的な利用方法を紹介しています。デプロイスクリプトのログはストリーミング機能、アクセスログの集計結果やスロークエリの解析結果などを共有するためにSnippet投稿機能を使用しています。

他にも様々な利用方法が考えられます。活用してくれた方は是非ブログなどで活用方法を紹介して下さい。

また欲しい機能があれば是非教えて下さい。実装することを保証はできませんが、実装すべきだと私が考えれば実装するかもしれません。PRもお待ちしております。