持续集成交付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备注
master1K8S master节点1.20.6192.168.204.180

jenkins slave

(从节点)

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 
gitlab

gitlab 主节点       

12.10.14192.168.204.8:82

jenkins slave

(从节点)

 sonarqube9.6192.168.204.8:9000 

 

2.GitLab 更新deployment文件

(1)项目新建目录,用于存放上传的deployment 替换文件

61c1cbe42f2d49a39e69240126b465b4.png0302eeaaa9314db0b00609479c98cf34.png

(2)准备更新模板文件deployment.yaml

 __APPNAME__(应用名称)对应Jenkins作业名称__NAMESPACE__ (名称空间)  对应业务名称__INAGENAME__(镜像名称) 

(3)更新完成

601bde8c1f414594be88b29fad1cd1b1.png

(4)项目目录如下:

6a39dfb70567465d913ec49e65801f4f.png

 

3.GitLab更新共享库前端项目CI与CD流水线

(1)查看项目架构

623fb835973a495c830c9ec5b72a42f8.png

(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

32d8f31c58604548bdd6cc611ab8295d.png

(2)  另开一个终端用watch命令观察pod变化

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

d96aae45ce34497591dc6de5697a69c5.png

47a29171ffd848509def7e5d120697d6.png

 

5.Jenkins 构建前端项目

(1)Jenkins给前端项目CI流水线添加参数添加字符参数port

196fbfedc0c74af294f3ddba9543342e.png

(2)Jenkins给前端项目CD流水线添加参数添加字符参数branchNameab052818e67444dfaf556bb479cd11b4.png

 

(3) 构建前端项目CI流水线

4e61d5320ba74b25a254f2b0788afe8d.png

(4)成功

657b576137aa4d3d8a6331d25eada137.png

5203e2aeeb5f4120bad2a3deb55945a2.png

 

(5)GitLab查看deployment部署文件已自动上传(RELEASE-1.1.5.yaml)

434f94317f334b50a9796c0feabb9a4e.png

(6) 构建前端项目CD流水线d1c81cb7941f44e5854bffaf7f6b2f64.png

(7) 观察pod变化

8fdf0d54fe094e7fb1fb2982237a138d.pngca0e8e4c9e01415aae78c449fde74bd3.png45782720009a44cd85d92180f2f26bd6.png7e827018b4be476fb283aea9b6c353b1.png

(8)外部测试访问(当前版本为1.1.5)

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

26984850e4ae42cb85ff70b1384dea00.png

(9)不进行回滚

300eb1721dff471b8e6c1b6173b81891.png

(10)完成

4df8695a8cf14ac5be378553274eb472.png

 

6.Jenkins 再次构建前端项目

(1) 构建前端项目CI流水线

9fee5006590e468ca6e533cda043c8c6.png

(2)成功

7b527348e58943108ab98d44150c0e10.png4f64c6b568344c90adc1139a8714ba19.png

(3)GitLab查看deployment部署文件已自动上传(RELEASE-1.1.6.yaml)

580bf6ea655c4bf3a44640955f355896.png

(4) 构建前端项目CD流水线bce3be17b9234b3ab77ca4bd400d4919.png

(5) 观察pod变化

1688804adfca4414ad42046457ddd287.png8fd04a1ced684c0a8a53da51b3a90468.pngd51cfaf94d5d4ee8aab483ce4555ed36.png

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

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

d3f58ce4df0740eca5618712df063206.png

(7)不进行回滚

e9b689b356944152a69688dbd0f8dbd8.png

(8)完成

654e375590794adf80c7af252b620e2b.png

 

二、问题

1. Jenkins 构建CI 流水线报错

(1)报错

acdbe0abbb2448f69f539cf8f8bfc43f.png

(2)原因分析

函数名错误

(3)解决方法

修改函数名。

修改前:

c992530857914cc4b17c0812f0a39723.png

修改后:

b6b8a6fd3a634c7bbdbd28d7022b1b2e.png

 

 

2. Jenkins 构建CI 流水线弹出脚本报错

(1)报错

dac675a89db84b22ba0cf1a0429db99a.png

(2)原因分析

script不允许使用静态方法

(3)解决方法

运行script使用静态方法

根据弹出提示页面,点击进入。

fc79c8d85a7f496ca4afdf809f215b5b.png

点击Approve

8b9cd0905d99413db07ea1c0a35fe636.png

完成

91619c37d02244ee825946f230503240.png

重写构建项目成功

39907b913566440889afda475addf7a6.png

3. Jenkins 构建CD 流水线报错

(1) 报错

f0191d23859141a59087d93bd2538cb7.png

(2)原因分析

yaml文件格式错误

(3)解决方法

修改deploymeny模板文件

修改前:

02616c8eeb1c4e1eada1e0e6423e5fa9.png

修改后:

841077c010824c1589c62e1ec3fa5d7c.png

成功:

be3873f0b9da4f7386c365cc8c36caf2.png

 

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}"

 

 

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

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

相关文章

AI性能再提升12.5%,ZStack Cube 超融合一体机基于第五代英特尔®至强®可扩展处理器解决方案发布

12月15日,以“Al无处不在,创芯无所不及”为主题的2023英特尔新品发布会暨AI技术创新派对上,云轴科技ZStack与英特尔联合发布基于第五代英特尔 至强 可扩展处理器的 ZStack Cube 超融合一体机解决方案白皮书(简称解决方案&#xff…

【HarmonyOS开发】ArkUI中的自定义弹窗

弹窗是一种模态窗口,通常用来展示用户当前需要的或用户必须关注的信息或操作。在弹出框消失之前,用户无法操作其他界面内容。ArkUI 为我们提供了丰富的弹窗功能,弹窗按照功能可以分为以下两类: 确认类:例如警告弹窗 Al…

C# 调用腾讯混元大模型

写在前面 今天用C#调用了一下腾讯混元大模型,调用代码贴一下,具体的效果等深入使用后再来评价。 GitHub - TencentCloud/tencentcloud-sdk-dotnet: Tencent Cloud API 3.0 SDK for .NET 腾讯混元大模型简介_腾讯混元大模型购买指南_腾讯混元大模型操作…

代码随想录27期|Python|Day18|二叉树|路径总和iii|找树左下角的值|从中序与后序遍历序列构造二叉树

第一次刷的时候题解都不是精简版 513. 找树左下角的值 - 力扣(LeetCode) 注意这道题不是寻找最左侧的左节点,而是寻找最底层位于左端的节点(可能是左节点,有可能是右节点)。 层序遍历 层序遍历比较简单&…

Oracle的学习心得和知识总结(三十)| OLTP 应用程序的合成工作负载生成器Lauca论文翻译及学习

目录结构 注:提前言明 本文借鉴了以下博主、书籍或网站的内容,其列表如下: 1、参考书籍:《Oracle Database SQL Language Reference》 2、参考书籍:《PostgreSQL中文手册》 3、EDB Postgres Advanced Server User Gui…

springMVC-数据格式化

1、基本介绍 在一个springmvc项目中,当表单提交数据时,如何对表单提交的数据进行格式的转换呢? 只要是数据进行网络传输都是以字符串的形式,进入内存后才有数据类型。 springmvc在上下文环境内置了一些转换器&#xff0c…

leetcode每日一题打卡

leetcode每日一题 746.使用最小花费爬楼梯162.寻找峰值1901.寻找峰值Ⅱ 从2023年12月17日开始打卡~持续更新 746.使用最小花费爬楼梯 2023/12/17 代码 解法一 class Solution {public int minCostClimbingStairs(int[] cost) {int n cost.length;int[] dp new int[n1];dp[…

Linux常用基本命令操作

目录 一、认识shell 1、什么是shell 2、命令的本质 3、内部命令和外部命令 4、harsh缓存 5、命令执行的过程 6、如果打了一个命令,提示该命令不存在 7、命令提示符 8、Linux系统文件夹 二、Linux常用命令 1、通用Linux命令行格式 2、编辑Linux命令行的辅…

Spring Boot + MinIO 实现文件切片极速上传技术

文章目录 1. 引言2. 文件切片上传简介3. 技术选型3.1 Spring Boot3.2 MinIO 4. 搭建Spring Boot项目5. 集成MinIO5.1 配置MinIO连接信息5.2 MinIO配置类 6. 文件切片上传实现6.1 控制器层6.2 服务层6.3 文件切片上传逻辑 7. 文件合并逻辑8. 页面展示9. 性能优化与拓展9.1 性能优…

统计分析绘图软件 GraphPad Prism 10 mac功能介绍

GraphPad Prism mac是一款专业的统计和绘图软件,主要用于生物医学研究、实验设计和数据分析。 GraphPad Prism mac功能和特点 数据导入和整理:GraphPad Prism 可以导入各种数据格式,并提供直观的界面用于整理、编辑和管理数据。用户可以轻松地…

Metashape 自定义比例尺 / 无POS时如何制作DEM

前言操作步骤 前言 Metashape 自定义比例尺 和 无POS时如何制作DEM,此二者的操作步骤本质上是一样的。 当我们输入的照片没有POS,且没有做像控点的时候,比如我们仅仅拍摄了一个比较小的物体,可能是一瓶饮料或者一个椅子。 那么此…

C++刷题 -- KMP算法

C刷题 – KMP算法 文章目录 C刷题 -- KMP算法1.算法讲解2.算法实现 https://leetcode.cn/problems/find-the-index-of-the-first-occurrence-in-a-string/description/ 1.算法讲解 KMP算法是一种字符串匹配算法,当出现字符串不匹配时,可以记录一部分之…

【CLion】使用CLion开发STM32

本文主要记录使用CLion开发STM32,并调试相关功能 使用的CLion版本:2023.3.1 CLion嵌入式配置教程:STM32CubeMX项目 |CLion 文档 (jetbrains.com) OpenOCD官网下载:Download OpenOCD for Windows (gnutoolchains.com) GNU ARM工…

lv12 linux 内核移植 10

目录 1 内核概述 1.1 内核与操作系统 1.2 Linux层次结构 1.3 Linux内核特点 2 Linux内核源码结构 2.1 Linux内核源码获取 2.2 源码结构 3 Linux内核移植 3.1 在 Linux 官网下载 Linux 内核源码(这里我们下载 linux-3.14.tar.xz) 3.2 拷贝内核源…

【Spark-ML源码解析】Word2Vec

前言 在阅读源码之前,需要了解Spark机器学习Pipline的概念。 相关阅读:SparkMLlib之Pipeline介绍及其应用 这里比较核心的两个概念是:Transformer和Estimator。 Transformer包括特征转换和学习后的模型两种情况,用来将一个DataFr…

支持向量机 支持向量机概述

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

Unity | Shader基础知识(第七集:案例<让图片和外部颜色叠加显示>)

目录 一、本节介绍 1 上集回顾 2 本节介绍 二、添加图片资源 三、 常用cg数据类型 1 float 2 bool 3 sampler 四、加入图片资源 五、使用图片资源 1 在通道里加入资源 2 使用图片和颜色叠加 2.1 2D纹理采样tex2D 2.2 组合颜色 六、全部代码 七、下集介绍 相关…

26 redis 中 replication/cluster 集群中的主从复制

前言 我们这里首先来看 redis 这边实现比较复杂的 replication集群模式 我们这里主要关注的是 redis 这边的主从同步的相关实现 这边相对比较简单, 我们直接基于 cluster集群模式 进行调试 主从命令同步复制 比如这里 master 是 redis_7002, slave 是 redis_7005 然后 这…

11.HarmonyOS鸿蒙app_page的显示跳转方法

11.HarmonyOS鸿蒙app_page的显示跳转方法&#xff0c;text文本触发点击事件 使用Intent和Operation对象 创建新项目后&#xff0c;再创建secondPageAbility ability_main.xml <?xml version"1.0" encoding"utf-8"?> <DirectionalLayoutxmlns:…

LeetCode(65)LRU 缓存【链表】【中等】

目录 1.题目2.答案3.提交结果截图 链接&#xff1a; LRU 缓存 1.题目 请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类&#xff1a; LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存int get(int key) 如果关键字 k…