Subversionのコミット通知メールを送信するRubyスクリプト
欲しかったので、作ってみた。
以前JavaScript(WSH)で書いたことがあったんだけど、Windowsじゃなくても使えた方がいいという声が聞こえた気がするので、Rubyで書いた(でもWindowsでしかテストしてない)。当然、動かすにはRubyが必要。
commit_mail.rb
以下、Rubyのコード。
#! /usr/bin/env ruby require 'yaml' require 'net/smtp' def svnlook(command, repos, rev) `svnlook #{command} "#{repos}" -r #{rev}`.chomp end repos = ARGV[0] rev = ARGV[1] author = svnlook('author', repos, rev) message = svnlook('log', repos, rev) files = svnlook('changed', repos, rev) project = File.basename(repos) conf = YAML::load_file('commit_mail.yaml')[project] if conf smtp_addr = conf['smtp'] smtp_port = conf['port'] mail_from = conf['from'] mail_to = conf['to'] Net::SMTP.start(smtp_addr, smtp_port) do |smtp| smtp.send_mail <<EOF, mail_from, mail_to From: #{mail_from} To: #{mail_to.join(',')} Subject: [svn:#{project}:#{rev}] commit by #{author} repos: #{project} rev: #{rev} author: #{author} ---------------- message: #{message} ---------------- changed: #{files} EOF end end
このファイルを、どっかに置いておく。
commit_mail.yaml
あと、設定ファイルが必要。YAMLで書く。
リポジトリ名: smtp: SMTPサーバのアドレス port: SMTPポート番号 from: 通知メールの差出人のメアド to: - 通知メールの宛先のメアド - 通知メールの宛先のメアド - 通知メールの宛先のメアド
こんな感じ。通知メールの宛先はいくつでも書ける。複数のリポジトリがある場合は、上記の設定を複数書く。
以下、設定例。
sample_repos: smtp: mail.example.com port: 25 from: postmaster@mail.example.com to: - member1@mail.example.com - member2@mail.example.com demo_repos: smtp: mail2.example.com port: 25 from: postmaster@mail2.example.com to: - member_a@mail2.example.com - member_b@mail2.example.com - member_c@mail2.example.com
この例では、sample_reposとdemo_reposという2つのリポジトリがあるわけだ。別にすべてのリポジトリを書かなきゃいけないわけじゃなくて、通知メールを出したいリポジトリの分だけを書けばいい。
このファイルも、さっきのcommit_mail.rbと同じ場所に置いておく。
post-commit
次に、リポジトリのディレクトリ内のhooksの中にある、post-commitファイルを編集する。シェルによって拡張子が違ってくる。Windowsならbatとかcmd、Linuxならshとかかな。
とりあえずWindows用のbatファイルならば以下のような感じ。
C: cd \trac\projects\svn ruby commit_mail.rb "%1" %2 2>>commit_mail.error.log
うちの会社の環境はWindowsでTracを使っていて(Trac月)、今回はcommit_mail.rbとcommit_mail.yamlをTracのsvnディレクトリの直下に置いたので、上記のようなbatファイルになった。
要は、ディレクトリを移動して、渡された第1引数と第2引数をそのままcommit_mail.rbに投げ直せばいいだけ。上の例ではさらにエラーログを吐いてる。
やってみる
コミットしてみると、こんなメールが届く。
件名: [svn:sample_repos:100] commit by nacookan 差出人: postmaster@mail.example.com 宛先: member1@mail.example.com, member2@mail.example.com repos: sample_repos rev: 100 author: nacookan ---------------- message: コミットしたよ ---------------- changed: U trunk/source1.txt U trunk/source2.txt
コミットコメントと、対象のファイル一覧が載ってる。
おわり
うまく動くといいな。