持续集成交付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 替换文件

(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) 构建前端项目CD流水线

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

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

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

相关文章

fiddler的下载、安装

在官网下载fiddler 点击Download For Windows 下载完成 安装fiddler 点击.exe文件,进行傻瓜式安装,即可安装成功 配置fiddler 点击OK后,重启fiddler, 即可抓包

JS基础之模块化

JS基础之模块化 JS模块化模块化前端发展 什么是模块?怎么定义模块化IIFE匿名函数自调用IIFE模式增强模块化的好处 JS模块化 模块化 JS DOM操作 代码规范管理的标准 不同模块间的管理模块内部自组织 标准bundler (模块构建工具) ESNext TS -> ES5 前端发展 生态 …

打开VScode时不打开上次使用的文件夹

是不是很烦VScode 打开新的文件夹,每次都打开上次使用过的文件夹,只需在设置里面改一个设置就可以避免了。 Ctrl ,打开设置,搜索 window.restoreWindows 通过这种设置就可以让VScode 每次打开新的文件夹而不打开上次的文件夹。

“No.”竟然不是Number的缩写!92%的人不知道为什么!柯桥成人英语学习就来泓畅教育

今天给大家介绍一个很有意思的表达 不知道,同学们有没有发现 ↓ 英语中,数字经常和“No.”一起出现 大家有深究过“No.”是什么意思吗 有的同学会说,是不是“Number”的缩写 虽然很像,但是它俩还真不一样 接下来我们就来盘一…

Leetcode—12.整数转罗马数字【中等】

2023每日刷题&#xff08;六十四&#xff09; Leetcode—12.整数转罗马数字 实现代码 const pair<int, string> valueTable[] {{1000, "M"},{900, "CM"},{500, "D"},{400, "CD"},{100, "C"},{90, "XC"},…

web应用开发技术的一些概念

一、Servlet 1.Servlet的工作过程&#xff1a; Servelt的工作流程示意图 &#xff08;1&#xff09;客户端发起一个Http请求到服务器&#xff0c;请求特定的资源或者是要执行特定的操作 &#xff08;2&#xff09;服务器在接收到请求后&#xff0c;根据请求相应的URL将请求分发…

N叉树后序遍历

给定一个 n 叉树的根节点 root &#xff0c;返回 其节点值的 后序遍历 。 n 叉树 在输入中按层序遍历进行序列化表示&#xff0c;每组子节点由空值 null 分隔&#xff08;请参见示例&#xff09;。 示例 1&#xff1a; 输入&#xff1a;root [1,null,3,2,4,null,5,6] 输出&am…

SAP 特殊采购类80简介

前面我们已经测试特殊采购类40、70,我们今天测试一下特殊采购类80。 特殊采购类80:在替代工厂生产,在成品层维护特殊采购类,需求和收货在计划工厂完成,成品生产和组件采购在生产工厂完成。 80采购类也是我们在SAP系统中实现跨工厂需求传递的一种方式。它具有传递方式简单、…

这个食堂管理大招,再不知道就晚了!

随着社会的不断发展&#xff0c;餐饮行业也在不断创新和进步。在这个数字化时代&#xff0c;智能技术为各行各业提供了更高效、便捷的解决方案。 食堂作为人们日常生活中不可或缺的一部分&#xff0c;也迎来了智能化的时代。智慧收银系统不仅提高了食堂的运营效率&#xff0c;还…

开关电源测试 | 如何测试开关电源峰值负载功率?

开关电源峰值负载功率测试方法 测试设备&#xff1a; 1.电子负载&#xff1a;根据负载的额定电压和电流来选择。 2.功率计&#xff1a;需要考虑电源的额定电压和电流、测试频率等。 3.示波器&#xff1a;需要考虑测试频率和带宽等。 测试步骤&#xff1a; 1.将电源调整到正常工…

明理信息科技打造专属个人或企业知识付费平台,核心功能设计

在当今信息爆炸的时代&#xff0c;知识管理已经成为了每个人必须面对的问题。然而&#xff0c;市面上的知识付费平台大多数都是通用的&#xff0c;无法满足个性化需求。 因此&#xff0c;明理信息科技提供了一款专属定制的适合个人的知识付费平台。核心产品能力如下&#xff1…

vs code(Visual Studio Code)使用Remote SSH插件连接不上,反复输入密码

使用Remote SSH插件连接不上&#xff0c;反复输入密码问题解决分为两步 1&#xff0c;点击此处 可以得到配置文件的存放目录&#xff0c;进入硬盘这个目录 打开这个文件&#xff0c;知道你服务器的所在行ip&#xff0c;整行删掉&#xff0c;尝试再次连接 2&#xff0c;如果1不…

鸿蒙开发之简单登录页面

Entry Component struct Index {State loading:booleanfalse;build() {Row() {Column({ space: 5 }) {Image($r("app.media.app_icon")).width(100).height(100).borderRadius(10).margin({top: 60})Text("登录界面").fontSize(40).fontWeight(FontWeight.…

2023_Spark_实验二十九:Flume配置KafkaSink

实验目的&#xff1a;掌握Flume采集数据发送到Kafka的方法 实验方法&#xff1a;通过配置Flume的KafkaSink采集数据到Kafka中 实验步骤&#xff1a; 一、明确日志采集方式 一般Flume采集日志source有两种方式&#xff1a; 1.Exec类型的Source 可以将命令产生的输出作为源&…

基础算法(5):滑动窗口

1.何为滑动窗口&#xff1f; 滑动窗口其实也是一种算法&#xff0c;主要有两类&#xff1a;一类是固定窗口&#xff0c;一类是可变窗口。固定的窗口只需要一个变量记录&#xff0c;而可变窗口需要两个变量。 2.固定窗口 就像上面这个图一样。两个相邻的长度为4的红色窗口&…

Axure中动态面板使用及轮播图多种登录方式左侧导航栏之案列

&#x1f3ac; 艳艳耶✌️&#xff1a;个人主页 &#x1f525; 个人专栏 &#xff1a;《产品经理如何画泳道图&流程图》 ⛺️ 越努力 &#xff0c;越幸运 目录 一、轮播图简介 1、什么是轮播图 2、轮播图有什么作用 3、轮播图有什么特点 4、轮播图适应范围 5、…

智能 GPT 图书馆又重生了

智能 GPT 图书馆又重生了 作者&#xff1a;程序员小白条 1&#xff09;概述 自从大二寒假准备开始筹备这个项目&#xff0c;到现在已经一年了&#xff0c;这个项目能维护一年&#xff0c;不愧是我.jpg。本来这个项目只是想练练手&#xff0c;因为那时候刚学完 Spring Boot2 V…

Elasticsearch安装部署

Elasticsearch安装部署 1.下载elasticsearch安装包&#xff1a;Elasticsearch 2.4.6 | Elastic 下载中文分词器&#xff1a;Release v1.10.6 medcl/elasticsearch-analysis-ik GitHub 2.安装elasticsearch rpm -ivh elasticsearch-2.4.6.rpm 3.安装中文分词器插件 首先在…

20.链路聚合二层

链路聚合二层 大意&#xff1a;拉多根线&#xff0c;捆绑到一块&#xff0c;让交换机认为是一个逻辑的接口 增加带宽的同时&#xff0c;还能起到链路冗余的作用 链路聚合分为二层链路聚合与三层链路聚合 二层链路聚合 不需要配置IP地址 两台PC配置好IP后默认情况下是可以相互…

sqlserver dba日常操作

文章目录 查询慢sql的方法sqlserver备份全备差异备日志备ldf备份事务备份 注意事项SQL Server 还原全备还原差异备份还原日志备/尾日志还原事务日志还原备份还原中的问题还原失败&#xff0c;需要某些权限重命名sql Server数据库名称失败 作业迁移单个迁移批量迁移 登陆账号迁移…