本系列文章目录
(一)基础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样式的
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插件

菜单位于【系统管理】->【插件管理】下

jenkins插件管理

然后搜索下以下插件名称:

  • 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配置
对于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就行了
再截图一下钉钉通知的内容
钉钉通知消息
还有这可爱的小蘑菇:
钉钉发布通知

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐