本系列文章目錄(計劃中)
- 基礎k8s yaml腳本發佈
- helm+shell腳本優化大量冗餘配置發佈
- jenkins用戶審覈的流水化方式部署
- service mesh(istio)服務網格化發佈
前言
上一篇採用rancher2+kubernetes+skywalking部署springcloud項目(二[helm版本])文章裏完成了通過自已寫的shell腳本實現了對項目的自動化部署。
通過執行shell腳本來觸發部署還得操作linux輸入命令啥的,雖然B格高但始終還是覺得有點不方便。
對於發佈這種東西個人應該更傻瓜式一點就對了。所以,那就直接用jenkins吧!
哪個模塊想發佈就點哪裏!
對於spring cloud這種項目,子模塊動不動就好幾十個,如果還是通過傳統的jenkins項目來發布其實是很不方便的,修改某個項目的配置啥的還得點點點填填填,要是能用代碼來管理髮布的流程就好了。
對於這一點可能開發jenkins的大佬們也早已想到了,於是早在幾年前jenkins就早已推出了pipeline插件,允許用戶通過編寫部署腳本來對發佈的流程進行統一管理。我也還記得當時還試用過,感覺確實很不錯後那時的我還專門寫了一篇博文記錄了一下:jenkins2.0+pipeline體驗筆記。
看到那篇文章的發佈時間是2017年(畢業那年)的,這讓我想到了一首歌的歌詞:
- 猶記得那年我們都還很年幼
- 而如今琴聲幽幽我的等候你沒聽過
- ……
是呀!時光匆匆,轉眼已畢業三年
將發佈的流程用jenkins的pipeline來改造就比較簡單了,輕車熟路直接開寫就行!爲了方便,決定還是將jenkins通過docker來安裝
演示效果
再來個Blue Ocean樣式的
docker中安裝jenkins
docker pull jenkins/jenkins:lts
創建一個jenkins目錄,用於存放jenkins的東西
sudo mkdir -p /data/jenkins_home
運行jenkins容器,暴露出8081端口出來
docker run -d --name jenkins -p 8081:8080 -v /data/jenkins_home:/var/jenkins_home jenkins/jenkins:lts
改變目錄的權限
chown -R 1000:1000 /data/jenkins_home/
查看下日誌,看下是否啓動正常
docker logs -f jenkins
待啓動好後,日誌會提示默認密碼在initialAdminPassword文件中,於是查看下日誌文件就行了
cat /data/jenkins_home/secrets/initialAdminPassword
獲取出密碼後直接登錄就行,然後安裝對應的插件
安裝插件
登錄jenkins系統後,進入插件管理界面,添加pipeline插件
菜單位於【系統管理】->【插件管理】下
然後搜索下以下插件名稱:
- Blue Ocean(好看的界面)
- Pipeline(管道插件)
- DingTalk(發釘釘消息)
編寫pipeline腳本
先寫一個感覺通用一點的腳本,內容主要包括釘釘發消息和審批功能
/**
* 獲取項目模塊列表
*/
def static getModuleList() {
return ['auth-service', 'config', 'gateway', 'monitor', 'registry', 'svca-service', 'svcb-service', 'zipkin']
}
/**
* 發送釘釘審計消息
* @param deployModuleName 部署的項目名稱
* @param packageSubmitter 申請發佈人
* @param auditSubmitterDingTalkMobile 審計人釘釘的手機號
* @return
*/
def sendDingtalkAuditMsg(deployModuleName, packageSubmitter, auditSubmitterDingTalkMobile) {
dingtalk(
robot: dingTalkRobotId,
type: 'ACTION_CARD',
title: '審批通知消息',
text: [
'審批提醒',
'---',
'大佬好呀,您有一個發佈項目的審批提醒喔!',
"- 模塊名稱: ${deployModuleName}",
"- 發起人: ${packageSubmitter}"
],
btns: [
[
title : '前往審批',
actionUrl: 'https://www.dingtalk.com/'
],
[
title : '不予處理',
actionUrl: 'https://www.dingtalk.com/'
]
],
at: [auditSubmitterDingTalkMobile]
)
}
/**
* 發佈部署成功的通知
* @param deployModuleName 模塊名稱
* @param packageSubmitter 發包人
* @param aduitInputResult 審覈人
*/
def sendDeploySuccessDingtalkMsg(deployModuleName, packageSubmitter, aduitInputResult) {
dingtalk(
robot: dingTalkRobotId,
type: 'MARKDOWN',
title: '部署完畢通知',
atAll: true,
text: [
'部署完畢通知',
'---',
"各位大佬好呀!",
"- 模塊名稱: <font color=blue>${deployModuleName}</font>",
"- 發起人: ${packageSubmitter}",
"- 審批人: ${aduitInputResult}",
"",
"已完成部署"
]
)
}
pipeline {
agent any
environment {
//打包輸入框結果
packageInputResult = ''
//審批輸入框結果
aduitInputResult = ''
packageSubmitter = 'puhaiyang(具有發起打包權限的用戶名)'
auditSubmitter = 'puhaiyang(具有審覈權限的jenkins用戶名)'
dingTalkRobotId = '釘釘機器人ID'
auditSubmitterDingTalkMobile = '審覈人的釘釘手機號,用於在釘釘羣裏@他'
moduleList = getModuleList()
}
stages {
stage('打包') {
steps {
script {
//部署的模塊列表
packageInputResult = input id: 'Test_deploy_001', message: '請選擇將要發佈的模塊', ok: '確定',
parameters: [choice(choices: moduleList, description: '請選擇部署的項目', name: 'deployModuleName')],
submitter: "${packageSubmitter}", submitterParameter: 'packageSubmitter'
}
echo "${packageInputResult.deployModuleName} will deploy!!!"
}
}
stage('審批') {
steps {
//發送通知告訴審批人有新的任務需要進行審批了
sendDingtalkAuditMsg(packageInputResult.deployModuleName, packageInputResult.packageSubmitter, auditSubmitterDingTalkMobile)
script {
aduitInputResult = input message: "確定發佈${packageInputResult.deployModuleName}模塊嗎?",
ok: '確定', submitter: "${auditSubmitter}", submitterParameter: 'auditSubmitter'
}
echo "${aduitInputResult}審覈完畢"
}
}
stage('發佈') {
steps {
//TODO 執行發佈腳本;sh ssh -i /data/keys/mykeys [email protected] "~/helm-deploy.sh registry"
echo "${packageInputResult.deployModuleName}發佈完畢"
//發佈完,通知所有人發佈完成了
sendDeploySuccessDingtalkMsg("${packageInputResult.deployModuleName}", "${packageInputResult.packageSubmitter}", "${aduitInputResult}")
}
}
}
}
創建pipeline項目
將上面的插件安裝好後,創建一個流水線的項目
對於pipeline script有兩種方式可以配置
- 一種是直接將pipeline的腳本貼在框框裏
- 另一種是配置一個倉庫地址,每次運行時jenkins自動從配置的地址中去拉取一次(較爲靈活,跟寫代碼一樣一樣的,本文中用的這種方式)
在Repository URL中填寫git的地址,如我這裏的:
https://github.com/puhaiyang/spring-boot-cloud.git
腳本路徑處填寫jenkinsfile的路徑(https://github.com/puhaiyang/spring-boot-cloud/blob/master/devops/jenkins/jenkinsfile),如我這裏的:
devops/jenkins/jenkinsfile
運行查看效果
填好後,點下Build Now就行了
再截圖一下釘釘通知的內容
還有這可愛的小蘑菇: