1 構(gòu)建觸發(fā)器(鉤子)
構(gòu)建觸發(fā)器(webhook)误续,有的人稱為鉤子吗跋,實際上是一個 HTTP 回調(diào),其用于在開發(fā)人員向 gitlab 提交代碼后能夠觸發(fā) jenkins 自動執(zhí)行代碼構(gòu)建操作斧抱。
以下為新建一個開發(fā)分支析命,只有在開發(fā)人員向開發(fā)(develop)分支提交代碼的時候才會觸發(fā)代碼構(gòu)建队丝,而向主分支提交的代碼不會自動構(gòu)建著榴,需要運維人員手動部署代碼到生產(chǎn)環(huán)境。
1.1 gitlab開發(fā)分支創(chuàng)建,代碼提交以及合并流程
- 進(jìn)到gitlab項目里(web-02), 選擇新建分支
- 向開發(fā)分支提交代碼
root@git-client:/opt/web-02# git branch
* master
root@git-client:/opt/web-02# git pull # 拉取最新代碼, 把devlop分支拉下來
Username for 'http://10.0.0.239': developer-01
Password for 'http://developer-01@10.0.0.239':
From http://10.0.0.239/qq/web-02
* [new branch] develop -> origin/develop
Already up to date.
root@git-client:/opt/web-02# git branch
* master
root@git-client:/opt/web-02# git checkout develop # 切換到develop分支
Branch 'develop' set up to track remote branch 'develop' from 'origin'.
Switched to a new branch 'develop'
root@git-client:/opt/web-02# git branch
* develop
master
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>qq</title>
</head>
<body>
<h1>web-02-v.111111</h1>
<h1>web-02-v.222222</h1>
<h1>web-02-v.333333</h1>
<h1>web-02-v.444444</h1>
<h1>web-02-v.555555</h1>
<h1>web-02-v.666666</h1>
<h1>web-02-v.777777</h1>
<h1>web-02-v.888888</h1>
<h1>web-02-v.999999</h1>
<h1>web-02-v.10</h1>
</body>
</html>
root@git-client:/opt/web-02# git add index.html
root@git-client:/opt/web-02# git commit -m "v10"
[develop 24d3539] v10
1 file changed, 1 insertion(+)
root@git-client:/opt/web-02# git push -u origin
Username for 'http://10.0.0.239': developer-01
Password for 'http://developer-01@10.0.0.239':
Counting objects: 3, done.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 302 bytes | 302.00 KiB/s, done.
Total 3 (delta 1), reused 0 (delta 0)
remote:
remote: To create a merge request for develop, visit:
remote: http://10.0.0.239/qq/web-02/-/merge_requests/new?merge_request%5Bsource_branch%5D=develop
remote:
To http://10.0.0.239/qq/web-02.git
9e27543..24d3539 develop -> develop
Branch 'develop' set up to track remote branch 'develop' from 'origin'.
- 此時master分支是v9版本, develop分支是v10版本
- 模擬開發(fā)上傳代碼到develop分支后, 提交代碼合并申請, 由開發(fā)項目管理人員批準(zhǔn)合并
公司中一般都是由開發(fā)負(fù)責(zé)人去做代碼合并, 開發(fā)將代碼提交到開發(fā)分支后, 把master分支合并到develop上, 這樣develop分支就是最新的代碼, 之后部署到測試環(huán)境進(jìn)行測試, 當(dāng)測試沒問題后, 需要提交一個合并申請, 把開發(fā)分支的代碼合并到master分支, 然后由開發(fā)負(fù)責(zé)人進(jìn)行審批合并.
這里模擬developer-01為開發(fā)普通用戶, developer-02為開發(fā)負(fù)責(zé)人, 先給developer-02授權(quán)qq項目的owner. 權(quán)限設(shè)置的最小粒度是一個組, 不能對項目單獨授權(quán)
- 假設(shè)developer-01提交了v10版本后, 測試沒問題, 之后提交merge request
因為developer-01本身就是管理員賬戶, 因此, 自己也會提示可以批準(zhǔn)申請, 工作中請求會被發(fā)給開發(fā)的負(fù)責(zé)人, 這里就是developer-02賬號
負(fù)責(zé)人登陸后會在右上角看到merge requests提示
點擊同意即可, 不用刪除原分支
開發(fā)回到gitlab, 驗證master分支升級到了v10版本
1.2 配置gitlab觸發(fā)器
1.2.1 jenkins安裝插件
Gitlab Authentication Plugin和Gitlab Hook Plugin
注意: 1.4.2版本的插件會有安全隱患, 所有的jenkins配置都是以明文保存, 具有jenkins服務(wù)器文件系統(tǒng)權(quán)限的用戶可以登錄并且修改配置, 造成構(gòu)建不可用, 還需要重新配置. 因此, jenkins服務(wù)器的用戶名和密碼不要和其他服務(wù)器一樣, 要妥善保管
1.2.2 修改jenkins用戶權(quán)限
如果想使用構(gòu)建觸發(fā)器, 那么需要修改用戶授權(quán)為登陸用戶可以做任何事, 并且匿名用戶具有可讀權(quán)限. 這樣之前設(shè)置的Roles-based就失效了, 任何用戶登陸都是超級管理員權(quán)限, 因此, 觸發(fā)器的配置可以在任意賬戶配置
啟動跨站請求偽造保護(hù)
早期的jenkins版本, 配置這些后, gitlab就可以跨站觸發(fā)構(gòu)建了, 不過新版本的jenkins還需要添加一個認(rèn)證字段, 否則會報錯, 不過可以直接用curl命令或者通過Python腳本觸發(fā)
openssl rand -hex 12
b8f29d278dc227ffbce317be # 通過shell命令生成一個令牌, 然后配置到j(luò)enkins上, gitlab訪問jenkins時需要攜帶這個令牌
1.2.3 配置jenkins項目觸發(fā)器
在需要自動觸發(fā)的項目里, 配置令牌
修改遠(yuǎn)程觸發(fā)jenkins構(gòu)建的URL
JENKINS_URL/job/projectA-web1/build?token=TOKEN_NAME
http://10.0.0.249:8080/job/projectA-web1/build?token=b8f29d278dc227ffbce317be
1.2.4 配置gitlab上的系統(tǒng)鉤子, 需要用root賬號登陸
- 測試
這時會報錯, 因為新版的jenkins需要一個專門字段做認(rèn)證
1.2.5 解決報錯
方法1: 在Linux服務(wù)器上, 使用curl命令進(jìn)行觸發(fā), 此時是不需要認(rèn)證的. 只需指明在構(gòu)建觸發(fā)器中填寫的token即可
在任意終端執(zhí)行即可
root@git-client:/opt/web-02# curl http://10.0.0.249:8080/job/projectA-web1/build?token=b8f29d278dc227ffbce317be
執(zhí)行命令后, 會觸發(fā)項目構(gòu)建
驗證v10版本部署成功
這里web-02項目仍然部署的是master版本
方法2: 使用Python處理
pip3 install jenkinsapi
from jenkinsapi.jenkins import Jenkins
conn = Jenkins("http://10.0.0.249:8080", username="tom",password="ning0803030221",useCrumb="b8f29d278dc227ffbce317be")
conn.build_job("projectA-web1")
運行腳本后, 會立即觸發(fā)項目的構(gòu)建, userCrumb字段就是在構(gòu)建觸發(fā)器里填寫的Token
總結(jié): 對于Jenkins構(gòu)建觸發(fā)器, 如果是老版本Jenkins, 可以按照上述方法, 完成gitlab自動觸發(fā)jenkins構(gòu)建. 新版本可以在代碼上傳到開發(fā)分支后, 手動使用curl命令或者Python腳本實現(xiàn)構(gòu)建觸發(fā). 無論是自動觸發(fā)還是通過curl和Python, 都只適用于開發(fā)測試分支, 對于master分支的部署, 需要經(jīng)過測試后, 由運維人員到Jenkins手動構(gòu)建
2 構(gòu)建后項目關(guān)聯(lián)
用于多個 job 相互關(guān)聯(lián)憎乙,串行執(zhí)行多個 job 的場景票罐,可以通過安裝插件 Parameterized Trigger 觸發(fā)執(zhí)行其他 project. 也就是當(dāng)一個項目完成構(gòu)建后, 自動觸發(fā)另一個項目的構(gòu)建
使用場景就是把一個job分成多個, 可以實現(xiàn)多個job的復(fù)用, 比如, 把關(guān)閉tomcat定義為一個job, 那么這個job就可以在任意job結(jié)束后進(jìn)行調(diào)用. 不過一般用的不多, 實際都是把所有的工作在一個job內(nèi)完成
案例: 當(dāng)projectB-web1執(zhí)行完, 自動觸發(fā)projectB-web2的構(gòu)建, 讓web1執(zhí)行停止tomcat服務(wù)操作, web2執(zhí)行啟動tomcat服務(wù)操作
- 修改projectB-web1的構(gòu)建
- 修改projectB-web2的構(gòu)建
- 測試構(gòu)建
3 視圖
視圖可用于將 job 進(jìn)行分組顯示,比如將同一個業(yè)務(wù)的job放在一個視圖顯示泞边,安裝build pipeline 插件之后將會有一個+號用于創(chuàng)建視圖.
Jenkins共有三個視圖類別, 我的視圖, 列表視圖和pipeline視圖
3.1 使用pipeline視圖
- 安裝build pipeline插件
- 重啟jenkins
root@jenkins:~# systemctl restart jenkins
- 創(chuàng)建pipeline視圖
- 點擊構(gòu)建, 刷新頁面后會顯示新的job正在執(zhí)行
- 可以查看控制臺輸出
- 視圖創(chuàng)建后, 會顯示在jenkins首頁
3.2 使用我的視圖
我的視圖就是用來用戶登陸后, 用來顯示自己權(quán)限所能看到的job, 不過用戶登陸本身也是顯示自己所能看到的job, 所以一般沒什么用
3.3 使用列表視圖
- 選擇視圖需要顯示的job
這樣該列表視圖就會只顯示定義的job, 因此, 列表視圖就是按照不同的業(yè)務(wù), 不同的項目, 對job進(jìn)行分類
3.4 使用腳本批量觸發(fā)任務(wù)構(gòu)建
- 利用Python腳本, 可以實現(xiàn)多個任務(wù)的串行構(gòu)建, 效率遠(yuǎn)高于在頁面用鼠標(biāo)點擊
from jenkinsapi.jenkins import Jenkins
conn = Jenkins("http://10.0.0.249:8080", username="tom",password="ning0803030221",useCrumb="b8f29d278dc227ffbce317be")
# 需要構(gòu)建哪個job, 只需要添加即可
conn.build_job("projectA-web1")
conn.build_job("projectA-web2")
conn.build_job("projectB-web1")
conn.build_job("projectB-web2")
- 只要把需要構(gòu)建的項目的job, 編寫到腳本里, 即可一次運行, 觸發(fā)所有的構(gòu)建任務(wù). 工作中, 可以和開發(fā)協(xié)商需要構(gòu)建哪些業(yè)務(wù)的哪些項目, 提前把構(gòu)建任務(wù)配置好, 需要部署時, 直接運行Python腳本, 即可完成批量的構(gòu)建觸發(fā)