持续集成交付CICD:K8S 通过模板文件自动化完成前端项目应用发布
目录
一、实验
1.环境
2.GitLab 更新deployment文件
3.GitLab更新共享库前端项目CI与CD流水线
4.K8S查看前端项目版本
5.Jenkins 构建前端项目
6.Jenkins 再次构建前端项目
二、问题
1. Jenkins 构建CI 流水线报错
2. Jenkins 构建CI 流水线弹出脚本报错
3. Jenkins 构建CD 流水线报错
4.URL中特殊字符实现哪些功能
5.sed如何实现替换特殊字符
一、实验
1.环境
(1)主机
表1 主机
主机 | 架构 | 版本 | IP | 备注 |
master1 | K8S master节点 | 1.20.6 | 192.168.204.180 | jenkins slave (从节点) |
node1 | K8S node节点 | 1.20.6 | 192.168.204.181 | |
node2 | K8S node节点 | 1.20.6 | 192.168.204.182 | |
jenkins | jenkins主节点 | 2.414.2 | 192.168.204.15:8080 | gitlab runner (从节点) |
harbor私有仓库 | 1.2.2 | 192.168.204.15 | ||
gitlab | gitlab 主节点 | 12.10.14 | 192.168.204.8:82 | jenkins slave (从节点) |
sonarqube | 9.6 | 192.168.204.8:9000 |
2.GitLab 更新deployment文件
(1)项目新建目录,用于存放上传的deployment 替换文件
(2)准备更新模板文件deployment.yaml
__APPNAME__(应用名称)对应Jenkins作业名称__NAMESPACE__ (名称空间) 对应业务名称__INAGENAME__(镜像名称)
(3)更新完成
(4)项目目录如下:
3.GitLab更新共享库前端项目CI与CD流水线
(1)查看项目架构
(2)更新K8S CI流水线 (k8sci.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{// 获取模板文件fileData = gitlabutil.GetRepoFile(22,"deployment.yaml", "master")sh "rm -fr deployment.yaml"writeFile file: 'deployment.yaml', text: fileData// 替换模板文件内容namespace = "${JOB_NAME}".split("/")[0]appName ="${JOB_NAME}".split("/")[-1].split("_")[0]sh """sed -i 's#__PORT__#${env.port}#g' deployment.yamlsed -i 's#__APPNAME__#${appName}#g' deployment.yamlsed -i 's#__NAMESPACE__#${namespace}#g' deployment.yamlsed -i 's#__IMAGENAME__#${env.imageName}#g' deployment.yaml"""// 上传替换后的版本文件(新建文件或者更新文件)newYaml = sh returnStdout: true, script: 'cat deployment.yaml'println(newYaml)//更新gitlab文件内容base64Content = newYaml.bytes.encodeBase64().toString()// 会有并行问题,同时更新报错try {gitlabutil.UpdateRepoFile(22,"${appName}%2f${env.branchName}.yaml",base64Content, "master")} catch(e){gitlabutil.CreateRepoFile(22,"${appName}%2f${env.branchName}.yaml",base64Content, "master")}}}}}}
(3)更新K8S CD流水线 (k8scd.jenkinsfile)
@Library("mylib@master") _
import org.devops.*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("GetDeployFile"){steps{script {env.appName = "${env.projectName}"env.deployFile = "${env.appName}/${env.branchName}.yaml"//println("GetCode")fileData = gitlabbutil.GetRepoFile(22,"${env.appName}%2f${env.branchName}.yaml", "master")//println(fileData)sh "rm -fr ${env.deployFile}"writeFile file: "${env.deployFile}", text: fileData//sh "ls -l; cat deployment.yaml"sh "ls -l "}}}stage("DeployAPP"){steps{script{env.namespace = "${env.groupName}"sh """## 发布应用kubectl apply -f ${env.deployFile} -n ${env.namespace}"""// 获取应用状态5.times{sh "sleep 2; kubectl -n ${env.namespace} get pod | grep ${env.appName} "}}}}stage("RollOut"){input {message "是否进行回滚"ok "提交"submitter "david,aa"parameters {choice(choices: ['yes','no'], name: 'opts')}}steps{script{switch ("${opts}"){case "yes":sh " kubectl rollout undo deployment/${env.appName} -n ${env.namespace}"breakcase "no":break}}}}}
}
4.K8S查看前端项目版本
(1)外部测试访问(当前版本为1.1.7)
# curl http://devops03-devops-ui.devops.com:31291
(2) 另开一个终端用watch命令观察pod变化
# watch -n 1 "kubectl get pod -n devops03"
5.Jenkins 构建前端项目
(1)Jenkins给前端项目CI流水线添加参数添加字符参数port
(2)Jenkins给前端项目CD流水线添加参数添加字符参数branchName
(3) 构建前端项目CI流水线
(4)成功
(5)GitLab查看deployment部署文件已自动上传(RELEASE-1.1.5.yaml)
(6) 构建前端项目CD流水线
(7) 观察pod变化
(8)外部测试访问(当前版本为1.1.5)
# curl http://devops03-devops-ui.devops.com:31291
(9)不进行回滚
(10)完成
6.Jenkins 再次构建前端项目
(1) 构建前端项目CI流水线
(2)成功
(3)GitLab查看deployment部署文件已自动上传(RELEASE-1.1.6.yaml)
(4) 构建前端项目CD流水线
(5) 观察pod变化
(6)外部测试访问(当前版本为1.1.6)
# curl http://devops03-devops-ui.devops.com:31291
(7)不进行回滚
(8)完成
二、问题
1. Jenkins 构建CI 流水线报错
(1)报错
(2)原因分析
函数名错误
(3)解决方法
修改函数名。
修改前:
修改后:
2. Jenkins 构建CI 流水线弹出脚本报错
(1)报错
(2)原因分析
script不允许使用静态方法
(3)解决方法
运行script使用静态方法
根据弹出提示页面,点击进入。
点击Approve
完成
重写构建项目成功
3. Jenkins 构建CD 流水线报错
(1) 报错
(2)原因分析
yaml文件格式错误
(3)解决方法
修改deploymeny模板文件
修改前:
修改后:
成功:
4.URL中特殊字符实现哪些功能
(1)URL特殊字符
有些符号在URL中是不能直接传递的,如果要在URL中传递这些特殊符号,那么就要使用他们的编码了。
编码的格式为:%加字符的ASCII码,即一个百分号%,后面跟对应字符的ASCII(16进制)码值。例如 空格的编码值是"%20"。
如果不使用转义字符,这些编码就会当URL中定义的特殊字符处理。
(2)URL特殊符号及编码 十六进制值
1) + URL 中+号表示空格 %2B
2) 空格 URL中的空格可以用+号或者编码 %20
3) / 分隔目录和子目录 %2F
4) ? 分隔实际的 URL 和参数 %3F
5) % 指定特殊字符 %25
6) # 表示书签 %23
7) & URL 中指定的参数间的分隔符 %26
8) = URL 中指定参数的值 %3D
5.sed如何实现替换特殊字符
(1)普通操作可以使用冒号(:)井号(#)正斜杠(/)来作为分隔符
sed -i 's#abc#def#g' geng.file ---将文件geng中的abc替换成defcat geng.file | sed 's/abc/def/g' ---打印文件geng,并将其中的abc替换成def
(2)对于变量做替换
sed 若是单引号括起来的,变量上得再额外加个单引号才能引用生效;
若是双引号括起来的,可直接引用生效。
1)举例
pa='127.0.0.1/32'; field='ip_allow=123'; \
echo $field | sed 's#^ip_allow=.*#ip_allow=${pa}#g' 结果:ip_allow=${pa} --变量替换未生效2)更改
echo $field | sed 's#^ip_allow=.*#ip_allow='${pa}'#g'结果:ip_allow=127.0.0.1/323)更改
echo $field | sed "s#^ip_allow=.*#ip_allow=${pa}#g"结果:ip_allow=127.0.0.1/32
(3) 特殊字符替换,反斜杠、正斜杠、双引号、$符
单个转义:多加个反斜杠做转义即可:反斜杠(\\)、正斜杠(\/)、双引号(\")
单转多个:参考如下列表
表2 特殊字符转换
实现目标 | 方法 | 能否用单引号还是双引号括起来 | ||
单引号 | 双引号 | 为什么 | ||
反斜杠(\)替换成两个反斜杠(\\) | sed -i 's#\\#\\\\#g' file 或sed -i 's:\\:\\\\:g' file | √ | × | 反斜杠用双引号括起来会报错 |
反斜杠(\)替换成正斜杠(/) | sed -i 's#\\#\/#g' file | √ | × | 反斜杠用双引号括起来会报错 |
双引号(")替换成两个双引号("") | sed -i 's#\"#\"\"#g' file sed -i "s#\"#\"\"#g" file | √ | √ | |
单引号(')替换成两个单引号('') | sed -i "s#'#''#g" file | × | √ | 不能用单引号括起来,分不清了 |
($)替换成\$ | sed -i 's:\$:\\\$:g' file | √ | × | 不能用双引号,否则会认为是$(正则匹配结尾位置)行的结果追加字符呢 |
(4)curl时用的变量,sed转化
curl -H 'Content-Type: application/json' -X POST -d 参数(参数中涉及到特殊字符都得转义,而且要多转一层,即$得转成\\$,才能原封不动的供后续使用)
#值替换单引号、反斜杠、双引号 curl的时候用,多一层转义,所以\要用\\sed -i "s#'#''#g" ${file} ---单引号要转成两个单引号sed -i 's#\\#\\\\\\\\#g' ${file} ---反斜杠sed -i "s:\":\\\\\":g" ${file} ---双引号sed -i 's:\$:\\\\\$:g' ${file} ---$符
curl引用参数的这种形式有两种写法:
1)直接引用单个参数变量
curl -H 'Content-Type: application/json' -X POST -d '{"type":"0","name":" ' ${pa_name} ' "}'
这种需要对变量额外加上一个单引号,才能引用生效。2)整个参数变量作为一个整体(推荐)
param="{\"type\":\"0\", \"name\":\"${pa_name}\"}"
curl -H 'Content-Type: application/json' -X POST -d "${param}"
相关文章:

持续集成交付CICD:K8S 通过模板文件自动化完成前端项目应用发布
目录 一、实验 1.环境 2.GitLab 更新deployment文件 3.GitLab更新共享库前端项目CI与CD流水线 4.K8S查看前端项目版本 5.Jenkins 构建前端项目 6.Jenkins 再次构建前端项目 二、问题 1. Jenkins 构建CI 流水线报错 2. Jenkins 构建CI 流水线弹出脚本报错 3. Jenkins…...

【TB作品】51单片机 实物+仿真-电子拔河游戏_亚博 BST-M51
代码工程。 http://dt4.8tupian.net/2/28880a66b12880.pg3这段代码是用于一个数字拔河游戏的嵌入式系统,采用了基于8051架构的单片机,使用Keil C51编译器。 主要功能包括: 数码管显示:使用了四个数码管(通过P2的控制…...
MyBatis ${}和#{}区别
sql防注入底层jdbc类型转换当简单类型参数$不防止Statment不转换value#防止preparedStatement转换任意 除模糊匹配外,杜绝使用${} MyBatis教程,大家可以借鉴 MyBatis 教程_w3cschool 主要区别 1、#{} 是预编译处理,${} 是直接替换&#…...

大型语言模型:RoBERTa — 一种稳健优化的 BERT 方法
slavahead 一、介绍 BERT模型的出现BERT模型带来了NLP的重大进展。 BERT 的架构源自 Transformer,它在各种下游任务上取得了最先进的结果:语言建模、下一句预测、问答、NER标记等。 尽管 BERT 性能出色,研究人员仍在继续尝试其配置࿰…...

webpack知识点总结(基础应用篇)
一、为什么需要webpack 1.为什么使用webpack ①传统的书写方式,加载太多脚本会导致网络瓶颈,如不小心改变JavaScript文件加载顺序,项目会崩溃,还会导致作用域问题、js文件太大无法做到按需加载、可读性和可维护性太低的问题。 ②…...

监控k8s controller和scheduler,创建serviceMonitor以及Rules
目录 一、修改kube-controller和kube-schduler的yaml文件 二、创建service、endpoint、serviceMonitor 三、Prometheus验证 四、创建PrometheusRule资源 五、Prometheus验证 直接上干货 一、修改kube-controller和kube-schduler的yaml文件 注意:修改时要一个节…...

支持向量机 支持向量机概述
支持向量机概述 支持向量机 Support Vector MachineSVM ) 是一类按监督学习 ( supervisedlearning)方式对数据进行二元分类的广义线性分类器 (generalized linear classifier) ,其决策边界是对学习样本求解的最大边距超亚面 (maximum-margin hyperplane)与逻辑回归和…...

http -- 跨域问题详解(浏览器)
参考链接 参考链接 1. 跨域报错示例 Access to XMLHttpRequest at http://127.0.0.1:3000/ from origin http://localhost:3000 has been blocked by CORS policy: Response to preflight request doesnt pass access control check: No Access-Control-Allow-Origin header…...

Java对接腾讯多人音视频房间回调接口示例
在前面我们已经对接好了腾讯多人音视频房间相关内容:Java对接腾讯多人音视频房间示例 为了完善业务逻辑,我们还需要对接它的一些回调接口 官方文档地址 主要就下面这些 这里因为比较简单直接上代码 里面有些工具类和上一章一样这里就没贴,需要…...

vp与vs联合开发-通过FrameGrabber连接相机
添加控件 1.CogRecordDisplay 控件 用于显示图像 初始化相机对象方法 //启动窗体时 调用初始化相机方法 //封装相机关闭方法 //窗体关闭时 调用相机关闭方法 拍照 设置采图事件 // 保存图像 设置曝光按钮事件 1.可变参数...

音视频直播核心技术介绍
直播流程 采集: 是视频直播开始的第一个环节,用户可以通过不同的终端采集视频,比如 iOS、Android、Mac、Windows 等。 前处理:主要就是美颜美型技术,以及还有加水印、模糊、去噪、滤镜等图像处理技术等等。 编码&#…...

JNDI注入Log4jFastJson白盒审计不回显处理
目录 0x00 前言 0x01 Maven 仓库及配置 0x02 JNDI 注入简介 0x03 Java-第三方组件-Log4J&JNDI 0x04 Java-第三方组件-FastJson&反射 0x05 白盒审计 - FastJson 0x06 白盒审计 - Log4j 0x07 不回显的处理方法 0x00 前言 希望和各位大佬一起学习,如果…...
FPGA实现腐蚀和膨胀算法verilog设计及仿真 加报告
要在FPGA上实现腐蚀和膨胀算法,你可以按照以下步骤进行: 图像存储:首先,你需要设计一个图像存储器来存储待处理的图像数据。这可以采用FPGA内部存储器或外部存储器。 读取图像数据:使用适当的接口从图像存储器中读取图像数据,并将其加载到FPGA的计算单元中。 结构元素定义…...
核和值域的关系:什么是矩阵的秩?
核和值域的关系:什么是矩阵的秩? 这篇博客将介绍一个任意矩阵的核和值域的关系,并由此说明矩阵秩的意义、子空间维数、子空间正交。 1、矩阵的核:N(A) A ∈ C m n A\in C^{m\times n} A∈Cmn,矩阵的核,记…...

【MyBatis Plus】Service Mapper内置接口讲解
🎉🎉欢迎来到我的CSDN主页!🎉🎉 🏅我是Java方文山,一个在CSDN分享笔记的博主。📚📚 🌟推荐给大家我的专栏《MyBatis-Plus》。🎯🎯 &am…...

制作一个简单 的maven plugin
流程 首先, 你需要创建一个Maven项目,推荐用idea 创建项目 会自动配置插件 pom.xml文件中添加以下配置: <project> <!-- 项目的基本信息 --> <groupId>com.example</groupId> <artifactId>my-maven-plugi…...

基于linux系统的Tomcat+Mysql+Jdk环境搭建(三)centos7 安装Tomcat
Tomcat下载官网: Apache Tomcat - Which Version Do I Want? JDK下载官网: Java Downloads | Oracle 中国 如果不知道Tomcat的哪个版本应该对应哪个版本的JDK可以打开官网,点击Whitch Version 下滑,有低版本的,如…...
Ubuntu环境下SomeIP/CommonAPI环境搭建详细步骤
环境搭建 1.Boost安装 下载Boost源码 : https://www.boost.org/users/download/ 编译安装 首先安装编译所需依赖 sudo apt-get install build-essential g sudo apt-get install installpython-dev autotools-dev sudo apt-get install installlibicu-dev buil…...

maven 项目导入异常问题
问题如下 一、 tomcat正再运行的包是哪一个 不同构建、打包情况下分别运行 out\artifacts下 当直接去Project Structure下去构建artifacts 后,运行tomcat 则会在out下target下 reimport项目后,则会在artifacts自动生成部署包。删除tomcat之前deployment 下的包(同…...

在 VMware 虚拟机上安装黑苹果(Hackintosh):免费 macOS ISO 镜像下载及安装教程
在 VMware 虚拟机上安装黑苹果(Hackintosh):免费 macOS ISO 镜像下载及安装教程 VMware 虚拟机解锁 macOS 安装选项使用 macOS iso 系统镜像安装使用 OpenCore 做引导程序安装 在 VMware 虚拟机上安装黑苹果(Hackintosh):免费 macOS ISO 镜像下载及安装…...
day52 ResNet18 CBAM
在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...

Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...

优选算法第十二讲:队列 + 宽搜 优先级队列
优选算法第十二讲:队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...

保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek
文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama(有网络的电脑)2.2.3 安装Ollama(无网络的电脑)2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...
【JavaSE】多线程基础学习笔记
多线程基础 -线程相关概念 程序(Program) 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序,比如我们使用QQ,就启动了一个进程,操作系统就会为该进程分配内存…...

计算机基础知识解析:从应用到架构的全面拆解
目录 前言 1、 计算机的应用领域:无处不在的数字助手 2、 计算机的进化史:从算盘到量子计算 3、计算机的分类:不止 “台式机和笔记本” 4、计算机的组件:硬件与软件的协同 4.1 硬件:五大核心部件 4.2 软件&#…...

【从零开始学习JVM | 第四篇】类加载器和双亲委派机制(高频面试题)
前言: 双亲委派机制对于面试这块来说非常重要,在实际开发中也是经常遇见需要打破双亲委派的需求,今天我们一起来探索一下什么是双亲委派机制,在此之前我们先介绍一下类的加载器。 目录 编辑 前言: 类加载器 1. …...