采用rancher2+kubernetes+skywalking部署springCloud项目(三[jenkins审核发布])
本系列文章目录(计划中)基础k8s yaml脚本发布helm+shell脚本优化大量冗余配置发布jenkins用户审核的流水化方式部署service mesh(istio)服务网格化发布前言上一篇采用rancher2+kubernetes+skywalking部署springcloud项目(二[helm版本])文章里完成了通过自已写的shell脚本实现了对项目的自动化部署。通过执行shell脚本来
本系列文章目录
(一)基础k8s yaml脚本发布
(二)helm+shell脚本优化大量冗余配置发布
(三)jenkins用户审核的流水化方式部署
(四)service mesh(istio)服务网格化发布
(五)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 test@192.168.6.66 "~/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就行了
再截图一下钉钉通知的内容
还有这可爱的小蘑菇:
更多推荐
所有评论(0)