#はじめに
諸事情でgitではなくsvnを部分的に使っています。
svnにコミットしたら、slack の incoming-webhook で通知するようにした記録です。
ちなみにスクリプト本体はruby2.2.0で書きました。
gemがあるようですが、使うほどでもないと思って素で書きました。
#Slackで Incoming WebHooks を登録
設定画面の「Integrations」から「Incoming WebHooks」を新規追加(ページ最下部あたり)
参考
http://www.bunnyhop.jp/lab-20141020/
#svnサーバーで post-commit を記述
###locale追加
$ sudo apt-get install language-pack-ja
Ubuntu14.04(x64) @ EC2 を使っていたのでlocale追加が必要でした。
###post-commitに追記
※リポジトリパスは随時読み替えてください
LANG=ja_JP.UTF-8
REPOS="$1"
REV="$2"
/home/svn/.rbenv/shims/ruby /home/svn/repos/myapp/hooks/post-commit.rb $REV
##post-commit.rbを作成して hooks/ に置く
#!/usr/bin/env ruby
# encoding: utf-8
require 'net/http'
require 'uri'
require 'json'
# POSTリクエストメソッド
#
def post(text)
# コミット通知メッセージをJSONに
data = {
"text" => text
}
# slackで発行したwebhookURLをセット
request_url = "https://hooks.slack.com/services/XXXXXXX/XXXXXXX/XXXXXXXXXXXXXXXXXXXXXX"
uri = URI.parse(request_url)
http = Net::HTTP.post_form(uri, {"payload" => data.to_json})
end
# リビジョン番号
rev = ARGV[0].to_s
# author情報取得
cmd = "svnlook author /home/svn/repos/myapp -r #{rev}"
author = `#{cmd}`
# コミットメッセージ取得
cmd = "/usr/bin/env LANG=ja_JP.UTF-8 /usr/bin/svnlook log /home/svn/repos/myapp -r #{rev}"
log = `#{cmd}`
# slackに通知してもらうテキストをつくる(ここはご自由に)
msg = "#{log.chomp!} - commit by #{author.chomp!} - rev:#{rev}"
# POSTリクエスト
post(msg.force_encoding("UTF-8"))
※必要であればデスクトップ通知も設定しておく
#ハマった点
- locale追加して日本語の ja_JP.UTF-8 を作成すること(EC2だったから)
- force_encodingすること(これをしないと文字化けした)
#番外(Jenkins連携)
もうひとつ incoming-webhook を登録して Jenkinsのビルドエラーもslack通知で検知できるようにしました。
※ #jenkins チャンネルをつくってここに通知するようにしました。
Jenkinsにはすでに「Jenkins Slack Plugin」があるので、これを使うと簡単に連携できます。
これについてはここを参考にさせてもらいました。
http://r9.hateblo.jp/entry/2014/01/26/145538
#Slackフリープランの場合の注意点
まずIntegrationsは5つまでです。
他の連携が必要な場合はそのあたりを考慮する必要があります。
また、Slackのフリープランでは月の投稿数が10,000と限られています。
ですので、通知を増やせば当然上限に早く達する恐れがあります。
自分のチームの場合、コミット通知と、時々Jenkinsに怒られる通知を含めても、
10,000の上限にはまず達することはないと判断したのでこういった運用にしています。