GitのDiffをSlackへ流したい
cloudpack あら便利カレンダー 2017の23日目です。
GitのDiffをSlackにコピペすると…
うーん、このままじゃ見づらい。
あと、毎回コピペするのは面倒!
ということで投稿できる様にしてみました。
Webhook
Slackへ投稿するためにはIncoming Webhookを使います。
Incoming Webhookを使うと、ユーザーごとにユニークなURLが配布され、
そのURLにSlackのAPIに沿ったPOSTを行うと、投稿ができます。
ユーザーとして投稿の権限が与えられるので、
生成されたURLはむやみに公開しないように注意してください。
参考記事
http://qiita.com/vmmhypervisor/items/18c99624a84df8b31008
Slackへの投稿を行うシェルスクリプト
とりあず、Slackへ投稿を行うシェルを書きます。
bashのバージョンは
GNU bash, version 3.2.57(1)-release
で行っています。
ちなみにシェルはすべてホームディレクトリ~/
に配置されている前提です。
#!/bin/bash
readonly WEBHOOK_URL="https://hooks.slack.com/XXXXX/XXXXXXX"
# $1 :text
# $2 :channel
username=`hostname`
# escape
escaped_text=`echo "$1" | sed 's/\"/\\\"/g'| sed 's/\\\/\\\\\\\/g'`
# format
body=$(cat << EOF
{
"channel": "$2",
"username": "${username}'s console",
"text": "$escaped_text",
"icon_emoji": ":console:"
}
EOF
)
# post
curl -X POST --data-urlencode 'payload='"${body}" ${WEBHOCK_URL}
echo ""
やっていることは単純で、
- 引数をJSON用にエスケープ
- API用に整形
- 投稿
をしているだけです。
エスケープ処理ではJSON用に"
と\
をエスケープしてます。
(sed 's/\\\/\\\\\\\/g'
の部分は若干闇を感じます)
投稿者の名前は端末ごとにhostname
で取得しています。
icon_emoji
では、投稿する絵文字を指定できるので、コンソールっぽい画像を登録しています。
実行方法は
sh ~/post_slack.sh "投稿したい文" "投稿先チャンネル名"
になります。
usersMac:~ user$ sh ~/post_slack.sh uho-uho chat-test
ok
コンソールがuho-uho
言っていることがわかります。
pipeでつなぐ時はこんな感じにするとコマンド内容が投稿できます。
"コマンド" |sh ~/post_slack.sh "$(cat -)" "投稿先チャンネル"
例えばこんな感じで実行すると
usersMac:sample user$ ls -a | sh ~/post_slack.sh "$(cat -)" chat-test
ok
Slack用に整形するシェルスクリプト
そのまま投稿しようとすると、見づらいので整形します。
#!/bin/bash
# $1 : channel
diff=$(cat -)
# format function
function to_slack_format(){
while read line; do
if [[ "$line" =~ ^-.+ ]]; then
echo "~"$line"~"
elif [[ "$line" =~ ^\+.+ ]]; then
echo "*"$line"*"
else
echo "$line"
fi
done <<EOF
$1
EOF
}
# escape
escaped_text=`echo "${diff}" | sed 's/\\\/\\\\\\\/g'`
# format
formatted_text=`to_slack_format "$escaped_text"`
# post
sh ~/post_slack.sh "${formatted_text}" $1
こちらも
- diffの結果をパイプで受け取り
- エスケープ処理
- 整形
- 投稿するシェルへ渡す
の順に処理しています。
こちらのエスケープ処理はバックスラッシュを含んだ文字列をpost_slack.sh
へ渡すためにエスケープしてます。
整形処理では見やすさを考慮して
- 行頭が
-
の行を打ち消し線に - 行頭が
+
の行を太字
に置き換えています。
Slackでは
~strike~
が打ち消し線のstrike
*bold*
が太字のbold
になります。
実行方法はリポジトリのディレクトリへ行き、
diffを実行、結果をパイプで渡します。
usersMac:sample user$ git diff HEAD^ | sh ~/post_git_diff.sh chat-test
ちょっと見やすくなりました。