Jenkins+git+webhook自動觸發部署和測試任務

需求:

目前上線前會將需要上線的代碼push到release分支,然後由人工填寫參數點擊觸發jenkins上的任務。希望這個過程能完成自動化,只要有人往release上推代碼,就自動跑部署release分支並測試

解決辦法及步驟:

1.在jenkins裏需要自動觸發的job裏的“源碼管理”部分添加設置,如下圖。填好git倉庫url和需要檢測的分支名稱


注意事項:

a.在填url的時候可能會提示找不到命令的錯誤,遇到這個錯的解決辦法是去jenkins系統管理->系統設置,找到git設置部分,在Path to Git executable裏填上git的路徑,這個路徑在服務器上執行命令which git可得到。

b.還有可能遇到的是報Permission denied這樣的錯誤。這是由於jenkins運行時所用的系統用戶沒有訪問git倉庫權限導致的。需要在運行jenkins的用戶目錄下生成git的公鑰和私鑰,並將owner改成該用戶。

2.在jenkins需要觸發的job裏“構建觸發器”部分勾選Poll SCM,但裏面什麼都不填。

如果填則是填crontab那種格式的命令。填了的話就是讓它每隔一段時間去檢查下源碼管理裏所設置的git倉庫裏的分支有沒有更新,有更新則觸發該job,沒更新則不觸發。這樣設置的缺點是檢查得如果太過頻繁,是對網絡資源的浪費,但是檢查時間隔得太長觸發又不及時。

而且使用過程中有個問題,就是比如5分鐘檢查一次,第一次檢查的時候檢測到有更新,於是執行job,這個job執行的時間比較長超過了檢查時間5分鐘,那下一次檢查的時候,由於這個job還正在運行中,則它還會認爲這更新沒有被job執行,如此便會再次觸發job。只有在觸發的job執行完時,它才知道這個更新是被這個構建執行過的,不用再觸發了。

所以官方上也並不推薦這種方法,推薦的是遠程觸發的方式,比如用git的post-receive鉤子觸發,只要在鉤子裏寫上這句即可。

curl http://yourserver/git/notifyCommit?url=[&branches=branch1[,branch2]*][&sha1=]

由於我們的項目用的是gitLab,然後gitLab有個webhook可以用。原理上跟post-receive鉤子是差不多的。

3.在Jenkins裏裝一個插件https://wiki.jenkins-ci.org/display/JENKINS/Gitlab+Hook+Plugin

看名字就知道這個插件是爲了配合gitLab用的

4.在gitLab項目中添加web hook(Project Settings --> WebHooks)



gitlab的web hook有很多種,可以滿足不同的需求,因爲我們的需求是push代碼的時候觸發,所以選的是Push events.

Url的作用:這個地方填的url是gitlab發請求用的。其實它的原理就是當開發人員在git上的操作觸發這個hook時,gitlab就向這個url發一個post請求。請求中帶着一堆參數比如提交者是誰,提交的分支是哪個,commit號是多少等等。接受這個請求的那端可以利用這些信息去處理後續的一些事情,比如部署測試通知等等。

此處,由於我們在jenkins上安裝了gitlab hook插件,所以我們只需要按照它的使用方法在url裏填上以下鏈接即可:

http://your-jenkins-server/gitlab/notify_commit

效果:

有人release上提交代碼後,就會自動觸發jenkins上的任務。push到別的分支是不會觸發的。


參考文獻:

https://github.com/elvanja/jenkins-gitlab-hook-plugin#notify-commit-hook

https://wiki.jenkins-ci.org/display/JENKINS/Git+Plugin

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