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

⑤ 运行脚本

⑥ 成功添加

  • 19
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: CICD是指持续集成持续交付,它通过自动化的方式完成软件开发的不同环节,其中包括自动化完成代码编译、测试、构建、打包等步骤,并最终通过自动化交付流程将软件部署到生产环境。因此,CICD自动完成、自动交付脚本就是完成这些自动化流程所使用的脚本工具,通过这些脚本工具可以实现软件开发过程的高度自动化和流程化,提高软件开发的效率和质量。 ### 回答2: CI/CD是指持续集成/持续交付(Continuous Integration/Continuous Delivery)的缩写。它是一种软件开发实践方法,通过自动化的方式,将代码修改和集成的过程与代码交付部署的过程紧密结合起来。 CICD自动完成自动交付脚本是指通过编写脚本来实现CICD自动化过程。这个脚本可以自动完成代码修改、集成、构建、测试、部署等一系列的任务,从而实现持续集成持续交付。 首先,脚本可以监听源代码管理系统,如Git,当有代码提交时触发自动化流程。然后,它会自动拉取最新的代码,并进行代码构建。构建的过程中,脚本可以自动进行代码检查、编译、打包等操作,确保代码的质量和可用性。 接下来,脚本可以自动进行单元测试、集成测试、回归测试等各种测试,以确保代码的稳定性和功能的正确性。如果测试通过,脚本可以将构建好的代码部署到目标环境中。部署的过程中,脚本可以自动完成数据库迁移、配置文件更新等一系列操作,确保代码能够正确运行。 最后,脚本可以自动通知相关人员,如开发者、测试人员或运维人员,关于代码构建和部署的状态和结果。这样,团队成员可以及时了解代码变更的情况,做出相应的反馈或调整。 CICD自动完成自动交付脚本的好处是提高了软件交付的效率和质量。它减少了人工操作和手动测试的错误和风险,提高了工作效率和代码可靠性。通过自动完成自动化的方式,CICD脚本可以让团队更加专注于软件开发和功能实现,减少了繁琐的重复性工作,提高了团队的整体效能。 ### 回答3: CICD持续集成持续交付)是一种软件开发流程的方法论,旨在通过自动化的构建、测试和部署流程来实现快速、高质量的软件交付CICD自动完成和自动交付脚本是支持这种流程的关键工具。 CICD自动完成脚本用于实现自动化的构建、测试和部署过程。通过编写这些脚本,我们可以自动化构建工具的安装和配置、项目的编译和打包、自动化测试的运行以及构建产物的存储和备份等步骤。这些脚本可以根据开发环境的不同自动选择适当的工具和设置,并能够处理各种可能出现的错误和异常情况。这样一来,开发人员就可以将更多的时间和精力投入到核心代码的开发上,而不必手动执行繁琐的构建和测试任务。 CICD自动交付脚本用于实现软件的自动部署交付。通过编写这些脚本,我们可以自动化部署工具的安装和配置、服务器的环境搭建、应用程序的部署和启动、数据库和其他依赖项的配置等步骤。这些脚本可以根据不同的环境(如开发、测试、生产)自动选择正确的配置和参数,并且能够处理各种可能出现的错误和异常情况。这样一来,我们可以通过简单的命令或触发器,自动将最新的可部署版本交付到目标环境,大大提高了软件交付的效率和可靠性。 总之,CICD自动完成和自动交付脚本是支撑CICD流程的关键工具,通过自动化构建、测试和部署等环节,极大地提高了软件交付的效率和质量。这些脚本解放了开发人员的双手,让他们更专注于核心的开发工作,同时也减少了人为因素对软件交付的影响,提高了团队的整体效率和合作效果。一个完善的CICD流程需要结合合适的工具和配置,以及团队成员的积极配合和持续改进,才能够实现高效、高质量的软件交付

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值