簡單應用場景:代碼提交到git倉庫,倉庫監控到變化的jar包,而後把變化的jar包推到私服maven倉庫。git
Git預約義了觸發時機:服務器
ClientSide hooks:maven
1 pre-commit,當執行commit動做時先執行此hook,能夠用此hook作一些檢查,好比代碼風格檢查,或者先跑測試。ide
2 prepare-commit-msg, 當commit時須要輸入message前會觸發此hook,能夠用此hook來定製本身的default message信息。post
3 commit-msg,當用戶輸入commit的message後被觸發,能夠用此hook校驗message的信息,好比是否符合規定,有沒有cr等。測試
4 post-commit, 當commit完成後被觸發,能夠用此hook發送notification等。3d
5 pre-rebase, rebase以前會被觸發,能夠用此hook來拒絕全部的已經push的commits進行rebase操做。blog
6 post-merge, 當merge成功後,會觸發此hook。rem
7 pre-push, 當push時,remote refs被更新,可是在全部的objects傳輸前被觸發。it
8 pre-auto-gc, 當git gc --auto執行前被觸發。在垃圾回收以前作一些驗證或備份是挺不錯的。
ServerSide hooks:
1 pre-receive, 當收到push動做以前會被執行。
2 update, 也是收到push動做以前被執行,可是有可能被執行屢次,每一個branch一次。
3 post-receive, 當push動做已經完成的時候會被觸發,能夠用此hook來push notification等,好比發郵件,通知持續構建服務器等。
簡單解決方案(git倉庫使用的是裸倉庫):因爲裸倉庫不保存實際文件,只保存變化過程。因此在檢測到倉庫有變化是,須要先把變化git pull到服務器的另一個單獨的目錄,這樣才能獲取到實際存在倉庫的代碼或者文件,以後再deloy到私服。在鉤子腳本post-receive階段使用read oldValue newValue refName 獲取到變化以前的commitId1 和變化後的commitId2,而後執行git diff commitId1 commitId2 --name-only 獲得變化的文件,而後使用mvn deloy 把變化的文件推到倉庫。
注意點