持续集成交付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 备注
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)新建项目

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

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

# kubectl get nodes

# cat devops03-devops-ui.yaml

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

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

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

(4)完成提交

持续集成交付CICD:K8S 自动化完成前端项目应用发布与回滚_第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)
                }
            }
        }
    }
}

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

(2)成功

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

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

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

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

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

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

(2)成功

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

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

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

(1)Jenkins添加节点

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

(2)设置

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

(3)配置界面

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

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

# mkdir /tmp/jenkinsagent

# cd /tmp/jenkinsagent

#  wget http://192.168.204.15:8080/jnlpJars/agent.jar

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

选择第3种方式进行安装

持续集成交付CICD:K8S 自动化完成前端项目应用发布与回滚_第16张图片运或者运行脚本

(5)成功添加

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

(6)查看节点列表

K8S 集群关闭了Swap Space

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

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

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

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

(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变化

持续集成交付CICD:K8S 自动化完成前端项目应用发布与回滚_第21张图片持续集成交付CICD:K8S 自动化完成前端项目应用发布与回滚_第22张图片持续集成交付CICD:K8S 自动化完成前端项目应用发布与回滚_第23张图片

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

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

(2)成功

持续集成交付CICD:K8S 自动化完成前端项目应用发布与回滚_第25张图片持续集成交付CICD:K8S 自动化完成前端项目应用发布与回滚_第26张图片

(3)观察pod变化

持续集成交付CICD:K8S 自动化完成前端项目应用发布与回滚_第27张图片持续集成交付CICD:K8S 自动化完成前端项目应用发布与回滚_第28张图片

(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变化持续集成交付CICD:K8S 自动化完成前端项目应用发布与回滚_第29张图片

持续集成交付CICD:K8S 自动化完成前端项目应用发布与回滚_第30张图片持续集成交付CICD:K8S 自动化完成前端项目应用发布与回滚_第31张图片

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

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

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

(5)观察pod变化

持续集成交付CICD:K8S 自动化完成前端项目应用发布与回滚_第34张图片持续集成交付CICD:K8S 自动化完成前端项目应用发布与回滚_第35张图片

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

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

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

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

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

(7) 观察pod变化

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

持续集成交付CICD:K8S 自动化完成前端项目应用发布与回滚_第39张图片持续集成交付CICD:K8S 自动化完成前端项目应用发布与回滚_第40张图片

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

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

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

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

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

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

9. GitLab修改代码

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

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

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

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

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

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

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

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

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

(2)Jenkins添加视图

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

(3)查看CI和CD视图

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

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

(4)成功

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

(5)Blue Ocean 查看

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

(6)Harbor查看镜像

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

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

(7)Build Now 直接构建

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

(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 节点

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

(3)node2节点

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

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

(1)GitLab修改部署文件

修改前:

修改后:

(2)Build Now 直接构建

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

(3)观察pod变化

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

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

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

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

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

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

(6) 完成

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

二、问题

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

(1)报错

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

(2)原因分析

未启用WebSocket

(3) 解决方法

启用WebSocket

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

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

(1)报错

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

(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

查询

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

删除

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

再次查询

③ 新版的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 

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

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

# ssh-copy-id [email protected]

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

⑤ 运行脚本

⑥ 成功添加

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

你可能感兴趣的:(持续集成交付CICD,ci/cd,kubernetes,自动化)