應用場景
jenkins 發版任務在測試環境中由於需要經常發版調試,而且不像生產環境存在業務持續穩定性需求,所以可以把測試環境發版權限放開給開發人員或者配置webhook 實現推送代碼后的自動發版。
Jenkins 端配置
Build Triggers 模塊下配置觸發器,webhook 相關的觸發有如下三種:
1、Trigger builds remotely (e.g., from scripts) 2、Build when a change is pushed to GitLab. GitLab CI Service URL: http://x.x.x.x:8888/project/project-name 3、Generic Webhook Trigger
Generic Webhook Trigger 功能強大,此處介紹它的使用配置,前提是安裝相關的插件,才能使用,此處默認已經安裝了。
1、觸發發版的url

2、Post content parameters
就是發送發版的請求的請求體中的內容,可以通過勾選后面的Print post content 在發版的時候打印請求的請求體內容就會知道都有哪些數據被發送過來,一個完整的請求體以json格式展示如下

{"object_kind":"tag_push", #觸發類型,有tag推送或者分支推送等
"before":"0000000000000000000000000000000000000000", #推送前的id ,如果為00..表示新建
"after":"c4365c6029f00aeddf33dab026c2590312ed6743", #新建tag 后的id
"ref":"refs/tags/v0.7dev", #推送的tag。通過$.ref 來提取
"checkout_sha":"c4365c6029f00aeddf33dab026c2590312ed6743",
"message":null, #message表示打tag 的時候標注的備注信息,例如git tag v1.1 -m "備注信息"
"user_id":435,
"user_name":"kzf",
"user_email":"kzf-pbj@asdf.com","project_id":796,
"repository":{"name":"practice", #倉庫信息如下
"url":"git@x.x.x.x:kzf/practice.git",
"description":"個人練習使用",
"homepage":"http://git@x.x.x.x:kzf/practice",
"git_http_url":"http://x.x.x.x/kzf/practice.git",
"git_ssh_url":"git@x.x.x.x:kzf/practice.git",
"visibility_level":10},
"commits":[{"id":"c4365c6029f00aeddf33dab026c2590312ed6743", #commits里面是列表,通過$..commits[0]表示提取它的第一個列表所有內容
"message":"del dev1\n", #提交的時候的commit 信息,例如git commit -m "提交信息",
"timestamp":"2020-04-12T18:17:16+08:00", #$..commit[0].timestamp 表示提取此字段
"url":"http://x.x.x.x/kzf/practice/commit/c4365c6029f00aeddf33dab026c2590312ed6743",
"author":{"name":"feefsdf","email":"feefsdf@asdf.com"}}],
"total_commits_count":1}
具體配置示例
3、請求的驗證token
當發版的請求過來后jenkins 要通過token驗證請求,可以把每個項目的項目名稱作為token配置此處,這樣每個項目都是唯一的,例如gitlab 端發送請求 http://JENKINS_URL/generic-webhook-trigger/invoke?token=test1 過來后,這樣每個項目能夠區別開來不可用相同的token 那樣就會把相同token 項目都發版了。
4、Optional filter
此處作用是條件判斷,只有符合Expression中定義的正則的變量Text ,才會觸發發版否則不會發版。Text處的變量是通過前面Post content parameters 區域提取的變量,message 。
下面就是在post content parameters 處提取的變量message ,這個變量名Variable 隨便定義,Expression 中都是請求頭里面存在的json格式的key。
其他配置可以默認或者不配置即可。
gitlab 端的配置
找到發版任務對應的git 倉庫項目,編輯>webhooks,添加觸發發版的url接口。
實際使用中經驗總結
多項目使用同一個git 倉庫
這種情況,如果每次gitlab 都觸發所有項目發版那么沒問題,但是如果只是想觸發其中一個項目發版,其他項目不發布,這個怎么去處理呢。?
解決:
1、首先可以通過tag 形式去發版,每次推送tag 到倉庫觸發發版。
2、打tag 的時候配置注釋信息來說明要發布的項目名稱:git tag v1.1 -m "project:app-server"
3、在Jenkins端配置generic webhook trigger 的時候在Post content parameters 區域提取注釋信息,存儲此信息的字段是message,接着在Optional filter 區域進行過濾判斷,message中的信息滿足正則條件中項目名稱時則發布,不滿 足表示為其他項目就不發布。