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

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

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

⑤ 运行脚本

⑥ 成功添加

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

空间转录组 多样本整合分析—stlearn

大家好,今天介绍一款空间转录组整合分析的python软件——stlearn。 如果你还不会安装,可以看下之前的推文,windows系统本地安装stlearn:本地安装jupyterlab,并创建conda小环境——以空间转录组细胞互作之stlearn安装为…

设计模式——0前言目录

1 设计模式介绍 应当站在产品经理的角度来学习设计模式 是软件设计中常见问题的典型解决方案,可用于解决代码中反复出现的设计问题 学习效果一般的原因在于自己没有站在产品经理的角度学习,仅仅是为了学习怎么实现,用什么算法实现。 分类&…

telnet的交互原理(wireshark分析)

telnet的交互原理(wireshark篇) telnet的协议类型是tcp,他的密钥用的是明文的,容易被捕获,所以后来的windows基本弃用了telnet服务端但依然保留了客户端。 下面是他的交互抓包: 这里面的前三条运用的是tc…

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

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

【工作流Activiti】MyActivit的maven项目

1、Idea新建一个项目MyActivit的maven项目 2、安装插件 在 idea 里面&#xff0c;activiti 的插件叫 actiBPM&#xff0c;在插件库里面把它安装好&#xff0c;重启 idea 就行了。 3、 maven 项目中&#xff0c;并更改 pom.xml。pom 中依赖如下&#xff1a; <?xml version…

IntelliJ IDE 插件开发 | (三)消息通知与事件监听

系列文章 IntelliJ IDE 插件开发 |&#xff08;一&#xff09;快速入门IntelliJ IDE 插件开发 |&#xff08;二&#xff09;UI 界面与数据持久化IntelliJ IDE 插件开发 |&#xff08;三&#xff09;消息通知与事件监听 前言 在前两篇文章中讲解了关于插件开发的基础知识&…

【数据结构】二叉树的模拟实现

前言:前面我们学习了堆的模拟实现&#xff0c;今天我们来进一步学习二叉树&#xff0c;当然了内容肯定是越来越难的&#xff0c;各位我们一起努力&#xff01; &#x1f496; 博主CSDN主页:卫卫卫的个人主页 &#x1f49e; &#x1f449; 专栏分类:数据结构 &#x1f448; &…

14 v-model绑定输入框

概述 v-model用于实现双向数据绑定&#xff0c;使用v-model绑定输入框是Vue3中最常见的用法之一。 比如&#xff0c;在制作登录界面的时候&#xff0c;我们会使用v-model绑定用户名和密码&#xff0c;这里的用户名和密码都是输入框。 基本用法 我们创建src/components/Demo…

nodejs+vue+微信小程序+python+PHP影片数据爬取与数据分析-计算机毕业设计推荐

管理页面&#xff1a;管理员和用户都可以登录。通过输入账号和密码后&#xff0c;校验无误后方可进入对应的主界面&#xff0c;管理员可对用户使用的权限管理&#xff0c;以及对网站信息进行管理[9]。  影片数据爬取与数据分析分为两个部分&#xff0c;即管理员和用户。该系统…

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

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

[Toolschain cpp ros cmakelist python vscode] 记录写每次项目重复的设置和配置 不断更新

写在前面 用以前的设置&#xff0c;快速配置项目&#xff0c;以防长久不用忘记&#xff0c;部分资料在资源文件里还没有整理 outline cmakelist 复用vscode 找到头文件vscode debug现有代码直接关联远端gitros杂记repo 杂记glog杂记 cmakelist 复用 包含了根据系统路径找库…

各种不同语言分别整理的拿来开箱即用的8个开源免费单点登录(SSO)系统

各种不同语言分别整理的拿来开箱即用的8个开源免费单点登录&#xff08;SSO&#xff09;系统。 单点登录&#xff08;SSO&#xff09;是一个登录服务层&#xff0c;通过一次登录访问多个应用。使用SSO服务可以提高多系统使用的用户体验和安全性&#xff0c;用户不必记忆多个密…

学习Java第74天,Ajax简介

什么是ajax AJAX Asynchronous JavaScript and XML&#xff08;异步的 JavaScript 和 XML&#xff09;。 AJAX 不是新的编程语言&#xff0c;而是一种使用现有标准的新方法。 AJAX 最大的优点是在不重新加载整个页面的情况下&#xff0c;可以与服务器交换数据并更新部分网页…

限流原理与实践:固定窗口、滑动窗口、漏桶与令牌桶解析

方案一、固定窗口限流算法 这里我们通过一个 demo 来介绍固定窗口限流算法。 创建一个 FixWindowRateLimiterService 类。 Service public class FixWindowRateLimiterService {Resourceprivate StringRedisTemplate stringRedisTemplate;private static final DefaultRedisSc…

HCIP —— BGP 基础实验

实验拓扑&#xff1a; 实验要求&#xff1a; 1.所有设备上均有环回接口 2.R1属于AS 100 &#xff0c;R2-R4 属于AS 200 &#xff0c;R5 属于AS 300 3.R2 - R4 属于同一个area &#xff0c;运行OSPF。 4.全网通过运行BGP实现网络互通。 实验步骤&#xff1a; 1.配置 IP地址…

Node.js使用Express框架写服务端接口时,如何将接口拆分到不同文件中

项目目录结构说明&#xff1a; node.js连接mysql数据库步骤可参考&#xff1a;Node.js 连接 MySQL | 菜鸟教程 1、拆分之前的写法&#xff0c;未区分模块&#xff0c;所有接口api都写在了入口文件app.js中&#xff1b; 需求&#xff1a;想要将接口api拆分成根据不同的业务模块…

window10下载与安装zookeeper,图文说明

1&#xff0c;下载 打开连接 &#xff1b;https://downloads.apache.org/zookeeper/ 选择版本下载 2&#xff0c;解压 cmd黑窗口解压命令 tar -zxvf apache-zookeeper-3.8.3-bin3&#xff0c;修改配置 复制zoo_sample.cfg&#xff0c;重命名为zoo.cfg zoo.cfg配置 # The …

操作系统系列:Unix进程系统调用fork,wait,exec

操作系统系列&#xff1a;Unix进程系统调用 fork系统调用fork()运用的小练习 wait系统调用Zombiesexec 系列系统调用 开发者可以查看创建新进程的系统调用&#xff0c;这个模块会讨论与进程相关的Unix系统调用&#xff0c;下一个模块会讨论Win32 APIs相关的进程。 fork系统调用…

uniapp-安卓APP开发时使用手机调试

调试 1. 手机打开开发者模式: 华为手机举列-->设置-->关于手机-->版本号&#xff0c;多次连续点击“版本号”&#xff0c;就会提示已打开开发者模式 2. 华为手机举列-->设置-->系统和更新-->开发人员选项-->打开 USB调试&#xff0c;进入调试模式 3. 先…

硬件基础--实施运维工程师介绍

1.实施运维工程师介绍 1.1 什么是实施工程师 1.2 是实施工程师的职责 1.3 什么是运维工程师&#xff1f; 1.4 运维工程师的职责 1.5 实施运维的主要技能 2.计算机组件 3.BIOS介绍 ​编辑 4.总结 1.实施运维工程师介绍 1.1 什么是实施工程师 常用操作系统、应用软件及公…