add to hatena hatena.comment (2) add to del.icio.us (0) add to livedoor.clip (0) add to Yahoo!Bookmark (0) Total: 2

Gitで更新時にメールを送信する

社内のソースバージョン管理でgitも使ってみようということで、開発メンバーが利用できるようにgit環境を構築しています。

subversionで管理しているときは、commit時にcommitの概要をMLにメールを送信するようにしていました。メールが届いたから何かをするわけではありませんが、commit内容をわざわざ報告しなくてもMLで共有できるので便利です。

gitでも同様のことができまるようにしてみました。gitの場合は複数のリポジトリが存在しますが、情報が欲しい情報のはみんなが共有しているリポジトリの更新内容です。なので、共有リポジトリに対してのみ設定を行います。

hooks/post-updateでフックする

subversionの場合はリポジトリの/hooks/post-commitで好きな処理を行うことができます。gitの場合もpost-commitがあるのですが、開発メンバーが利用するリポジトリは基本pushのみを受け付けて直接commitを行うことはありません。

そこで、post-updateというフックファイルがあったので、このファイルで処理させてみます。

メール送信スクリプト

今回はpythonでメール送信スクリプトを書きました。別にpythonでなくてもrubyでもphpでもお好きなもので。
メールされる内容はupdateされたときに直近のコミットのログを取得するようにしています。
ここで、commitした人が誰なのかなど詳細な情報を取得する方法としてgit logコマンドを利用しています。
このコマンドに--pretty=format:XXXというオプションを渡すことでコミットした人が誰なのか、いつなのかなどの必要な情報だけを取得することができるようです。
同じように、メールの本文はgit whatchangedコマンドを利用して作成しています。このコマンドでどのファイルが変更されたかがわかります。

また、日本語でのメールを送信する方法でウノウさんのブログを参考にさせていただきました。
参考: Pythonでメールを送信したい人のためのサンプル集

そして、最終的にできたのが以下のファイルです。
to_addrの部分は適切なものに書き換えてください。

  • [リポジトリ]/hooks/post-update-email.py
PYTHON:
  1. #!/usr/bin/python
  2. #!-*- coding: utf-8 -*-
  3. #############################
  4. import sys, os, smtplib
  5. from email.MIMEText import MIMEText
  6. from email.Header import Header
  7. from email.Utils import formatdate
  8.  
  9. def create_message(from_addr, to_addr, subject ,body, encoding):
  10.   msg = MIMEText(body, 'plain', encoding)
  11.   msg['Subject'] = Header(subject, encoding)
  12.   msg['From'] = from_addr
  13.   msg['To'] = to_addr
  14.   msg['Date'] = formatdate()
  15.   return msg
  16.  
  17. def send(from_addr, to_addr, msg):
  18.   s = smtplib.SMTP('localhost')
  19.   s.sendmail(from_addr, [to_addr], msg.as_string())
  20.   s.close()
  21.  
  22. def enc2jis(str, encoding='utf-8'):
  23.   return unicode(str, encoding).encode('iso-2022-jp')
  24.  
  25. if __name__ == '__main__':
  26.   from_addr = os.popen("git log -1 --pretty=format:\"%ae\"").read()
  27.   to_addr = 'sample@example.com'
  28.   subject = "[git update] %s\n" % os.popen("git log -1 --pretty=format:\"%s\"").read()
  29.   subject = enc2jis(subject)
  30.   body = "%s\n" % os.popen("git whatchanged -1 --pretty=format:\"commiter: %cn <%ae>%ndate    : %cd%n%s%n--------------------%n%b%n\"").read()
  31.   body = enc2jis(body)
  32.   msg = create_message(from_addr, to_addr, subject, body, 'ISO-2022-JP')
  33.   send(from_addr, to_addr, msg)

メール送信用のファイルを呼び出す

そして、post-updateファイルに実際にメール送信するスクリプトを呼び出すように書いておきます。

  • [リポジトリ]/hooks/post-update
CODE:
  1. # An example hook script to prepare a packed repository for use over
  2. # dumb transports.
  3. #
  4. # To enable this hook, make this file executable by "chmod +x post-update".
  5.  
  6. # exec git-update-server-info
  7. SCRIPT_PATH=/path/to/git-repo/hooks/post-update-email.py
  8. ${SCRIPT_PATH}

実行権限を付与しておく

あとは、post-update, post-update.pyに実行権限をつけておきます。

$ chmod +x post-update
$ chmod +x post-update-email.py

これで、ローカルから

$ git commit
$ git push

したときに、pushされた内容の直近のログをto_addrに次のようなメールを送信することができようになりました。

Subject: [git update] 日本語ログ

commiter:Hoge Hage
date :Wed Aug 26 11:58:40 2009 +0900
日本語ログ
--------------------
日本語
テスト

:100644 100644 954e8ff... c1cc4d9... M sample.php

同様の設定をされる方の参考になれば幸いです。

関連するその他の記事

  • No Related Post

Comments

Leave a Reply