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

うちの会社の環境はWindowsTracを使っていて(Trac月)、今回はcommit_mail.rbとcommit_mail.yamlTracsvnディレクトリの直下に置いたので、上記のような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

コミットコメントと、対象のファイル一覧が載ってる。

おわり

うまく動くといいな。