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
...
复制代码

 回滚

 控制台输出

 查看镜像是否上传

可以看到镜像并没有上传

 查看版本是否变更

 

 

 添加思考:回滚会重新编译一次代码,比较耗时。

 

posted @   不会跳舞的胖子  阅读(44)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示