閱讀此篇文章你可以:
對svn hooks有一定的了解
獲取兩個最常用的svn hooks案例
svn hooks介紹
hooks 鉤子,主要實現的功能就是在特定事件發生之前或者之後自動執行事先定義好的指令碼**來實現某些功能,類似於js中的監聽事件、mysql中的觸發器、django中的signals訊號等
大多數開發語言都可以用來編寫hooks指令碼,常用的如windows下的bat、vb,linux下的shell、python等
svn中的hooks按照所在位置可以分為兩類,客戶端hooks和服務端hooks,日常使用中服務端hooks使用更廣,我們也以服務端hooks介紹為主
svn服務端hooks主要有以下9種:
pre-lock:檔案加鎖前執行,不常用
post-lock:檔案加鎖後執行,通常用來傳送鎖定事件通知,需要傳遞兩個引數給hooks指令碼,按照順序依次為:1.版本庫路徑,2.鎖定路徑的認證使用者名稱
per-unlock:檔案解鎖前執行,不常用
post-unlock:檔案解鎖後執行,通常用來傳送解鎖事件通知,需要傳遞兩個引數給hooks指令碼,按照順序依次為:1.版本庫路徑,2.解鎖路徑的認證使用者名稱
start-commit:開始提交時執行,在pre-commit之前,通常用來確定使用者是否有提交許可權
pre-commit:提交之前執行,在start-commit之後,通常用來對提交內容的檢查,例如我們後邊要介紹的利用pre-commit做提交log的合規性檢查,需要傳遞兩個引數給hooks指令碼,按照順序依次為:1.版本庫路徑,2.提交事務的名稱
post-commit:提交完成後執行,這應該是使用最廣的hooks之一,通常用來在提交之後傳送提交通知,甚至是利用它來做自動化的ci/cd等操作,需要傳遞兩個引數給hooks指令碼,按照順序依次為:1.版本庫路徑,2.提交建立的修訂版本號
pre-revprop-change:在修改revision屬性之前執行,不常用
post-revprop-change:在修改revision屬性之後執行,不常用
svn hooks應用
svn hooks位於svn版本庫的hooks資料夾下,例如svn目錄為/home/svn/repos,倉庫名稱為ops-coffee,那麼hooks就位於/home/svn/repos/ops-coffee/hooks/目錄下,資料夾下的.tmpl的檔案為hooks的模板檔案,以shell指令碼的方式展示了hooks該如何使用
注意這些hooks檔案都要有可執行許可權
如果我們要使用svn的hooks,那麼就在hooks資料夾下新建檔名為hooks型別的檔案(例如pre-commit,沒有字尾,名字也不能隨意改)並為檔案賦予可執行許可權,或者直接複製模板檔案去掉.tmpl字尾然後進行修改
接下來我們看兩個常用的例子來加深對hooks的理解
限制log提交規則
良好的svn log規範,有利於我們對專案的管理,尤其在多人協作開發的過程中,清晰、規範的log能大大降低溝通成本,提公升開發效率。因此我們會制定相應的規則要求所有開發按照一定的規範提交log,這些規則通常依賴所有參與者的自覺,效果可能並不是很好,有麼有辦法強制參與者按照既定的規則提交log呢?
pre-commit這個hook就能很好的幫助我們實現這個需求,每一次**提交前都會觸發pre-commit指令碼,那麼我們就可以在指令碼中判斷log規則是否跟我們預先定義的一樣,不一樣則不允許提交
假如我們有如下log提交規範
**提交記錄以簡潔、表意清晰為基本原則,建議每完成乙個功能模組都單獨提交一次**,每個提交記錄應包含以下資訊:功能模組描述,例如:
新聞新聞模組新增搜尋功能
[功能模組]
[任務類別]
任務類別只包括dev、bug、misc幾種,不能自定義
misc:表示此次提交為完全非功能性變動及雜項變動**,例如文案微調、補充注釋等
描述描述內容務必簡單明瞭
如果一次提交包括多個內容,使用「1. abc; 2. def」 分別說明
接下來我們利用pre-commit每次提交前檢查是否符合上邊定義的規範,具體配置如下
我們先建立pre-commit的hook指令碼,內容如下
#!/bin/bash
repos="$1"
txn="$2"
svnlook=/usr/bin/svnlook
logmsg=$($svnlook log -t "$txn" "$repos")
logformat="\[(.+)\]\[(dev|bug|misc)\](.+)$"
# 判斷提交log與預設的規則是否匹配
[[ $ =~ $ ]] || exit 1
exit 0
logformat為我們根據規範寫的正規表示式,符合******這樣的規則即可
通過svnlook命令拿到本次提交的log記錄,然後與預設的正則進行匹配,通過則繼續往下走,不通過則直接退出狀態1
最終exit退出狀態為0時則表示全部規則驗證通過,進行後續的**提交操作,非0時表示驗證失敗
可以在hook指令碼中寫多條不同的驗證規則,每條規則不通過時返回不同的狀態碼,這樣後續不通過就知道**驗證失敗了,例如檢測提交的檔名不能包含有空格,不然就exit 2等
別忘了給hook指令碼加上可執行許可權
# chmod +x /home/svn/repos/ops-coffee/hooks/pre-commit
這樣就ok了,很簡單,再提交log時就會按照定義的規則來判斷,如果判斷不通過則直接報錯'commit blocked by pre-commit hook'讓你重新寫log
提交成功傳送郵件通知
看了上邊強制log提交規則的示例,想必對svn hooks有了一定的了解,那麼我們趁熱打鐵再來看乙個提交成功傳送郵件的例子
假如我們有乙個賬號叫merge,專門用來合併上線**,經過這個賬號合併的**自動觸發發布api更新**到生產環境,其他賬號合併的**傳送郵件通知給[email protected]的郵箱,那麼該如何實現呢?
首先是**提交(合併)之後觸發,那麼就需要用到post-commit這個hook,具體內容如下
# cat /home/svn/repos/ops-coffee/hooks/post-commit
#!/bin/bash
repos="$1"
rev="$2"
export lang=zh_cn
# svn info
author=$(svnlook author -r $rev $repos)
message=$(svnlook log -r $rev $repos)
changed=$(svnlook changed -r $rev $repos)
repertory=$(echo $repos | awk -f'/' '')
logfile="/tmp/.svn_hooks_post_commit.log"
echo "$author
版本庫:
$repertory - $rev
更新log:
$message
更新內容:
$changed
" > $logfile
if [ $author == merge ];then
curl -h "authorization:token 3w2290j02baa1xb8cemec35k8b" ""
else
mail -s "svn 更新通知:系統版本號【$rev】" [email protected] < $logfile
fi
通過svnlook命令獲取到提交者、log、更新內容的資料,然後將資料拼裝成郵件的正文,以便下邊傳送郵件
然後if判斷提交者是不是merge,如果是則通過curl命令呼叫deploy的api,api會根據所傳的兩個引數v:倉庫名和p:版本號將**發布到對應專案的生產環境上,如果不是則傳送郵件通知
以上為演示**,生產環境的發布各位根據自己實際情況調整
同樣不要忘了給指令碼新增可執行許可權
# chmod +x /home/svn/repos/ops-coffee/hooks/post-commit
這樣就ok了,每次**提交(合併)之後就會判斷是哪個賬號的提交,確定是傳送郵件通知還是直接部署上 關於SVN Hooks(鉤子)的使用 4
tags svn,hooks,svn鉤子,tortoisesvn鉤子 說句實話,對於伺服器svn鉤子,windows平台下選擇vbs並不是最佳解決方案,但是我對vbs的熟悉程度遠大於其他指令碼語言,如python,perl等,所以選擇並不多 要麼是vbs,要麼是bat,bat實現鉤子的例子網上有很多...
Git Subtree 的介紹及使用
有專案a 專案b。有libraryc,為專案a的子專案 子目錄。專案b也想用libraryc,作為自己的子專案 子目錄。希望 同步,維護方便,更新迭代。git submodule orgit subtree拆分libraryccd 專案a git subtree split p libraryc b...
Git Subtree 的介紹及使用
有專案a 專案b。有libraryc,為專案a的子專案 子目錄。專案b也想用libraryc,作為自己的子專案 子目錄。希望 同步,維護方便,更新迭代。git submodule orgit subtree拆分libraryccd 專案a git subtree split p libraryc b...