ubuntu10.10 通過hooks和mailer.py發送svn變更通知郵件

廢話:雖然說現在git來勢兇猛,但是svn還是用得很多的,將自己折騰svn的過程記錄下來!

svn提供了一個很方便的hooks功能(之前我的折騰ftp文章裏面也有提及這總設計思想),可以爲對repository的操作設定相關的動作。詳細的介紹去看svn的官方文檔,我這裏只是介紹有post-commit發送通知郵件。subversion repository 的目錄裏面有這裏conf, dav, db, hooks, locks等目錄。其中hooks就是用來存放hooks的地方(又是廢話)。目前總共是九種hooks:

  1. start-commit:開始提交的通知。在開始事務之前執行(通常用來確定用戶是否有提交權限)。如果start-commit鉤子程序返回非0值,動作(比如提交)就會在創建事務之前停止,stderr的任何輸出都會返回到客戶端。
  2. pre-commit:在提交結束之前提醒。post-commit鉤子在事務創建新版本之前運行,通常這個鉤子是用來保護因爲內容或位置(例如,你要求所有到一個特定分支的提交必須包括一個 bug 追蹤的 ticket 號,或者是要求日誌信息不爲空)而不允許的提交。如果 pre-commit 鉤子返回非零值,提交會終止,提交事務被刪除,所有 stderr 的輸出會返回到客戶端。
  3. post-commit:成功提交的通知。post-commit 鉤子在事務完成,創建新版本後執行。大多數人用這個鉤子來發送關於提交的描述性電子郵件,或者用來提醒其它工具(例如問題跟蹤),發生了提交動作。一些配置也使用這個鉤子觸發版本庫的備份進程。如果 post-commit 鉤子返回非零值,提交不會終止,因爲它已經完成。然後,所有 stderr 的輸出都會返回到客戶端,讓診斷鉤子的失敗更容易。
  4. pre-revprop-change:修訂版本屬性修改的通知。pre-revprop-change 鉤子在修改版本屬性修改之前,正常提交範圍之外被執行。不象其它鉤子,這個鉤子默認是拒絕所有的屬性修改,鉤子必須實際存在,並且返回一個零值,這樣才能修改屬性。如果 pre-revprop-change 鉤子不存在,不可執行,或返回非零值,就不會修改屬性,所有的 stderr 的輸出會返回到客戶端。
  5. post-revprop-change:修訂版本屬性修改成功的通知。post-revprop-change 鉤子會在修改版本屬性修改後立即執行,在提交範圍之外。可以從其配對 pre-revprop-change 知道,如果沒有實現 pre-revprop-change 鉤子,它就不會執行。它通常用來在屬性修改後發送郵件通知。如果 post-revprop-change 鉤子返回非零值,修改動作不會終止,因爲它已經完成。然而,任何輸出到 stderr 的內容都會返回到客戶端,讓診斷鉤子的失敗更容易。
  6. pre-lock:路徑鎖定嘗試的通知。pre-lock 鉤子在每次有人嘗試鎖定文件時執行。可以防止完全鎖定,或者用來創建控制哪些用戶可以鎖定哪些路徑的複雜策略。如果鉤子發現已存在鎖,也可以決定是否允許用戶“竊取”這個鎖。如果 pre-lock 鉤子返回非零值,鎖定動作會終止,任何輸出到 stderr 的內容都會返回到客戶端。
  7. post-lock:成功鎖定路徑的通知。post-lock在路徑鎖定後執行。通常用來發送鎖定事件郵件通知。如果 post-lock 鉤子返回非零值,鎖定動作不會終止,因爲它已經完成。然而,任何輸出到 stderr 的內容都會返回到客戶端,讓診斷鉤子的失敗更容易。
  8. pre-unlock:路徑解鎖嘗試的通知。pre-unlock 鉤子在某人企圖刪除一個文件上的鉤子時發生。可以用來創建哪些用戶可以解鎖哪些文件的策略。制定解鎖策略非常重要。如果用戶 A 鎖定了一個文件,允許用戶 B 打開這個鎖?如果這個鎖已經一週了呢?這種事情可以通過鉤子決定並強制執行。如果 pre-unlock 返回非零值,解鎖操作會終止,任何輸出到 stderr 的內容都會返回到客戶端。
  9. post-unlock:路徑成功解鎖的通知。post-unlock 在一個或多個路徑已經被解鎖後執行。通常用來發送解鎖事件通知郵件。如果 post-unlock 返回非零值,解鎖過程不會終止,因爲它已經完成。然而,任何輸出到 stderr 的內容都會返回到客戶端,讓診斷鉤子的失敗更容易。

以上hooks Subversion的官方文檔有更詳細的說明。我需要的是變更成功通知,當然是選擇post-commit,這裏可以選擇的根據有兩種,commit-email.pl和mailer.py,因爲commit-email.pl不能正確的處理no-ascii log message, 同時mailer.py功能比較強大,最重要的還是我比較熟悉python易於調試。我使用的ubuntu 在安裝完subversion後裝一下subversion-tools,這個包裏面有個/usr/share/subversion/hook-scripts/mailer/mailer.py 用來對比兩個版本庫的不同並且發郵件給指定的郵件列表人員等。

$ cd $repo/hooks
$ cp post-commit.tmpl post-commit
$ chmod a+x post-commit
$ cp /usr/lib/subversion/hook-scripts/mailer/mailer.conf "$REPOS"/conf/mailer.conf

這裏提供的模板是一個shell script,這裏只要是一個可執行文件就可以了(可以是python,perl甚至是c的可執行文)在post-commit裏面添加如下:

#!/bin/sh
REPOS="$1"
REV="$2"
/usr/lib/subversion/hook-scripts/mailer/mailer.py commit $REPOS $REV "$REPOS"/conf/mailer.conf
if [ $? -ne 0 ]; then
    echo "failure to mailer.py commit $REPOS $REV" >> /home/trac/SVNRepository/Gala/hooks/test.log
fi

後面if語句是我調試的時候用的。現在的步驟就是修改mailer.conf,其實配置文件裏面對配置的說明已經很好了,所以看看註釋就可以配置,它官方文檔在這裏:http://opensource.perlig.de/svnmailer/doc-1.0/#general-sendmail-command時間可以細看!下面是我主要碰到的問題:mailer.conf裏面提供發郵件的方式有兩總,一個sendmail,一個是smtp。如果你選擇的是sendmail方式,你需要把mailer.py修改一下

cmd = self.cmd + [ '-t', self.from_addr ] + self.to_addrs
"""修改成"""
cmd = self.cmd + [ '-f', self.from_addr ] + self.to_addrs
具體是爲什麼好像我自己也忘了。但是這樣容易被服務器當作垃圾郵件拒絕,這樣的話你在你用戶下面debian一般是/var/mail/$USERNAME裏面會收到拒絕的郵件。一般提示smtp協議錯誤!這裏給出了一些smtp返回錯誤代碼的意義:http://www.5dmail.net/bbs/thread-184743-1-1.html你可以根據這個調試。提示方法如下:
/post-commit /path/to/the/svn/repository 689
689表示源碼的一次變更!

如果你選擇的是smtp發送郵件,一般沒有什麼問題,主要是server,username,passwd設置好就沒有什麼問題了!調試的辦法還是一樣的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章