持续集成交付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 2
                            docker 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.

修改:

成功:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/260047.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Kubernetes 容器编排(6)

企业级镜像仓库Harbor 上传harbor安装包并安装 $ tar xf harbor-offline-installer-v2.5.3.tgz $ cp harbor.yml.tmpl harbor.yml $ vim harbor.yml hostname: 192.168.246.217# http related config http:# port for http, default is 80. If https enabled, this port will…

【单调栈】LeetCode:1944队列中可以看到的人数

作者推荐 【贪心算法】【中位贪心】.执行操作使频率分数最大 题目 有 n 个人排成一个队列,从左到右 编号为 0 到 n - 1 。给你以一个整数数组 heights ,每个整数 互不相同,heights[i] 表示第 i 个人的高度。 一个人能 看到 他右边另一个人…

机器学习之逻辑回归,一文掌握逻辑回归算法知识文集

🏆作者简介,普修罗双战士,一直追求不断学习和成长,在技术的道路上持续探索和实践。 🏆多年互联网行业从业经验,历任核心研发工程师,项目技术负责人。 🎉欢迎 👍点赞✍评论…

《论文阅读28》Unsupervised 3D Shape Completion through GAN Inversion

GAN,全称GenerativeAdversarialNetworks,中文叫生成式对抗网络。顾名思义GAN分为两个模块,生成网络以及判别网络,其中 生成网络负责根据随机向量产生图片、语音等内容,产生的内容是数据集中没有见过的,也可…

11.2 设备树下的 LED 驱动

一、修改设备树文件 首先进入该目录下 /linux/atk-mpl/linux/my_linux/linux-5.4.31/arch/arm/boot/dts 打开 stm32mp157d-atk.dts 文件,在根节点 "/" 最后输入以下内容: stm32mp1_led {compatible "atkstm32mp1-led"; // 设置…

数据安全传输基础设施平台(四)

接上(三) 6.7.1主框架搭建 VC实现的QQ主窗口抽屉菜单效果,应该说是一个面板吧,可以展开和折叠起来,Outlook 中也有类似的界面,和OICQ 的主界面非常相似。 视图的切分 1)通过AppWizard 生成单…

案例077:基于微信小程序的停车场管理系统设计与实现

文末获取源码 开发语言:Java 框架:SSM JDK版本:JDK1.8 数据库:mysql 5.7 开发软件:eclipse/myeclipse/idea Maven包:Maven3.5.4 小程序框架:uniapp 小程序开发软件:HBuilder X 小程序…

vite与webpack?

vite对比react-areate-app 1、构建速度 2、打包速度 3、打包文件体积

杰发科技AC7840——在Eclipse环境下使用Jlink调试

序 杰发给的代码里面已经做代码相关配置,搭建好eclipse环境即可运行,搭建步骤还是比较简单的。 参考文章 如何使用Eclipse搭配JLink来调试HelloWold应用程序?-电子发烧友网 软件链接 杰发科技Eclipse的sample代码里面的doc文章&#xff…

本地使用 docker 运行OpenSearch + Dashboard + IK 分词插件

准备基础镜像 注意一定要拉取和当前 IK 分词插件版本一致的 OpenSearch 镜像: https://github.com/aparo/opensearch-analysis-ik/releases 写这篇文章的时候 IK 最新版本 2.11.0, 而 dockerhub 上 OpenSearch 最新版是 2.11.1 如果版本不匹配的话是不能用的, 小版本号对不上…

加密后的数据该如何支持模糊查询

加密后的数据该如何支持模糊查询 在日常工作中,我们经常会有一些模糊查询的条件,比如说按照手机号模糊查询,或者是身份证号码。正常情况下我们可以使用 select * from user where mobile like %123% 来模糊查询,但是这种方式是…

实战案例:缓存不一致问题的解决(redis+本地缓存caffine)

一.问题引入 目前在写项目的时候,在B端查看文章,A端修改文章。为了增加效率,以及防止堆内存溢出,在B端选择本地缓存文章的方案。但是目前出现了A端对文章修改之后,B端读的还是旧数据,出现了缓存不一致的问…

【算法与数据结构】1005、LeetCode K 次取反后最大化的数组和

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引,可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析:本题允许某个下标的数字多次翻转,因此思路比较简单。首先,我们要求最大和&…

【【迭代七次的CORDIC算法-Verilog实现】】

迭代七次的CORDIC算法-Verilog实现求解正弦余弦函数 COEDIC.v module CORDIC #(parameter DATA_WIDTH 4d8 , // we set data widthparameter PIPELINE 4d8)(input clk ,input …

vivado 关于时钟

关于时钟 在数字设计中,时钟代表了从寄存器可靠传输数据的时间基准注册。AMD Vivado™集成设计环境(IDE)计时引擎使用时钟计算时序路径要求并通过以下方式报告设计时序裕度的特性松弛计算的方法有关更多信息,请参阅Vivado Design…

什么是数据仪表板?数据可视化仪表盘怎么制作?

在数据经济时代,分析数据是每个企业做出最佳决策的关键。但是,手动分析和解释大量数据是不可行的。数据可视化对于分析数据中存在的各种有价值信息至关重要,包括可见趋势和隐藏趋势等。仪表盘显示可视化趋势和信息,例如 KPI、趋势…

Everything 搜索

正则表达式Regex 首先需要开启 Everything 工具在(字符串)查找时,对正则表达式功能的支持: 需要在【菜单栏】⇒ 【Search】⇒ 勾选【Enable Regex】 查看Everything 支持的语法:

c语言:求算数平均数|练习题

一、题目 输入3个数&#xff0c;求这三个数的算术平均数 二、代码图片【带注释】 三、源代码【带注释】 #include <stdio.h> #include<math.h> //输入正整数a、b、c的值&#xff0c; //求其算术平均值,并保留两个小数位输出 int pass0;//定义一个开关&#xff0c;…

solidity 重入漏洞

目录 1. 重入漏洞的原理 2. 重入漏洞的场景 2.1 msg.sender.call 转账 2.2 修饰器中调用地址可控的函数 1. 重入漏洞的原理 重入漏洞产生的条件&#xff1a; 合约之间可以进行相互间的外部调用 恶意合约 B 调用了合约 A 中的 public funcA 函数&#xff0c;在函数 funcA…

关于“Python”的核心知识点整理大全32

目录 12.6.4 调整飞船的速度 settings.py ship.py alien_invasion.py 12.6.5 限制飞船的活动范围 ship.py 12.6.6 重构 check_events() game_functions.py 12.7 简单回顾 12.7.1 alien_invasion.py 12.7.2 settings.py 12.7.3 game_functions.py 12.7.4 ship.py …