基于Jenkins构建微服务项目发布失败回滚

news/2025/2/11 16:51:48/文章来源:https://www.cnblogs.com/LiuChang-blog/p/18580766

基于 Jenkins 构建微服务项目发布失败回滚

1 微服务项目发布失败回滚

image-20241130214229308

1.1 安装插件 Active Choices(动态生成选项)
1.2 编写获取 harbor 仓库镜像列表的脚本
[root@k8s-master1 ms_jenkins]# cat get_tags.sh
#!/bin/bash

# Harbor的用户名
USER="admin"
# Harbor的密码
PASS="Harbor12345"
# Harbor的地址
HURL="http://172.16.1.61"
# Harbor的项目名
PROJECT_NAME=$1
# 选择镜像的名
SERVICE_NAME=$2
SERVICE_NAME="${SERVICE_NAME%-*}"

ttoken=$(curl -iksL -X GET -u $USER:$PASS $HURL/service/token?account=${USER}\&service=harbor-registry\&scope=repository:${PROJECT_NAME}/${SERVICE_NAME}:pull |grep "token" |awk -F '"' '{print $4}')

tlist=$(curl -ksL -X GET -H "Content-Type: application/json" -H "Authorization: Bearer $ttoken" ${HURL}/v2/${PROJECT_NAME}/${SERVICE_NAME}/tags/list |awk -F '[' '{print $2}' |awk -F ']' '{print $1}' |sed 's/"//g')

echo $tlist |sed 's/,/\n/g' |sort -nr |head -n 5
# 输出结果
# 5
# 4
# 3
# 2
# 1
1.3 将 get_tags.sh 脚本拷贝到 jenkins 家目录下
[root@k8s-master1 ms_jenkins]# kubectl get pod -n default | grep jenkins
jenkins-687d65dff5-7rh9v                  1/1     Running   5         3d1h

[root@k8s-master1 ms_jenkins]# kubectl cp get_tags.sh jenkins-687d65dff5-7rh9v:/var/jenkins_home/
1.4 在 jenkins 上给要回滚的项目创建一个 Job

image-20241130212023067

1.5 pipeline 脚本
#!/usr/bin/env groovy
// 所需插件: Git Parameter/Git/Pipeline/Config File Provider/kubernetes/Extended Choice Parameter/Active Choices

// harbor仓库地址
def registry = "172.16.1.61"
// harbor仓库项目名称
def project = "microservice"
// jenkins agent 镜像
jenkins_agent = "172.16.1.61/library/jenkins-slave-jdk:1.8"

// gitlab仓库地址
def git_url = "http://172.16.1.62:9999/dev/microservice.git"

// jenkins存储的认证信息
def git_auth = "e80eb4fe-4564-48f5-9ef4-a75b49c1c079"
def k8s_auth = "5c5ae334-12dd-4a6a-8a47-1e2a1dbed983"

pipeline {
  agent {
    kubernetes {
        label "jenkins-agent"
        yaml """
apiVersion: v1
kind: Pod
metadata:
  name: jenkins-agent
spec:
  containers:
  - name: jnlp
    image: "${jenkins_agent}"
    imagePullPolicy: Always
    volumeMounts:
      - name: docker-cmd
        mountPath: /usr/bin/docker
      - name: docker-sock
        mountPath: /var/run/docker.sock
  volumes:
    - name: docker-cmd
      hostPath:
        path: /usr/bin/docker
    - name: docker-sock
      hostPath:
        path: /var/run/docker.sock
"""
   }
}

    parameters {
      choice choices: ['eureka-service', 'gateway-service', 'portal-service', 'product-service', 'order-service', 'stock-service'], \
        description: '请选择要回滚的应用', \
        name: 'Service'

      reactiveChoice choiceType: 'PT_SINGLE_SELECT', description: '请选择回滚应用的镜像版本', \
        filterLength: 1, filterable: false, name: 'Tag', \
        randomName: 'choice-parameter-2431088085046', referencedParameters: 'Service', \
        script: groovyScript(fallbackScript: [classpath: [], oldScript: '', sandbox: true, script: ''], \
        script: [classpath: [], oldScript: '', sandbox: true, \
        script: '''cmd = "/bin/bash /var/jenkins_home/get_tags.sh microservice ${Service}"
                   tags_list = cmd.execute().text.tokenize()
                   return tags_list''' \
       ])
   }

    stages {
        stage('执行回滚操作') {
            steps {
                checkout scmGit(branches: [[name: "origin/master"]], extensions: [], \
                  userRemoteConfigs: [[credentialsId: "${git_auth}", url: "${git_url}"]])
               
                configFileProvider([configFile(fileId: "${k8s_auth}", targetLocation: 'admin.kubeconfig')]) {
                  sh """
                    service=${Service}
                    service_name=\${service%-*}
                    rollback_image=${registry}/${project}/\${service_name}:${Tag}
                    sed -i -r "s#(image: )(.*)#\\1\${rollback_image}#" k8s/\${service_name}.yaml
                    kubectl apply -f k8s/\${service_name}.yaml --kubeconfig admin.kubeconfig
                  """
               }
           }
       }
   }
}
1.6 将 pipeline 脚本复制到 pipeline script 文本框中

image-20241201225518578

1.7 立即构建 job

第一次构建会失败并生成参数化构建选项

image-20241201225709709

1.8 参数化构建 job

image-20241201230150753

1 由于使用了从 harbor 仓库获取镜像列表的脚本,jenkins 出于安全考虑禁止了该脚本运行,Tag 标签内容无法显示,需要信任该脚本。

image-20241201230227140

2 系统管理 -> 安全

image-20241201230600183

3 点击 Approve

image-20241201230701617

image-20241201230829163

4 根据选择要回滚的应用,Tag 会自动显示该应用镜像所有的标签

image-20241201231320690

1.9 回滚测试

以 product-service 应用为例进行镜像版本的回滚操作。

1 查看 product-service 应用 pod 现在使用的像版本

[root@k8s-master1 ms_jenkins]# kubectl get pod -n ms | grep product
product-78d4fd9dcd-rd4wr   1/1     Running   0         5h13m

[root@k8s-master1 ms_jenkins]# kubectl describe pod/product-78d4fd9dcd-rd4wr -n ms | grep -i image
Image:          172.16.1.61/microservice/product:3

2 将 product-service 应用镜像版本从 product:3 回滚到 product:2

image-20241201232507266

3 Console Output

image-20241201232635676

......

image-20241201232720222

4 查看流水线步骤

image-20241201233134439

5 product-service 应用会在新的 pod running 后 Terminating 旧的 pod

image-20241201233931269

image-20241201234550428

6 检查 product-service 应用 pod 现在使用的像版本

[root@k8s-master1 ms_jenkins]# kubectl get pod -n ms | grep product
product-7dd5d6bbcc-57dx6   1/1     Running   0         21m

[root@k8s-master1 ms_jenkins]# kubectl describe pod/product-7dd5d6bbcc-57dx6 -n ms | grep -i image
   Image:          172.16.1.61/microservice/product:2

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/844841.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

三维模型文件格式解读

最近接触到三维模型文件,发现格式五花八门的,这里做一个汇总和解读。最近接触到三维模型文件,发现格式五花八门的,这里做一个汇总和解读。 STL 简介 STL,全称为STereoLithography,译作:立体光刻,由3D System软件公司创立。但因三角网格形式的其特点,又可以翻译为“标准…

开源 - Ideal库 - Excel帮助类,TableHelper实现(三)

讲解对象集合与DataTable相互转换,包括表格转对象集合需校验类型、列名对应,及解决结构体赋值问题;对象集合转表格、一维数组转表格、行列转置的方法及示例代码,测试源码已上传。书接上回,我们今天继续讲解实现对象集合与DataTable的相互转换。01、把表格转换为对象集合 该…

信息安全概论复习3

保密与安全文档保密密级术语密码体制 单钥密码体制(对称密码体制)加密方式双钥密码体制(非对称密码体制)(公钥体制)特点

优化企业博客内容:策略与ai工具的应用

在数字化营销日益重要的今天,企业博客不仅是品牌传播的重要渠道,也是吸引潜在客户、建立品牌权威性的关键工具。然而,要让企业博客真正发挥作用,关键在于内容的优化。本文将探讨优化企业博客内容的策略,并详细介绍如何利用HelpLook平台来实施这些策略,以提升博客的吸引力…

攻防世界-Decrypt-the-Message

一、题目 收到一首英文诗歌和一段密文,要求很简单,就是解密这个密文二、解题 1、背景知识PoemCode参考文章:https://blog.csdn.net/xiao__1bai/article/details/1202504522、解密 了解加密原理即可,解密过程很复杂,可以直接用现成的脚本脚本地址:https://github.com/abpoly…

请问PbootCMS 登录失败及表单提交校验失败的解决方案

在使用 PbootCMS 时,可能会遇到登录失败、表单提交校验失败等问题。以下是针对这些常见问题的详细解决方案。 一、登录失败或表单提交校验失败 描述:用户尝试登录时失败。 表单提交时校验失败。解决方案:检查服务器环境:确保服务器环境满足 PbootCMS 的最低要求。 检查 PHP 版…

# 学期(2024-2025-1) 学号(20241420) 《计算机基础与程序设计》第10周学习总结

学期(2024-2025-1) 学号(20241420) 《计算机基础与程序设计》第10周学习总结 作业信息这个作业属于哪个课程 <班级的链接>(2024-2025-1-计算机基础与程序设计)这个作业要求在哪里 <作业要求的链接>(如2024-2025-1计算机基础与程序设计第一周作业)这个作业的目…

关于用户反馈到产品需求的思考

1 前言 在数字产品的世界中,用户反馈不仅是检验产品成功与否的试金石,更是推动产品迭代与创新的关键驱动力。作为项目负责人,我们深知每一个反馈背后蕴含的用户需求与期望。最近刚好看到了@玉伯大佬写的文章从用户反馈到产品需求的思考,深受启发,结合这一年半的工作经验,…

2024年11月文章一览

2024年11月编程人总共更新了21篇文章: 1.2024年10月文章一览 2.《使用Gin框架构建分布式应用》阅读笔记:p307-p392 3.《使用Gin框架构建分布式应用》阅读笔记:p393-p437 4.《使用Gin框架构建分布式应用》读后感 5.《Django 5 By Example》阅读笔记:p1-p16 6.《Django 5 By …

请问帝国CMS动态页面生成静态页面失败怎么办

检查生成设置:进入后台的“系统设置” -> “生成设置”,检查静态页面生成设置是否正确。 确保生成模式选择正确,例如“只生成首页”、“生成所有页面”等。检查模板文件:确保模板文件中没有语法错误,特别是PHP代码部分。 检查模板文件路径是否正确。检查文件权限:确保…

请问宝塔安装好后网址打不开的可能原因及解决方法

检查域名解析确认域名是否正确解析到服务器的IP地址。 使用 ping 命令测试域名解析是否正确,例如:ping yourdomain.com。检查服务器网络确认服务器的网络连接是否正常。 尝试从服务器内部访问外部网站,确保网络畅通。检查防火墙设置确认服务器的防火墙设置是否允许HTTP/HTTP…

宝塔系统安装网站后打不开的解决方法及排查步骤

1. 检查网络连接确认服务器网络是否正常:从服务器上尝试 ping 外部网站,确保网络畅通。 例如:ping 域名 或 ping 你的网址2. 检查宝塔面板状态登录服务器,检查面板是否正常运行:使用命令 bt 进入宝塔面板管理界面。 如果面板未运行,尝试启动面板:bt start3. 检查网站配置…