持续集成交付CICD:K8S 自动化完成前端项目应用发布与回滚

目录

一、实验

1.环境

2.GitLab新建项目存放K8S部署文件

3.Jenkins手动测试前端项目CD 流水线代码(下载部署文件)

4. 将K8S master节点配置为jenkins从节点

5.K8S 手动回滚前端项目版本

6.Jenkins手动测试前端项目CD 流水线代码(发布应用)

7.Jenkins手动测试前端项目CD 流水线代码(添加选择回滚功能)

8. Jenkins创建前端项目CD流水线

9. GitLab修改代码

10. Jenkins手动构建前端项目CI流水线

11. K8S node节点连接Harbor拉取镜像

12.Jenkins通过GitLab共享库实现前端项目在K8S自动发布应用

二、问题

1. jenkins从节点配置页面显示端口被禁用

2.将K8S master节点配置为jenkins从节点报错


一、实验

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新建项目存放K8S部署文件

(1)新建项目

(2)K8S查看节点及部署文件

# kubectl get nodes# cat devops03-devops-ui.yaml

(3)将部署文件复制到GitLab项目

(4)完成提交

(5)查看项目编号为22

3.Jenkins手动测试前端项目CD 流水线代码(下载部署文件)

(1)在回放中运行测试代码

@Library("mylib@master") _
import org.devops.*def gitlabbutil = new Gitlab()pipeline {agent { label "build"}options {skipDefaultCheckout true}stages{stage("GetDeployFile"){steps{script {println("GetCode")fileData = gitlabbutil.GetRepoFile(22,"deployment.yaml", "master")println(fileData)}}}}
}

(2)成功

(3)生成流水线脚本实现写入文件

(4)回放中运行代码测试代码

@Library("mylib@master") _
import org.devops.*def gitlabbutil = new Gitlab()
pipeline {agent { label "build"}options {skipDefaultCheckout true}stages{stage("GetDeployFile"){steps{script {println("GetCode")fileData = gitlabbutil.GetRepoFile(22,"deployment.yaml", "master")println(fileData)writeFile file: 'deployment.yaml', text: fileDatash "ls -l; cat deployment.yaml"}}}}
}

(2)成功

4. 将K8S master节点配置为jenkins从节点

(1)Jenkins添加节点

(2)设置

(3)配置界面

(4)K8S master节点创建目录下载jar包

# mkdir /tmp/jenkinsagent# cd /tmp/jenkinsagent#  wget http://192.168.204.15:8080/jnlpJars/agent.jar

选择第3种方式进行安装

运或者运行脚本

(5)成功添加

(6)查看节点列表

K8S 集群关闭了Swap Space

5.K8S 手动回滚前端项目版本

(1)查看历史

# kubectl rollout history deployment/devops03-devops-ui -n devops03

(2)查看具体某一个历史版本信息

# kubectl rollout history deployment/devops03-devops-ui --revision=3 -n devops03# kubectl rollout history deployment/devops03-devops-ui --revision=4 -n devops03

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

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

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

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

(5)回滚指定版本

# kubectl rollout undo deployment/devops03-devops-ui --to-revision=3 -n devops03


(6)观察pod变化

(7)外部测试访问(回滚版本为1.1.5)

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

6.Jenkins手动测试前端项目CD 流水线代码(发布应用)

(1)回放中运行代码测试代码

@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 {println("GetCode")fileData = gitlabbutil.GetRepoFile(22,"deployment.yaml", "master")//println(fileData)sh "rm -fr deployment.yaml"writeFile file: 'deployment.yaml', text: fileData//sh "ls -l; cat deployment.yaml"sh "ls -l "}}}stage("DeployAPP"){steps{script{namespace = "${env.groupName}"appName = "${env.projectName}"sh """## 发布应用kubectl apply -f deployment.yaml -n ${namespace}"""// 获取应用状态5.times{sh "sleep 2; kubectl -n ${namespace}  get pod | grep ${appName} "}}}}}
}

(2)成功

(3)观察pod变化

(4)外部测试访问(版本升级为1.1.6)

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

7.Jenkins手动测试前端项目CD 流水线代码(添加选择回滚功能)

(1)先手动回滚为1.1.5

# kubectl rollout undo deployment/devops03-devops-ui -n devops03
deployment.apps/devops03-devops-ui rolled back

(2)观察pod变化

(3) 外部测试访问(当前版本回滚为为1.1.5)

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

(4)回放中运行代码测试代码

@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 {println("GetCode")fileData = gitlabbutil.GetRepoFile(22,"deployment.yaml", "master")//println(fileData)sh "rm -fr deployment.yaml"writeFile file: 'deployment.yaml', text: fileData//sh "ls -l; cat deployment.yaml"sh "ls -l "}}}stage("DeployAPP"){steps{script{env.namespace = "${env.groupName}"env.appName = "${env.projectName}"sh """## 发布应用kubectl apply -f deployment.yaml -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}}}}}
}

(5)观察pod变化

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

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

(6)Blue Ocean弹出选项,选择yes

(7) 观察pod变化

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

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

8. Jenkins创建前端项目CD流水线

(1)Jenins新建前端项目CD流水线

(2)去除其他参数,修改脚本路径

9. GitLab修改代码

(1)GitLab共享库新建K8S CD流水线

(2)将之前测试成功的代码复制过来

(3)GitLab前端项目新建分支RELEASE-1.1.7

10. Jenkins手动构建前端项目CI流水线

(1)Jenkins手动构建,分支输入RELEASE-1.1.7

(2)Jenkins添加视图

(3)查看CI和CD视图

(4)成功

(5)Blue Ocean 查看

(6)Harbor查看镜像

192.168.204.15/devops03/devops03-devops-ui:RELEASE-1.1.7

(7)Build Now 直接构建

(8)观察pod变化

(9) 外部测试访问(版本升级为1.1.6)

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

11. K8S node节点连接Harbor拉取镜像

(1)拉取镜像

# docker login -u admin -p Harbor12345 192.168.204.15# docker pull 192.168.204.15/devops03/devops03-devops-ui:RELEASE-1.1.7# docker logout 192.168.204.15

(2)node1 节点

(3)node2节点

12.Jenkins通过GitLab共享库实现前端项目在K8S自动发布应用

(1)GitLab修改部署文件

修改前:

修改后:

(2)Build Now 直接构建

(3)观察pod变化

(4)  外部测试访问(当前版本为1.1.7)

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

(5)Blue Ocean弹出界面,选择no (不进行回滚)

(6) 完成

二、问题

1. jenkins从节点配置页面显示端口被禁用

(1)报错

(2)原因分析

未启用WebSocket

(3) 解决方法

启用WebSocket

2.将K8S master节点配置为jenkins从节点报错

(1)报错

(2)原因分析

根据报错信息可以得知,报错的原因是由于编译这份java代码的版本和当前用于运行的java版本并不一致。并且编译的版本仅支持52.0或以上的运行版本。从而可以得知,当前用于运行的java版本低于52.0。而首先需要了解,什么是编译的版本,什么是运行的版本。需要区分开jre和jdk。在安装java环境的时候,一个版本会分别对应两个文件夹,分别是jre和jdk。而jre表示的是java runtime environment ,即java的运行环境,而jdk表示的是Java SE Development kit(JDK),即java的编译环境。java -version查看的是jre的版本(运行环境)。
javac -version查看的是jdk的版本(编译环境)。

(3)解决方法

在查看版本后发现不一致,那么就去重新配置一下环境,保证版本一致后重新编译运行即可。需要说明的是,我这里这份代码并不是我编写的,并且也只拿到了编译完成后的class文件,因此只能通过解决更换运行的java版本解决这个问题。而从报错信息中可以知道,这份代码在编译后,仅支持用52.0及以上的java版本的jre环境运行,即使不知道52.0的版本对应的是哪个java版本,但肯定是需要高于1.8.0的。并且为了避免以后产生问题,我计划直接更新整个java的版本,即将jdk和jre换成一个新的版本,也考虑到以后可能还需要用到1.8.0的版本,因此并不会把1.8.0的版本删除。

① 查询java版本

# java -version

②本机自带jdk 先卸载jdk 

# rpm -qa|grep java # rpm -e --nodeps xxxxx

查询

删除

再次查询

③ 新版的Jenkins需要安装JDK11的JAVA环境,所以我们首先要配置JDK

Java Archive Downloads - Java SE 11 | Oracle 中国

#下载完之后拖到opt目录下
cd /opt#安装JDK11
rpm -ivh jdk-11.0.15.1_linux-x64_bin.rpm#配置环境变量
vim /etc/profile
export JAVA_HOME=/usr/java/jdk-11.0.15.1
export PATH=$PATH:$JAVA_HOME/bin:$MAVEN_HOME/bin#刷新配置
source /etc/profile#查看java版本
java -version 

④ ssh-copy-id 被控端IP 需要输入对应主节的root密码

# ssh-copy-id root@192.168.204.180

⑤ 运行脚本

⑥ 成功添加

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

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

相关文章

C++学习笔记(十六)

一、多态 1. 多态的基本概念 多态是C面向对象三大特性之一 多态分为两类 1. 静态多态:函数重载 和 运算符重载属于静态多态,复用函数名 2. 动态多态:派生类和虚函数实现运行时多态 静态多态和动态多态区别: 1. 静态多态的函…

useConsole的封装,vue,react,htmlscript标签,通用

之前用了接近hack的方式实现了console的封装,目标是获取console.log函数的执行(调用栈所在位置)所在的代码行数。 例如以下代码,执行window.mylog(1)时候,console.log实际是在匿名的箭头函数()>{//这里执行的} con…

【IDEA】Intellij IDEA相关配置

IDEA 全称 IntelliJ IDEA,是java编程语言的集成开发环境。IntelliJ在业界被公认为最好的Java开发工具,尤其在智能代码助手、代码自动提示、重构、JavaEE支持、各类版本工具(git、svn等)、JUnit、CVS整合、代码分析、 创新的GUI设计等方面的功能可以说是超…

SpringCloud源码探析(十二)-基于SpringBoot开发自定义中间件

1.概述 中间件是一种介于操作系统和应用软件之间,为应用软件提供服务功能的软件,按功能划分有消息中间件(Kafka、RocketMQ)、通信中间件(RPC通信中间件,dubbo等),应用服务器等。中间…

Java实现一个在windows环境下的文件搜索引擎

以下是一个简单的Java实现的Windows文件搜索引擎的示例代码: import java.io.File; import java.util.ArrayList; import java.util.List;public class FileSearchEngine {public static void main(String[] args) {String searchDirectory "C:/"; // …

tensorflow入门 自定义模型

前面说了自定义的层,接下来自定义模型,我们以下图为例子 这个模型没啥意义,单纯是为了写代码实现这个模型 首先呢,我们看有几个部分,dense不需要我们实现了,我们就实现Res,为了实现那个*3,我们…

WPF——样式和控件模板、数据绑定与校验转换

样式和控件模板 合并资源字典 Style简单样式的定义和使用 ControlTemplate控件模板的定义和使用 定义 使用 Trigger触发器 数据绑定与校验转换 数据绑定的设置 代码层实现绑定

TransXNet实战:使用 TransXNet实现图像分类任务(二)

文章目录 训练部分导入项目使用的库设置随机因子设置全局参数图像预处理与增强读取数据设置Loss设置模型设置优化器和学习率调整策略设置混合精度,DP多卡,EMA定义训练和验证函数训练函数验证函数调用训练和验证方法 运行以及结果查看测试完整的代码 在上…

监控k8s controller和scheduler,创建serviceMonitor以及Rules

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

HTML CSS 进度条

1 原生HTML标签 <meter>&#xff1a;显示已知范围的标量值或者分数值<progress>&#xff1a;显示一项任务的完成进度&#xff0c;通常情况下&#xff0c;该元素都显示为一个进度条 1.1 <meter> <html><head><style>meter{width:200px;}…

微软官宣放出一个「小模型」,仅2.7B参数,击败Llama2和Gemini Nano 2

就在前一阵谷歌深夜炸弹直接对标 GPT-4 放出 Gemini 之后&#xff0c;微软这两天也紧锣密鼓进行了一系列动作。尽管时间日趋圣诞假期&#xff0c;但是两家巨头硬碰硬的军备竞赛丝毫没有停止的意思。 就在昨日&#xff0c;微软官宣放出一个“小模型” Phi-2&#xff0c;这个 Ph…

学习k8s

学习k8s 我为什么要用k8s 和其他部署方式的区别是什么? 传统部署方式 java --> package --> 放到服务器上 --> Tomcat 如果是同时进行写操作,会存在并发问题. 用户 --网络带宽–> 服务器 -->服务 同一个服务器上,多个服务: 网络资源的占用 内存的占用 cpu的占…

三、W5100S/W5500+RP2040之MicroPython开发<DNS示例>

文章目录 1. 前言2. 相关网络信息2.1 简介2.2 DNS工作过程2.3 优点2.4 应用 3. WIZnet以太网芯片4. DNS解析示例讲解以及使用4.1 程序流程图4.2 测试准备4.3 连接方式4.4 相关代码4.5 烧录验证 5. 注意事项6. 相关链接 1. 前言 在这个智能硬件和物联网时代&#xff0c;MicroPyt…

【一】FPGA实现SPI协议之SPI协议介绍

【一】FPGA实现SPI协议之SPI协议介绍 一、spi协议解析 spi协议有4根线&#xff0c;主机输出从机输入MOSI、主机输入从机输出MISO、时钟信号SCLK、片选信号SS\CS 。 一般用于主机和从机之间通信。由主机发起读请求和写请求&#xff0c;主机的权限是主动的&#xff0c;从机是被…

C/C++编程中的算法实现技巧与案例分析

C/C编程语言因其高效、灵活和底层的特性&#xff0c;被广大开发者用于实现各种复杂算法。本文将通过10个具体的算法案例&#xff0c;详细探讨C/C在算法实现中的技巧和应用。 一、冒泡排序&#xff08;Bubble Sort&#xff09; 冒泡排序&#xff08;Bubble Sort&#xff09;是一…

【Hadoop精讲】HDFS详解

目录 理论知识点 角色功能 元数据持久化 安全模式 SecondaryNameNode(SNN) 副本放置策略 HDFS写流程 HDFS读流程 HA高可用 CPA原则 Paxos算法 HA解决方案 HDFS-Fedration解决方案&#xff08;联邦机制&#xff09; 理论知识点 角色功能 元数据持久化 另一台机器就…

腾讯云微服务11月产品月报 | TSE 云原生 API 网关支持 WAF 对象接入

2023年 11月动态 TSE 云原生 API 网关 1、支持使用私有 DNS 解析 服务来源支持私有 DNS 解析器&#xff0c;用户可以添加自己的 DNS 解析器地址进行私有域名解析&#xff0c;适用于服务配置了私有域名的用户。 2、支持 WAF 对象接入 云原生 API 网关对接 Web 安全防火墙&…

一种基于外观-运动语义表示一致性的视频异常检测框架 论文阅读

A VIDEO ANOMALY DETECTION FRAMEWORK BASED ON APPEARANCE-MOTION SEMANTICS REPRESENTATION CONSISTENCY 论文阅读 ABSTRACT1. INTRODUCTION2. PROPOSED METHOD3. EXPERIMENTAL RESULTS4. CONCLUSION阅读总结&#xff1a; 论文标题&#xff1a;A VIDEO ANOMALY DETECTION FRA…

锐捷配置完全stub区域

一、实验拓扑 二、实验目的 在运行OSPF协议的网络中&#xff0c;配置STU区域可以减少路由器的路由条目&#xff0c;减小路由器的压力&#xff0c;有效提高路由器的性能。 三、实验配置 第一步&#xff1a;全局配置OSPF R1 ruijie>enable R1#conf terminal R1(config)#hos…

Postman使用总结--生成测试报告

1.执行生成的命令格式 newman run 用例集文件 .json -e 环境文件 .json -d 数据文件 .json/.csv -r htmlextra --reporter- htmlextra-export 测试报告名 .html -e 和 -d 是 非必须的。 如果没有使用 环境&#xff0c;不需要指定 -e 如果没有使用 数据…