Git服務器,倉庫的hook監控


簡單應用場景:代碼提交到git倉庫,倉庫監控到變化的jar包,然后把變化的jar包推到私服maven倉庫。

Git預定義了觸發時機:

ClientSide hooks:

1 pre-commit,當執行commit動作時先執行此hook,可以用此hook做一些檢查,比如代碼風格檢查,或者先跑測試。

2 prepare-commit-msg, 當commit時需要輸入message前會觸發此hook,可以用此hook來定制自己的default message信息。

3 commit-msg,當用戶輸入commit的message后被觸發,可以用此hook校驗message的信息,比如是否符合規定,有沒有cr等。

4 post-commit, 當commit完成后被觸發,可以用此hook發送notification等。

5 pre-rebase, rebase之前會被觸發,可以用此hook來拒絕所有的已經push的commits進行rebase操作。

6 post-merge, 當merge成功后,會觸發此hook。

7 pre-push, 當push時,remote refs被更新,但是在所有的objects傳輸前被觸發。

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 把變化的文件推到倉庫。

注意點

  1. 在 post-receive階段調用git pull報錯 提示 fatal: Not a git repository: '.' 。需要在最前面加上unset $(git rev-parse --local-env-vars)
  2. 在 post-receive腳本中無法調用mvn自己設定的環境變量問題,可以使用軟連接,把自己設置的環境變量軟鏈到以下提示的目錄,比如/usr/local/bin


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM