当前位置: 首页 > news >正文

持续集成交付CICD:HELM 自动化完成前端项目应用发布与回滚

目录

一、实验

1.环境

2. GitLab 共享库新建HELM CI流水线

3.Jenkins新建HELM CI流水线

5.Jenkins构建前端项目

6.GitLab 共享库新建HELM CD流水线

7.Jenkins新建HELM CD流水线

8.HELM完成前端项目应用发布与回滚

9.Jenkins再次构建前端项目

10.HELM再次完成前端项目应用发布与回滚

二、问题

1. HELM CD流水线报错


一、实验

1.环境

(1)主机

表1  主机

主机架构版本IP备注
master1K8S master节点1.20.6192.168.204.180

jenkins slave

(从节点)

helm3.6.0
git1.8.3.1
node1K8S node节点1.20.6192.168.204.181
node2K8S node节点1.20.6192.168.204.182
jenkins

 jenkins主节点      

2.414.2192.168.204.15:8080

 gitlab runner

(从节点)

harbor私有仓库1.2.2192.168.204.15
gitlabgitlab 主节点     12.10.14192.168.204.8:82

jenkins slave

(从节点)

sonarqube9.6192.168.204.8:9000

2. GitLab 共享库新建HELM CI流水线

(1)共享库新建CI流水线

(2)修改k8scihelm.jenkinsfile

@Library("mylib@master") _
import org.devops.*def checkout = new Checkout()
def build = new Build()
def unittest = new UnitTest()
def sonar = new Sonar()
def gitlabutil = new Gitlab()pipeline {agent { label "build"}options {skipDefaultCheckout true}stages{stage("Checkout"){steps{script {println("GetCode")checkout.GetCode("${env.srcUrl}","${env.branchName}")}}}stage("build"){steps{script{println("Build")build.CodeBuild("${env.buildTool}")}}}stage("UnitTest"){steps{script{println("Test")unittest.CodeTest("${env.buildTool}")}}}stage("SonarScan"){steps {script {groupName = "${JOB_NAME}".split("/")[0]projectName ="${JOB_NAME}".split("/")[-1].split("_")[0]sonar.CodeSonar("${env.buildTool}",projectName,groupName)}}}stage("PushImage"){steps {script {repoName = "${JOB_NAME}".split("/")[0]projectName ="${JOB_NAME}".split("/")[-1].split("_")[0]env.registry = "192.168.204.15"env.imageName = "${env.registry}/${repoName}/${projectName}:${env.branchName}"withCredentials([usernamePassword(credentialsId: '8c662308-4991-4576-9826-74a5417de685', passwordVariable: 'DOCKER_PASSWD', usernameVariable: 'DOCKER_USER')]) {sh """#重写HTML首页echo "${env.imageName}" > dist/index.html #构建镜像docker build -t ${env.imageName} .#登录镜像仓库docker login -u ${DOCKER_USER} -p ${DOCKER_PASSWD} ${env.registry}#上传镜像docker push  ${env.imageName}#删除镜像sleep 2docker rmi ${env.imageName}"""}}}}stage("ReleaseFile"){steps{script{env.namespace = "${JOB_NAME}".split("/")[0]env.appName ="${JOB_NAME}".split("/")[-1].split("_")[0]// 获取values.yaml文件fileData = gitlabutil.GetRepoFile(23,"${env.appName}%2fvalues.yaml", "master")yamlData = readYaml text: fileData// 替换模板文件内容yamlData.image.tag  = "${env.imageName}".split(":")[-1]yamlData.image.repository = "${env.registry}/${env.namespace}/${env.appName}"//保存yaml文件sh "rm -fr values.yaml"writeYaml  charset: 'UTF-8', file: 'values.yaml', data: yamlData// 上传替换后的版本文件(新建文件或者更新文件)newYaml = sh returnStdout: true, script: 'cat values.yaml'println(newYaml)//更新gitlab文件内容base64Content = newYaml.bytes.encodeBase64().toString()// 会有并行问题,同时更新报错try {gitlabutil.UpdateRepoFile(23,"${env.appName}%2fvalues.yaml",base64Content, "master")} catch(e){gitlabutil.CreateRepoFile(23,"${env.appName}%2fvalues.yaml",base64Content, "master")}}}}}}


 

3.Jenkins新建HELM CI流水线

(1)新建CI流水线

(2)修改脚本路径

(3)新建视图

(4)列表添加

(5)查看视图

5.Jenkins构建前端项目

(1)Jenkins构建前端项目 CI流水线,指定版本为RELEASE-1.1.6

(2)完成

(3)GitLab HELM项目显示更新了文件values.yaml

更新前:

更新后:

6.GitLab 共享库新建HELM CD流水线

(1)共享库新建CD流水线

(2)修改k8scdhelm.jenkinsfile

@Library("mylib@master") _
import org.devops.*def checkout = new Checkout()
def gitlabbutil = new Gitlab()
env.groupName = "${JOB_NAME}".split("/")[0]
env.projectName ="${JOB_NAME}".split("/")[-1].split("_")[0]pipeline {agent { label "k8s"}options {skipDefaultCheckout true}stages{stage("GetChartRepo"){steps{script {println("GetCode")checkout.GetCode("${env.srcUrl}","${env.branchName}")}}}stage("DeployAPP"){steps{script{env.namespace = "${env.groupName}"env.appName = "${env.projectName}"// HELM 发布sh """helm package "${env.appName}/"helm upgrade --install --create-namespace  "${env.appName}" ./"${env.appName}"-*.tgz -n ${env.namespace}helm history "${env.appName}"  -n ${env.namespace}"""//获取release的历史版本env.revision = sh returnStdout: true, script: """helm history ${env.appName} -n ${env.namespace} | grep -v 'REVISION' | awk '{print \$1}' """println("${env.revision}")println("${env.revision.split('\n').toString()}")env.REVISION = "${env.revision.split('\n').toString()}"println("${env.REVISION}")// 获取应用状态5.times{sh "sleep 2; kubectl -n ${env.namespace} get pod | grep ${env.appName}"}}}}stage("RollOut"){steps{script{//获取release的历史版本env.revision = sh returnStdout: true, script: """helm history ${env.appName} -n ${env.namespace} | grep -v 'REVISION' | awk '{print \$1}' """//println("${env.revision}")//println("${env.revision.split('\n').toString()}")env.REVISION = "${env.revision.split('\n').toString()}"println("${env.REVISION}")def result = input message: 'RollBack?',ok: 'submit',parameters: [choice(choices: "${env.REVISION}", description: '', name: 'revision')]env.result = result - "\n"echo "Actions is  ${env.result}, doing......."if ( "${env.result}" != ""){sh """ helm rollback ${env.appName} ${env.result} -n ${env.namespace}  """} else {println("Skip rollback .....")}}}}}
}

(3)查看共享库目录

7.Jenkins新建HELM CD流水线

 (1)新建CD流水线

(2)修改脚本路径

(3)复制Clone项目地址

(4)添加字符参数

(5)新建并查看视图

8.HELM完成前端项目应用发布与回滚

(1)K8S master节点另开一个终端用watch命令观察pod变化

# watch -n 1 "kubectl get pod -n devops03"

(2)外部测试访问(当前版本为1.1.6)

# curl http://devops03-devops-ui.devops.com:31291

(3)Jenkins构建前端项目CD 流水线,指定分支为master

(4)选择回滚 1 版本

相当于选择1 版本

# helm rollback devops03-devops-ui 1 -n devops03

(5)完成

(6)观察pod变化

9.Jenkins再次构建前端项目

(1)Jenkins构建前端项目 CI流水线,指定版本为RELEASE-1.1.7

(2)完成

(3)GitLab HELM项目显示更新了文件values.yaml

更新前:

更新后:

10.HELM再次完成前端项目应用发布与回滚

(1)Jenkins构建前端项目CD 流水线,指定分支为master

(2)观察pod变化

(3)外部测试访问(当前版本为1.1.7)

# curl http://devops03-devops-ui.devops.com:31291

(4)选择回滚 6 版本

相当于选择6 版本

# helm rollback devops03-devops-ui 1 -n devops03

(5)完成

(6)观察pod变化

(7)外部测试访问(当前版本为1.1.6)

# curl http://devops03-devops-ui.devops.com:31291

(8)查看历史版本

# helm history devops03-devops-ui -n devops03

二、问题

1. HELM CD流水线报错

(1) 报错

(2)原因分析

GitLab HELM项目只有master分支

(3)解决方法

分支名输入master.

修改:

成功:

相关文章:

  • HBase基础知识(二):HBase集群部署、HBaseShell操作
  • Linux的/proc/self/学习
  • Starting the Docker Engine...一直转圈
  • 中国人民大学金融加拿大女王大学硕士项目——你愿意花一年时间完成蜕变吗
  • SAP系统标准表之间的关联关系对应
  • 职场遇到瓶颈如何破解?不妨看看中国人民大学金融加拿大女王大学硕士项目
  • 微信商家0.2费率如何申请
  • 服务器量化训练操作说明
  • 虾皮广告怎么做:如何在虾皮平台上进行广告投放
  • 【玩转TableAgent数据智能分析】借助全球高校数据多维度分析案例,体验TableAgent如何助力用户轻松洞察数据,赋能企业高效数智化转型
  • 【C语言】动态内存管理基础知识——动态通讯录,如何实现通讯录容量的动态化
  • 数据分析基础之《numpy(4)—ndarry运算》
  • 第四十一章 XML 映射参数摘要
  • opencv静态链接error LNK2019
  • Peter算法小课堂—贪心与二分
  • 【刷算法】从上往下打印二叉树
  • Apache Zeppelin在Apache Trafodion上的可视化
  • Essential Studio for ASP.NET Web Forms 2017 v2,新增自定义树形网格工具栏
  • github从入门到放弃(1)
  • gulp 教程
  • Intervention/image 图片处理扩展包的安装和使用
  • Python学习之路13-记分
  • Quartz初级教程
  • Spring Cloud Feign的两种使用姿势
  • underscore源码剖析之整体架构
  • 从零开始学习部署
  • 缓存与缓冲
  • 开源中国专访:Chameleon原理首发,其它跨多端统一框架都是假的?
  • 面试题:给你个id,去拿到name,多叉树遍历
  • 使用parted解决大于2T的磁盘分区
  • 使用权重正则化较少模型过拟合
  • 微信小程序:实现悬浮返回和分享按钮
  • 一道面试题引发的“血案”
  • 用mpvue开发微信小程序
  • 格斗健身潮牌24KiCK获近千万Pre-A轮融资,用户留存高达9个月 ...
  • ​520就是要宠粉,你的心头书我买单
  • ​软考-高级-系统架构设计师教程(清华第2版)【第15章 面向服务架构设计理论与实践(P527~554)-思维导图】​
  • (1) caustics\
  • (1)(1.11) SiK Radio v2(一)
  • (10)Linux冯诺依曼结构操作系统的再次理解
  • (10)STL算法之搜索(二) 二分查找
  • (Mirage系列之二)VMware Horizon Mirage的经典用户用例及真实案例分析
  • (二)Eureka服务搭建,服务注册,服务发现
  • (论文阅读11/100)Fast R-CNN
  • (强烈推荐)移动端音视频从零到上手(上)
  • (区间dp) (经典例题) 石子合并
  • (原創) 如何使用ISO C++讀寫BMP圖檔? (C/C++) (Image Processing)
  • (转)nsfocus-绿盟科技笔试题目
  • **CI中自动类加载的用法总结
  • .NET单元测试
  • /usr/local/nginx/logs/nginx.pid failed (2: No such file or directory)
  • :中兴通讯为何成功
  • @EnableConfigurationProperties注解使用
  • @JsonSerialize注解的使用
  • @ModelAttribute 注解