K8S-基于jenkins与gitlab实现容器代码升级及回滚-24年版本
设计思路:
1. 创建mvn流水线;
2. 开发上传代码到gitlab,其中代码中包含Dockerfile文件;
3. 由jenkins编译打包,将jar包和Dockerfile一起发送到远程服务器;
4. jenkins 配置参数化构建,将参数传递给远程调用脚本,实现发布回滚功能;
5. 调用ssh远程服务器执行发布脚本,脚本包含build制作镜像、发布脚本、发布脚本调用build脚本,发布脚本定义当前时间变量作为镜像标签;
6. 制作完成镜像上传到harbor,同时使用sed更换yml文件的镜像标签。
7. 执行发布命令,选项参数控制发布还是回滚,在远程调用发布脚本的时候传参。
配置流程
编写dockerfile
在源码目录下创建Dockerfile
[root@node-2 rocketmq]# ll 总用量 56 -rw-r--r-- 1 root root 212 5月 28 13:26 Dockerfile drwxr-xr-x 3 root root 19 9月 23 2021 docs -rw-r--r-- 1 root root 28253 9月 23 2021 LICENSE -rw-r--r-- 1 root root 169 9月 23 2021 NOTICE -rw-r--r-- 1 root root 15139 9月 23 2021 pom.xml -rw-r--r-- 1 root root 2883 9月 23 2021 README.md drwxr-xr-x 4 root root 30 9月 23 2021 src drwxr-xr-x 3 root root 74 9月 23 2021 style
dockerfile 内容
FROM 124.222.68.142:7086/jenkinsjdk/jenkins:2.414.3-jdk17 USER root RUN mkdir /apps/rocketmq/logs -p && chmod -R 766 /apps/ WORKDIR /apps/rocketmq COPY rocketmq-dashboard-1.0.0.jar . ENV TZ=Asia/Shanghai JAVA_OPTS="-Xms128m -Xmx512m" CMD java ${JAVA_OPTS} -jar rocketmq-dashboard-1.0.0.jar > logs/rocketmq.log 2>&1 EXPOSE 8080
代码提交
如果分支不存在,你需要先创建它: git checkout -b main git push -uf origin main git push -uf origin master 手动修改remote地址 vim .git/config [core] repositoryformatversion = 0 filemode = true bare = false logallrefupdates = true [remote "origin"] url = git@124.222.40.43:root/rocketmq.git fetch = +refs/heads/*:refs/remotes/origin/* [branch "main"] remote = origin merge = refs/heads/main [branch "master"] remote = origin merge = refs/heads/master
配置jenkins
丢弃旧的构建
选项参数
配置git源码地址
构建前先把打入镜像内的jar包备份下
指定pom文件位置
文件远程发送
dokerfile文件发送,并调用发布脚本,传参控制
配置构建镜像和上传镜像脚本
root@VM-4-8-ubuntu:/data/update/rocketmqconsole# cat build-command.sh #!/bin/bash TAG=$1 docker build -t 124.222.68.142:7086/rocketmq/rocketmq-console:${TAG} . echo "镜像制作完成,即将上传至Harbor服务器" sleep 1 docker push 124.222.68.142:7086/rocketmq/rocketmq-console:${TAG} echo "镜像上传完成"
配置一键发布脚本
root@VM-4-8-ubuntu:/data/update/rocketmqconsole# cat deploy.sh #!/bin/bash # 记录脚本开始时间,后期可以统计构建时长 starttime=`date +'%Y-%m-%d-%H-%M-%S'` # 时间变量,作为镜像标签使用,时分秒必须用 "-" 分隔,":" docker不识别 DATE=`date +%Y-%m-%d-%H-%M-%S` # 在控制端执行脚本制作并上传镜像 function makeimage(){ echo "开始制作Dockerfile镜像并上传到harbor服务器" && sleep 1 cd /data/update/rocketmqconsole && bash build-command.sh "${DATE}" echo "镜像制作完成并已上传到harbor服务器" } # 更新yml文件,保证yml文件中镜像版本号和image的版本一致 function update_k8s_yml(){ echo "即将更新k8s yml文件镜像版本" && sleep 1 sed -i "s/image\: 124\.222.68\.142\:7086\/rocketmq\/rocketmq-console:.*/image\: 124\.222.68\.142\:7086\/rocketmq\/rocketmq-console:${DATE}/" /data/rockermq/rocketmq-app.yaml grep image /data/rockermq/rocketmq-app.yaml echo "k8s yml 文件镜像更新完成,即将开始更新容器中镜像版本" } # 更新镜像版本,1. 使用set image 2. apply function update_k8s_container(){ # 第一种 #ssh root@${K8S_CONTROLLRE1} "kubectl set image deployment/web-test-tomcat-deployment web-test-tomcat-spec=xxx:{DATE} -n web-test" # 第二种 #"cd /data/rockermq/ && kubectl apply -f tomcat-app1.yaml" cd /data/rockermq/ && grep image rocketmq-app.yaml >deploy.txt } # 回滚 function rollback_laster_version(){ echo "即将回滚到上一个版本" "kubectl rollout undo deployment/web-test-tomcat-deployment -n web-test" sleep 1 echo "已经回滚到上一个版本" } # 使用帮助 usage(){ echo "部署使用方法为 ${SHELL_DIR}${SHELL_NAME}" echo "回滚到上一个版本的使用方法为${SHELL_DIR}${SHELL_NAME} rollback_last_version" } main () { case $1 in deploy) makeimage update_k8s_yml update_k8s_container ;; esac } main $1
因为要上传镜像,所以把超时时间改长一点
选择构建,发布
查看输出
查看docker进程
存在一个push的进程,标签为当前时间
查看上传的镜像,已经使用了时间戳作为了标签
查看yml文件镜像标签是否变更
... spec: containers: - name: magedu-nginx-container image: 124.222.68.142:7086/rocketmq/rocketmq-console:2024-05-28-21-45-51 imagePullPolicy: IfNotPresent ports: - containerPort: 80 protocol: TCP name: http - containerPort: 443 protocol: TCP name: https env: - name: "password" value: "123456" - name: "age" value: "20" resources: limits: cpu: 1 memory: 512Mi ...
回滚
控制台输出
查看镜像是否上传
可以看到镜像并没有上传
查看版本是否变更
添加思考:回滚会重新编译一次代码,比较耗时。
越学越感到自己的无知
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现