俺の報告

RoomClipを運営するエンジニアの日報(多分)です。

slackにメッセージをpostするシェル - 日報 #138

何でもかんでもslackにぶち込みやがって!
でもそれでいい〜んです。

今日はそんな話。

Notification系の情報はもうSlackに集約していいと思います。
なんせ便利だし。
ということなので、まずbashでslackポストが出来るようなシェルを手元にもっておきます。
すごい気が楽になりますよね。

ということでまず、slackでpostするシェルスクリプトを。

理想はこんな感じで呼び出せるように。

echo "Body Message" | ./slack_post.sh -c Hoge_channel -u Post_user -m "Header message"

要はシェルの結果をパイプで貰うshスクリプトがあって、
-c でチャンネル名、 -u でポストユーザ名、 -m でヘッダーメッセージ、
シェルの結果がポストの内容、
こんな感じで使えたら超便利ですね。

結果こんな感じに。

#! /bin/bash

set -eu
CHANNEL="def_channel" # DONOT USE '#'
USERNAME="slack_post_shell"
MESSAGE="TEST"
HOOKS_URL="https://hooks.slack.com/services/XXXXX"

for OPT in $*
do
    case $OPT in
        '-c' )
            CHANNEL=$2
            shift 2
            ;; 
        '-u' )
            USERNAME=$2
            shift 2
            ;; 
        '-h' )
            HOOKS_URL=$2
            shift 2
            ;; 
        '-m' )
            MESSAGE=$2
            shift 2
            ;; 
    esac
done

# slackのために無理やり\nを出力させる
MESSAGEFILE=/tmp/webhooks
rm ${MESSAGEFILE}
if [ -p /dev/stdin ] ; then
    cat - | tr '\n' '\\' | sed 's/\\/\\n/g'  > ${MESSAGEFILE}
fi

POST_MSG="${MESSAGE}\n"`cat ${MESSAGEFILE}`'\n'

curl -X POST --data-urlencode "payload={\"channel\": \"#${CHANNEL}\", \"username\": \"${USERNAME}\", \"text\": \"${POST_MSG}\"}" ${HOOKS_URL} 1>/dev/null 2>&1

うーん、tmpのところが若干不安だから$mktmpみたいなの使うといいかもしれないが、よく知らないので放置。
基本的にはcat - で受け取ったものをtmpファイルに保存して、という無駄経由をしているのは、sedコマンドが
unterminated substitute in regular expression
を吐き出しちゃうからです。
このへんとか参照 この方が楽なんすよね。
改行をなんとかうまく変換する方法ってないんすかね。。。

さて、これでおくれるようになりました。
あとはデプロイツールの最後に吐くなりなんなり、自由にしたらんかい!
という感じです。
便利ですね。