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

修改:

成功:

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Leetcode—179.最大数【中等】

2023每日刷题&#xff08;六十五&#xff09; Leetcode—179.最大数 算法思想 实现代码 其中sort的lambda自定义排序策略参考自官方文档 class Solution { public:string largestNumber(vector<int>& nums) {string ans;vector<string> strs;for(auto num: …

【离散数学】——期末刷题题库(图论应用题)

&#x1f383;个人专栏&#xff1a; &#x1f42c; 算法设计与分析&#xff1a;算法设计与分析_IT闫的博客-CSDN博客 &#x1f433;Java基础&#xff1a;Java基础_IT闫的博客-CSDN博客 &#x1f40b;c语言&#xff1a;c语言_IT闫的博客-CSDN博客 &#x1f41f;MySQL&#xff1a…

10 Vue3中v-html指令的用法

概述 v-html主要是用来渲染富文本内容&#xff0c;比如评论信息&#xff0c;新闻信息&#xff0c;文章信息等。 v-html是一个特别不安全的指令&#xff0c;因为它会将文本以HTML的显示进行渲染&#xff0c;一旦文本里面包含一些恶意的js代码&#xff0c;可能会导致整个网页发…

Leetcode 1005 K 次取反后最大化的数组和

题意理解&#xff1a; 有k次对元素取反的次数&#xff0c;要求k次取反&#xff0c;消耗完&#xff0c;且使最后的数组和最大。 解题思路&#xff1a; 采用贪心的思路来解题。则需要定义局部最优解和全局最优解。 全局最优解&#xff1a;最终的数组和最大 则我们需要保证绝对值大…

如何设计树形结构

作者简介&#xff1a;大家好&#xff0c;我是smart哥&#xff0c;前中兴通讯、美团架构师&#xff0c;现某互联网公司CTO 联系qq&#xff1a;184480602&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗互联网寒冬 前置知识&#xff1a;前…

UE5 C++(八)— 创建Actor、添加组件

文章目录 Actor和组件介绍Actor组件&#xff08;Component&#xff09; 在蓝图中创建Actor&#xff0c;添加组件在C中创建Actor&#xff0c;添加组件 Actor和组件介绍 Actor 详细介绍可以去看 Actor和几何体官方文档 还有大钊的这篇文章《InsideUE4》GamePlay架构&#xff0…

【算法与数据结构】135、LeetCode分发糖果

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析&#xff1a;本题的思路是要相比较一边&#xff0c;然后在比较另外一边&#xff0c;左右两边一起比较的代码非常难写…

配置BGP的基本示例

一、组网需求&#xff1a; 需要在所有Switch间运行BGP协议&#xff0c;SwitchA、SwitchB之间建立EBGP连接&#xff0c;SwitchB、SwitchC和SwitchD之间建立IBGP全连接。 请确保该场景下互联接口的STP处于未使能状态。因为在使能STP的环形网络中&#xff0c;如果用交换机的VLAN…

谷歌手机安装证书到根目录

1、前提你已经root&#xff0c;安装好面具 2&#xff0c;下载movecert模块&#xff0c;自动帮你把证书从用户证书移动成系统证书 视频教程&#xff0c;手机为谷歌手机 https://www.bilibili.com/video/BV1pG4y1A7Cj?p11&vd_source9c0a32b00d6d59fecae05b4133f22f06 软件下…

持续集成交付CICD:基于ArgoCD 的GitOps 自动化完成前端项目应用发布与回滚

目录 一、实验 1. 环境 2. K8S master节点部署Argo CD 3.基于ArgoCD 实现GitOps &#xff08;同步部署文件&#xff09; 4.基于ArgoCD 实现GitOps &#xff08;同步HELM文件&#xff09; 二、问题 1. ArgoCD 连接K8S集群状态为 Unknown 2.ArgoCD 创建application失败 …

〖大前端 - 基础入门三大核心之JS篇(58)〗- 面向对象案例

说明&#xff1a;该文属于 大前端全栈架构白宝书专栏&#xff0c;目前阶段免费&#xff0c;如需要项目实战或者是体系化资源&#xff0c;文末名片加V&#xff01;作者&#xff1a;哈哥撩编程&#xff0c;十余年工作经验, 从事过全栈研发、产品经理等工作&#xff0c;目前在公司…

Linux(一)Linux理论

文章目录 一、Linux概述1.1 体系结构1.1.1 Linux内核1.1.2 用户态与内核态1.1.3 交换空间1.1.4 CLI和GUI 1.2 开机启动过程1.3 系统运行级别1.4 Linux进程1.4.1 Linux进程通信的方法1.4.2 Linux进程状态 二、文件2.1 Linux文件系统2.2 目录结构2.3 绝对路径和相对路径2.4 日志文…

[SWPUCTF 2021 新生赛]caidao

打开环境 这显示的就是一句话木马呗&#xff0c;直接用中国蚁剑连接&#xff0c;密码是wllm 根目录找到flag

Python Opencv实践 - 手势音量控制

本文基于前面的手部跟踪功能做一个手势音量控制功能&#xff0c;代码用到了前面手部跟踪封装的HandDetector.这篇文章在这里&#xff1a; Python Opencv实践 - 手部跟踪-CSDN博客文章浏览阅读626次&#xff0c;点赞11次&#xff0c;收藏7次。使用mediapipe库做手部的实时跟踪&…

c++输出简单日志带日期时间功能

最近项目需要简单输出日志&#xff0c;用巨大的日志类未免繁琐&#xff0c;于是写了这个简单的日志函数&#xff0c;带日期&#xff0c;MFC下可以直接使用。 直接上代码&#xff1a; template <typename T> std::string ConvertToStringS(T value) {std::stringstream …

nginx转发ingress-nginx问题记录

背景 想直接通过域名访问k8s上的服务. 想到k8s上可以直接通过ingress配置. 不过ingress默认启动的端口3xxxxx. 一般不可能让用户访问我们的服务加上端口. 所以现在要解决直接通过80端口访问ingress的问题. 方案 修改ingress-nginx端口(这个是在网上搜到的方案, 但未选择) 这…

【数据结构和算法】定长子串中元音的最大数目

其他系列文章导航 Java基础合集数据结构与算法合集 设计模式合集 多线程合集 分布式合集 ES合集 文章目录 其他系列文章导航 文章目录 前言 一、题目描述 二、题解 2.1 方法一&#xff1a;滑动窗口 2.2 方法二&#xff1a;滑动窗口优化版 三、代码 3.1 方法一&#xf…

Spring Boot构建项目常用注解

忙着去耍帅&#xff0c;后期补充完整.....................................

搭建esp32-idf开发环境并烧入第一个程序

ESP32下载idf并烧入第一个程序 一.官网下载idf安装包二.安装idf三 .测试安装是否成功3.1进入idf控制台3.2 查看安装版本3.3 编译工程 四.下载程序4.1查看所在端口4.2下载程序4.3 监听串口 一.官网下载idf安装包 点击下载 如图&#xff1a; 我们选择离线下载&#xff0c;注意…

Qt 国际化——创建中英文翻译步骤

Qt 国际化——创建中英文翻译步骤 说明&#xff1a;之前我的csdn博客&#xff0c;第一篇文章发表的就是Qt国际化的文章&#xff08;点击打开&#xff09;&#xff0c;写的也过于简单了&#xff1a; 今天&#xff0c;这篇文章再详细的记录下&#xff0c;中英文翻译的步骤。 一…