Subversionのコミット通知をbashとcurlを使ってSlackのチャンネルに流す

More than 3 years have passed since last update.


概要

Subversionのコミット通知をSlackに長そうとしたけど、bashと最小限のコマンドだけで実現したかったので、Subversionのhooks用シェルを作ってみたときの覚え書きです。

本来ならHubotを使って連携をするのが今風だと思うのですが、node.js環境を勝手に構築出来ない状況だったので、node.js環境を構築することに問題がなければHubotを利用すべきだと思います。


Slackの準備


1.「Configure Integrations」を選択する

ConfigureIntegrations.png



2.「Incoming WebHooks」を選ぶ

IncomingWebHooks.png



3. 通知をするためのチャンネルを選択し、「Add Incoming WebHooks Integration」を押す(今回は#svn-test)

PostChannel.png



4. WebHookURLが発行される

WebhookUrl.png


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コミット通知が流れてくるようになると思います。