PR

SVNコミット時にメール通知をする方法

1. はじめに

Ruby を使い SVN コミット時にメール通知をしていましたが、OS の入れ替えをしたことで Ruby のバージョンの問題が発生し動かなくなってしまったので Bash で書き直しました。
書き直しをしたところ、文字化けだったり、メール本文が添付ファイルで送られたりと問題起こしたため、いろいろ試行錯誤しようやく動くようになったのでメモしておきます。

2. post-commit の設定

SVN の post-commit フックは、SVN にコミットしたときに実行されるスクリプトです。
SVN にコミットしたときにメール通知をするようにします。

#!/bin/bash
export LANG=ja_JP.UTF-8
export LC_ALL=ja_JP.UTF-8

REPOS="$1"
REV="$2"

TO_MAILS="to@example.com,to2@example.com"
FROM_MAIL="from@example.com"

AUTHOR=$(svnlook author "$REPOS" -r "$REV")
DATE=$(svnlook date "$REPOS" -r "$REV")
CHANGED=$(svnlook changed "$REPOS" -r "$REV")
LOG=$(svnlook log "$REPOS" -r "$REV")
DIFF=$(svnlook diff "$REPOS" -r "$REV")

SUBJECT="Subversion committed to $REPOS $REV"
BODY="
更新者  : $AUTHOR
更新日時: $DATE
--------------------------------------------------------

Changed:                      [U:修正,A:追加,D:削除]
--------------------------------------------------------
$CHANGED

Log:
--------------------------------------------------------
$LOG

Diff:
--------------------------------------------------------
$DIFF
"

/usr/sbin/sendmail "$TO_MAILS"<<EOF
From: ${FROM_MAIL}
To: ${TO_MAILS}
Subject: ${SUBJECT}
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8

${BODY}
EOF

3. 注意点を個別に説明

3.1. 日本語の文字化け

以下の2行を追加することで、メール本文の文字化けを防ぎます。

export LANG=ja_JP.UTF-8
export LC_ALL=ja_JP.UTF-8

3.2. メールの宛先

複数のメールアドレスを指定する場合は、カンマ区切りで指定します。

TO_MAILS="to@example.com,to2@example.com"

3.3. sendmail コマンド

sendmail コマンドを使いメールを送信します。
スクリプト実行だとパスがわからないためフルパスで指定します。

/usr/sbin/sendmail "$TO_MAILS"<<EOF

3.4. Content-Type ヘッダ

メールの Content-Type ヘッダを指定することで、メール本文が添付ファイルとして送信されるのを防ぎます。

Content-Type: text/plain; charset=UTF-8

4. 動作確認

動作確認は、以下のコマンドで行います。

cd /path/to/repo/hooks/
bash post-commit "/path/to/repo" 1

これでメールが届けば成功です。
後は、実際に SVN にコミットしメール内容が正しいか確認します。
こちらは、SVN のリポジトリにコミットしてみてください。

5. まとめ

OS の入れ替えをしたことで Ruby のバージョンの問題が発生し動かなくなってしまったので Bash で書き直しました。
今回は ChatGPT に助けてもらいながら Bash で書き直しました。
最近あまり検索しなくなった気がします。

今回の記事も、Github Copilot が7割くらい書いてくれました。

A. 参考サイト

subversionのpost-commitで更新されたファイルを取得する
subversion+redmineで、コミットされたらすぐにRedmineのリポジトリーやらなんやらに反映させる方法

B. 関連書籍

コメント