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

2023-12-19

目录

一、实验

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 备注
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新建项目存放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

⑤ 运行脚本

⑥ 成功添加

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • 开源不挣钱?这个项目上线半年月入超 30w

    很兴奋的告诉大家 Sealos 自从 6 月份上线以来 仅半年时间注册用户已经突破 7万 月收入超过 30w 本文来向大家介绍我们是怎么做开源商业化的 每月平均增速超过 40 而且这些收入大部分来自用户充值 或者是通过开源社区主动找到我们付
  • Windows7系统OptionalFeatures.exe文件丢失问题

    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题 如果是新手第一时间会认为是软件或游戏出错了 其实并不是这样 其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库 这时你可以下载这个Optiona
  • Windows7系统odbcconf.exe文件丢失问题

    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题 如果是新手第一时间会认为是软件或游戏出错了 其实并不是这样 其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库 这时你可以下载这个odbccon
  • 中企出海企业如何运用境外所得税收抵免消除双重征税影响?

    改革开放以来 中国企业不断创新出海模式 依托于人口红利的产品出口模式 中国成为了效率领先的全球制造工 厂 据工业和信息化部数据统计显示 2022年 我国制造业增加值占全球比重27 7 居世界首位 然而 当前国际政治与经济环境变幻莫测 全球贸
  • 深度解析Python爬虫中的隧道HTTP技术

    前言 网络爬虫在数据采集和信息搜索中扮演着重要的角色 然而 随着网站反爬虫的不断升级 爬虫机制程序面临着越来越多的挑战 隧道HTTP技术作为应对反爬虫机制的重要性手段 为爬虫程序提供了更为灵活和隐蔽的数据采集方式 本文将探讨Python爬虫
  • AI 时代,数智底座赋能企业智能运营

    作者 郑思宇 从云原生到生成式 AI 企业数智化跟随技术发展而不断升级的脚步从未停歇 但无论企业引入何种前沿技术 其能否取得丰硕的数智化应用成果 关键都在于这些技术创新能否真正理解企业业务 与业务融合的程度如何 因此 基于新技术的数智化创新
  • Windows7系统ntprint.exe文件丢失问题

    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题 如果是新手第一时间会认为是软件或游戏出错了 其实并不是这样 其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库 这时你可以下载这个ntprint
  • 这5个“计算机专业”就业很吃香,毕业生需求量大,还不会过时

    其实男生 尤其是理科生在选择专业的时候 如果实在是不知道该选择什么样的专业 可以推荐报考计算机类专业 因为大部分的男生其实对计算机类专业都不会怎么排斥 即便是有些课程不喜欢 但一些比较重要的专业课多数也不会真的讨厌 尽管计算机类专业对数学和
  • Axure之中继器的使用(交互&动作&reperter属性&Item属性)

    目录 一 中继器的基本使用 二 中继器的动作 增删改查 2 1 新增 2 2 删除 2 3 更新行 2 4 效果展示 2 5 模糊查询 三 reperter属性 在Axure中 中继器 Repeater 是一种功能强大的组件 用于 创建重复
  • 70个python练手项目 下载,python入门练手小程序

    大家好 小编来为大家解答以下问题 70个python练手项目百度网盘 70个python练手项目 下载 今天让我们一起来看看吧 今天博主给大家带来了一份大礼 Python爬虫70例 以及完整的项目源码 本文下面所有的爬虫项目都有详细的配套教
  • 公抓抓:批量获取企业工商信息的办法

    网站产生数据的作用 企业公示系统的数据 目前网络上每天都有海量数据诞生 这些数据蕴含着巨大的价值 很多时候企业和政府都需要大量的企业数据用于自身的运营 分析等 这些时候往往需要全面的数据才能得出更加客观的结论 比如金融机构在进行业务合作时
  • python——异常机制及常见异常汇总

    异常机制本质 异常指程序运行过程中出现的非正常现象 例如用户输入错误 除数为零 需 要处理的文件不存在 数组下标越界等 所谓异常处理 就是指程序在出现问题时依然可以正确的执行剩余的程序 而 不会因为异常而终止程序执行 python 中 引进
  • 用举例来学习Python中的并行性、并发性和异步性

    Parallelism Concurrency and AsyncIO in Python by example 用举例来学习Python中的并行性 并发性和异步性 一篇中文译文 来自 Parallelism Concurrency and
  • 关于tortoiseGit找不到应用更改、解决冲突的办法

    其实是win11搞的鬼 win11系统默认的右键弹出选项太少了 用shift 右键或者右键后选择显示更多选项 然后再选择tortoiseGit就都出来了
  • 什么是Linux内核?

    Linux 内核 是一个免费 开源 整体 模块化 类 Unix 操作系统内核 它是Linux操作系统 OS 的主要组件 是计算机硬件与其进程之间的核心接口 内核是操作系统 OS 核心的计算机程序 它是操作系统中首先加载并保留在主内存中的部分
  • 案例分享|企业为什么要选择数字化转型?

    数字化在现代社会中扮演着重要的角色 成为企业转型的必由之路 随着科技的发展和信息化的进程 越来越多的企业开始拥抱数字化转型 以应对市场的变化和竞争的压力 数字化带来了诸多好处 不仅提高了企业的效率和生产力 还拓展了企业的经营领域和市场空间
  • kali更新命令!获取最新版本Kali Linux

    Kali Linux 是一个基于 Debian 的 Linux 发行版 包含各种独特且简化的实用程序 可提高渗透测试的准确性 速度和易用性 从表面上看 Kali 似乎与任何其他操作系统完全相同 它播放音频和文本文件 运行 Windows 和
  • 怎么用python画一个皮卡丘,用python画皮卡丘的代码

    大家好 小编来为大家解答以下问题 怎么用python画一个皮卡丘 用python画皮卡丘的代码 今天让我们一起来看看吧 给大家看看我的皮卡丘 电脑屏幕比较小 所以看不见假皮卡丘真实的身体 话不说上代码 import turtle as t
  • 课题立项查询怎么查 快码论文

    大家好 今天来聊聊课题立项查询怎么查 希望能给大家提供一点参考 以下是针对论文重复率高的情况 提供一些修改建议和技巧 可以借助此类工具 课题立项查询怎么查 在学术研究和项目申请中 了解课题立项信息对于研究者来说非常重要 快码写作 那么 课题
  • 持续集成交付CICD:K8S 自动化完成前端项目应用发布与回滚

    目录 一 实验 1 环境 2 GitLab新建项目存放K8S部署文件 3 Jenkins手动测试前端项目CD 流水线代码 下载部署文件 4 将K8S master节点配置为jenkins从节点 5 K8S 手动回滚前端项目版本 6 Jenk