1、概述
在上一篇文章,連接以下:html
https://www.cnblogs.com/xiao987334176/p/13074198.htmljava
已經實現了基於Jenkins+Gitlab+Harbor+Rancher+k8s CI/CD,可是有一個問題,須要jenkins ssh登陸到k8s master節點執行kubectl修改鏡像地址。docker
可是因爲安全問題,不容許jenkins ssh登陸到k8s master節點。這個時候,能夠經過Redeploy Rancher2.x Workload插件來完成修改鏡像地址。shell
這樣就避免了ssh登陸問題。api
2、Rancher建立api key
這個是給Jenkins來使用的。安全
點擊用戶右上角-->API & Keys服務器
添加keyssh
輸入描述,選擇永不過時,這裏不指定做用範圍。測試
請根據實際狀況來原則ui
建立成功後,必定要保存。它只會顯示一次
對於Redeploy Rancher2.x Workload Plugin而言,它只須要用到2個參數。
API訪問地址: https://10.212.82.86/v3 Bearer Token: token-96p7n:d8sw4vlff68kqspcwnflbwpptt565c5cszltwbhgb4wcz9w6k5fxmj
下面會重點介紹
3、jenkins配置
插件安裝
Redeploy Rancher2.x Workload
這個插件是專門針對Rancher2.x版本的,1.x版本的插件爲Rancher
Environment Injector
這個插件是用來修改jenkins 環境變量用的。
添加憑據
點擊憑據
點擊進去
再點擊
添加憑據
類型選擇rancher2.x API Keys
說明:
ID: 這個是惟一的,隨便填寫。
描述: 隨便填寫
Endpoint:Rancher api地址,上面Rancher api keys裏面的信息
Trust certification:信任證書,這裏必定要勾選。
Bearer Token:不記名token,,上面Rancher api keys裏面的信息
填寫完成後,點擊Test Connection按鈕,出現Connect Succeed!,表示鏈接成功。
最後點擊保存。
新建job
名稱爲:test_admin_rancher,選擇自由風格。
通用配置
參數化構建
源碼管理
執行shell腳本
完整代碼以下:
export HARBOR_PROJECT='10.212.82.86:1180/java/admin-master' case $Status in Deploy) echo "Status:$Status" cd ${WORKSPACE} mvn -f pom.xml clean package cp dockerfile target cd target docker build -t ${HARBOR_PROJECT}:${BUILD_NUMBER} . docker push ${HARBOR_PROJECT}:${BUILD_NUMBER} docker rmi ${HARBOR_PROJECT}:${BUILD_NUMBER} echo "BUILD_ID=${BUILD_NUMBER}" > ${WORKSPACE}/env.txt echo "Completing!" ;; Rollback) echo "Status:$Status" echo "Version:${BUILD_ID}" echo "BUILD_ID=${BUILD_ID}" > ${WORKSPACE}/env.txt ;; *) exit ;; esac
這裏有2個步驟,分別是發佈和回滾。在最後一步時,寫入了一個env.txt,它就是用來修改jenkins環境的。
注入環境變量
寫入路徑 ${WORKSPACE}/env.txt
從新部署Rancher2.x工做負載
內容以下:
說明:
第一行顯示亂碼的,就是上面jenkins建立的憑證
Workload API Path:工做api路徑,注意:必須是以/project開頭的。先來登陸Rancher後臺,查看工做負載
先找到我須要發佈的應用admin-master-->api查看
跳轉的url爲:
https://10.212.82.86/v3/project/c-l5nxb:p-dghs7/workloads/statefulset:default:admin-master
那麼Workload API Path的值,就是:以/project/開頭,一直到後面部分。也就是上面我截圖顯示的。
Always Pull Image:這裏表示老是拉取鏡像
Update Images:更新的鏡像地址。10.212.82.86:1180/java/admin-master:${BUILD_ID},注意:這裏有一個變量BUILD_ID。發佈和回滾時,都會用到此變量。
表示鏡像的版本!
最後點擊保存
4、測試發佈和回滾
發佈
先來看目錄運行的鏡像版本,顯示是32
登陸jenkins,發佈一下。
點擊Build with Parameters
點擊開始構建
查看控制檯輸出:
+ export HARBOR_PROJECT=10.212.82.86:1180/java/admin-master + HARBOR_PROJECT=10.212.82.86:1180/java/admin-master + case $Status in + echo Status:Deploy Status:Deploy + cd /var/lib/jenkins/workspace/test_admin_rancher + mvn -f pom.xml clean package ... + echo BUILD_ID=1 + echo 'Completing!' Completing! [EnvInject] - Injecting environment variables from a build step. [EnvInject] - Injecting as environment variables the properties file path '/var/lib/jenkins/workspace/test_admin_rancher/env.txt' [EnvInject] - Variables injected successfully. set image tag from "10.212.82.86:1180/java/admin-master:32" to "10.212.82.86:1180/java/admin-master:1" redeploy Rancher2.x workload succeed! Finished: SUCCESS
能夠看到鏡像更新爲:10.212.82.86:1180/java/admin-master:1
登陸jenkins服務器,查看環境變量文件
# cat /var/lib/jenkins/workspace/test_admin_rancher/env.txt BUILD_ID=1
注意:此文件定義的環境會覆蓋jenkins的環境變量,所以鏡像版本爲1。
刷新Rancher頁面,發現地址已經更改過來了。
回滾
假設我須要回滾版本到32,請確保harbor倉庫中,此鏡像存在。
選擇回滾,輸入32
查看控制檯輸出:
+ export HARBOR_PROJECT=10.212.82.86:1180/java/admin-master + HARBOR_PROJECT=10.212.82.86:1180/java/admin-master + case $Status in + echo Status:Rollback Status:Rollback + echo Version:32 Version:32 + echo BUILD_ID=32 [EnvInject] - Injecting environment variables from a build step. [EnvInject] - Injecting as environment variables the properties file path '/var/lib/jenkins/workspace/test_admin_rancher/env.txt' [EnvInject] - Variables injected successfully. set image tag from "10.212.82.86:1180/java/admin-master:1" to "10.212.82.86:1180/java/admin-master:32" redeploy Rancher2.x workload succeed! Finished: SUCCESS
能夠看到鏡像更新爲:10.212.82.86:1180/java/admin-master:32
登陸jenkins服務器,查看環境變量文件
# cat /var/lib/jenkins/workspace/test_admin_rancher/env.txt BUILD_ID=32
注意:此文件定義的環境會覆蓋jenkins的環境變量,所以鏡像版本爲32。
刷新Rancher頁面,發現地址已經更改過來了。
總結
經過jenkins Redeploy Rancher2.x Workload插件,調用Rancher api,修改鏡像地址,完成了應用服務的發佈和回滾。
在上篇文章中,用到了Pipeline。可是這篇文章中,用的是自由風格。
其實我也想用Pipeline,可是我不知道如何在Pipeline中調用Redeploy Rancher2.x Workload插件,因此只能用自由風格了。