持续集成交付CICD:K8S 自动化完成前端项目应用发布与回滚
目录
3.Jenkins手动测试前端项目CD 流水线代码(下载部署文件)
6.Jenkins手动测试前端项目CD 流水线代码(发布应用)
7.Jenkins手动测试前端项目CD 流水线代码(添加选择回滚功能)
12.Jenkins通过GitLab共享库实现前端项目在K8S自动发布应用
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
⑤ 运行脚本
⑥?成功添加
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!