シェルスクリプトでSlackに通知を送る方法
2017/09/17
こんにちは、okutani(@okutani_t)です。気軽にSlackへ通知が送りたいとき、シェルスクリプトから通知を投げれたらいいなーと思い、いろいろ調べてみました。
ちなみに、PHPからSlackに通知を送る方法は過去に記事にしてます。PHPerはご参考までに。
動作確認等は、Mac上(OS Sierra)+zsh環境です。一応、さくらVPSで動かしてるCentOS7上でも動作確認してます。
では、シェルスクリプトからSlackに通知を送る方法について見ていきましょう。
スポンサーリンク
slackで通知用のチャンネルを作る
まずはslackで通知を受け取れるようにチャンネルを作成します。
「CHANNELS」のプラスマークからチャンネルを作成しておきます。
今回は「okutani-dev」という名前で作っておきました。ここは投げたい通知ごとに切り分けたりしてみてください。
Incoming WebHooksの設定
次に「Incoming WebHooks」を設定していきます。
PHPのときと違い、「投稿用のURLを取得&利用」することで、slackに通知を投げるといった方法です。
なので、URLが誰かに知られると「誰でも投稿できてしまう」というデメリットがあるので注意です(まぁKeyを使った方法でもKeyが漏れたら同じことですが)。
では、slackのチーム名をクリック → 「Apps & integrations」を選択。
検索に「Incoming WebHooks」と入力、選択。
「Add Configuration」をクリック。
通知を受け取るチャンネルを選択し(今回は#okutani-dev)、「Add Incoming WebHooks integration」をクリック。
これで通知用のURLが取得できました。メモしておきましょう。
その下に利用時の案内や、通知用のラベル、名前などが設定できるので一読してみてください(設定項目はスクリプト側からも決められます)。
では、通知用のシェルスクリプトを作成していきましょう。
シェルスクリプトの作成
シェルスクリプトを作成します。
今回は、「slack.sh」というファイルを以下の内容で作成しました。
#!/bin/bash
set -eu
# メッセージを一時保存する場所
MESSAGEFILE=$(mktemp -t webhooksXXXX)
# 終了時に削除
trap "rm ${MESSAGEFILE}" 0
# パイプの有無
if [ -p /dev/stdin ]; then
# 改行コードを変換して格納
cat - | tr '\n' '\\' | sed 's/\\/\\n/g' > ${MESSAGEFILE}
else
echo "nothing stdin"
exit 1
fi
# WebHookのURL
URL='WEBHOOKURLを記述'
# 送信先のチャンネル
CHANNEL=${CHANNEL:-'#okutani-dev'}
# botの名前
BOTNAME=${BOTNAME:-'okutani-bot'}
# 絵文字
EMOJI=${EMOJI:-':sushi:'}
# 見出し
HEAD=${HEAD:-"[見出し]\n"}
# メッセージをシンタックスハイライト付きで取得
MESSAGE='```'`cat ${MESSAGEFILE}`'```'
# json形式に整形
payload="payload={
\"channel\": \"${CHANNEL}\",
\"username\": \"${BOTNAME}\",
\"icon_emoji\": \"${EMOJI}\",
\"text\": \"${HEAD}${MESSAGE}\"
}"
# 送信
curl -s -S -X POST --data-urlencode "${payload}" ${URL} > /dev/null
コードの内容は上記コメントを参考に。あとこれとか。
参考シェルスクリプトを書くときはset -euしておく – Qiita
参考シェルスクリプトで一時ファイルを安全に扱う3つのコツ – Qiita
[見出し]のところはお好きな文字に置き換えて使ってください。
これで#okutani-devに対して、パイプで渡した文字列をslackに通知できるようになりました。
あ、使える絵文字は以下のサイトを参考にどうぞ。なんとなく「sushi」にしときました。
参考Emoji cheat sheet for GitHub, Basecamp and other services
では、実際に動かしてみましょう。
slackにメッセージを送信してみる
作成したシェルスクリプトを使ってメッセージを送ってみます。
なにはともあれ実行権限。
$ sudo chmod -x slack.sh
とりあえず、てきとうにメッセージを送ってみます。
$ echo "◯◯の処理が正常に完了したよ" | ./slack.sh
ちゃんと送信されたか確認。
ちゃんと送信されていることが確認できました!
以下なんかをいろいろ実行してみてもいいかと思います。
$ ls | ./slack.sh
とか
$ w | ./slack.sh
パイプで渡せる文字列ならなんでも飛ばせます。slack連携、なかなかなうでGoodです!
まとめ
このスクリプトをcronで登録して、定期的になにかをお知らせしてもいいですし、別で動いているスクリプトでこのslack.shを呼んであげれば、いろいろと連携できそうで便利ですね。
たとえば、「1日1回バックアップを取得するスクリプト」があるとき、その処理状況によって「完了」「エラー」などをslackに通知してあげると便利かと。
余談ですが、以前僕がちょっとだけ関わったプロジェクトでは、Web上でなにかしらの契約が取れたとき「契約が取れました!!!」と通知用のチャンネルに通知が飛ぶようになってました。
「モチベーションあがるなぁ」と関心したので、みなさんのサービスでも活用してみてください。
今回作成したシェルスクリプトはGitHubでも公開しています。
LINKshellscript-code/slack.sh at master · okutani-t/shellscript-code
slackをよく使う方の参考になれば幸いです。
Web開発のお仕事を募集しています
フリーランスのエンジニアとして、Webシステム開発のお仕事依頼を随時募集しています(現在の業務量によってお受けできない場合もあります)。
「Ruby on Rails」「JavaScript(jQuery, Reactなど)」「HTML + CSS」を用いたシステム開発、「Heroku」等を用いたサーバー構築・運用、「Git」や「GitHub」を利用したソーシャルコーディングなどに対応しています。
ご依頼を検討している方は、下記リンク本ブログからのお問い合わせ、もしくはokutaniのポートフォリオからご連絡ください。
LINKお問い合わせ
スポンサーリンク