概要
Subversionのコミット通知をSlackに長そうとしたけど、bashと最小限のコマンドだけで実現したかったので、Subversionのhooks用シェルを作ってみたときの覚え書きです。
本来ならHubotを使って連携をするのが今風だと思うのですが、node.js環境を勝手に構築出来ない状況だったので、node.js環境を構築することに問題がなければHubotを利用すべきだと思います。
Slackの準備
1.「Configure Integrations」を選択する
2.「Incoming WebHooks」を選ぶ
3. 通知をするためのチャンネルを選択し、「Add Incoming WebHooks Integration」を押す(今回は#svn-test)
4. WebHookURLが発行される
Subversionの準備
1. post-commitの配置
リポジトリに「hooks」ディレクトリがあるので、そこにpost-commitを配置します。(実行権限を付けるのを忘れずに)
「Slack Setting」と「SVN Setting」の設定を環境に合わせて下さい。
post-commit
#!/bin/sh
export LANG=ja_JP.UTF-8
REPOS="$1"
REV="$2"
TXN_NAME="$3"
# ------------------------------
# Slack Setting
# ------------------------------
# 通知するSlackのチェンネルを書く(プライベートグループの時は「#」は不要)
channel="#svn-test"
# 通知するときのユーザ名
username="svn"
# 通知するユーザのアイコン
iconemoji=":shell:"
# WebHookURL(環境に合わせて下さい。)
webhookUrl="https://hooks.slack.com/services/XXXXXXXXX"
# ------------------------------
# SVN Setting
# ------------------------------
# Subversionのリポジトリのベースディレクトリ(環境に合わせて下さい。例:/home/svn/repos)
baseRepository="/home/svn/repos"
# Subversionのリポジトリ名(環境に合わせて下さい。例:svn-test)
repositoryName="svn-test"
# Subversionのリポジトリ
repository=$baseRepository/$repositoryName
# コミットしたAuthorを取得
author=$(/usr/bin/svnlook author -r $REV $repository)
# コミットメッセージを取得
commit_msg=$(/usr/bin/svnlook log -r $REV $repository | tr '\n' '\\' | sed 's/\\/\\n/g')
# コミットサマリーを取得
commit_summary=$(/usr/bin/svnlook changed -r $REV $repository | tr '\n' '\\' | sed 's/\\/\\n/g')
# コミット通知するときのヘッダ
header="New commit:"
# コミット通知するときにボディ(commit_summaryとか不要だったら省く)
value="Revision:$REV\n$commit_msg\n$commit_summary"
# Slackに通知
/usr/bin/curl -X POST --data-urlencode "payload={\"channel\": \"${channel}\", \"username\": \"${username}\", \"text\": \"${header}\", \"attachments\": [{ \"fallback\": \"${header}\", \"color\": \"good\", \"fields\": [{\"title\": \"${author}\", \"value\":\"${value}\" }] }], \"icon_emoji\": \"${iconemoji}\"}" ${webhookUrl}
これで、コミットするとSlackにSVNコミット通知が流れてくるようになると思います。