二丫讲梵 二丫讲梵
首页
  • 最佳实践
  • 迎刃而解
  • Nginx
  • Php
  • Zabbix
  • AWS
  • Prometheus
  • Grafana
  • CentOS
  • Systemd
  • Docker
  • Rancher
  • Ansible
  • Ldap
  • Gitlab
  • GitHub
  • Etcd
  • Consul
  • RabbitMQ
  • Kafka
  • MySql
  • MongoDB
  • OpenVPN
  • KVM
  • VMware
  • Other
  • ELK
  • K8S
  • LLM
  • Nexus
  • Jenkins
  • 随写编年
  • 家人物语
  • 追忆青春
  • 父亲的朋友圈
  • 电影音乐
  • 效率工具
  • 博客相关
  • Shell
  • 前端实践
  • Vue学习笔记
  • Golang学习笔记
  • Golang编程技巧
  • 学习周刊
  • Obsidian插件周刊
关于
友链
  • 本站索引

    • 分类
    • 标签
    • 归档
  • 本站页面

    • 导航
    • 打赏
  • 我的工具

    • 备忘录清单 (opens new window)
    • json2go (opens new window)
    • gopher (opens new window)
    • 微信MD编辑 (opens new window)
    • 国内镜像 (opens new window)
    • 出口IP查询 (opens new window)
    • 代码高亮工具 (opens new window)
  • 外站页面

    • 开往 (opens new window)
    • ldapdoc (opens new window)
    • HowToStartOpenSource (opens new window)
    • vdoing-template (opens new window)
GitHub (opens new window)

二丫讲梵

行者常至,为者常成
首页
  • 最佳实践
  • 迎刃而解
  • Nginx
  • Php
  • Zabbix
  • AWS
  • Prometheus
  • Grafana
  • CentOS
  • Systemd
  • Docker
  • Rancher
  • Ansible
  • Ldap
  • Gitlab
  • GitHub
  • Etcd
  • Consul
  • RabbitMQ
  • Kafka
  • MySql
  • MongoDB
  • OpenVPN
  • KVM
  • VMware
  • Other
  • ELK
  • K8S
  • LLM
  • Nexus
  • Jenkins
  • 随写编年
  • 家人物语
  • 追忆青春
  • 父亲的朋友圈
  • 电影音乐
  • 效率工具
  • 博客相关
  • Shell
  • 前端实践
  • Vue学习笔记
  • Golang学习笔记
  • Golang编程技巧
  • 学习周刊
  • Obsidian插件周刊
关于
友链
  • 本站索引

    • 分类
    • 标签
    • 归档
  • 本站页面

    • 导航
    • 打赏
  • 我的工具

    • 备忘录清单 (opens new window)
    • json2go (opens new window)
    • gopher (opens new window)
    • 微信MD编辑 (opens new window)
    • 国内镜像 (opens new window)
    • 出口IP查询 (opens new window)
    • 代码高亮工具 (opens new window)
  • 外站页面

    • 开往 (opens new window)
    • ldapdoc (opens new window)
    • HowToStartOpenSource (opens new window)
    • vdoing-template (opens new window)
GitHub (opens new window)
  • Nexus系列文章

  • Jenkins系列文章

    • Jenkins入门系列笔记汇总整理
    • 前言与介绍
    • Jenkins初始部署与简单配置
    • Jenkins各配置选项介绍
    • Jenkins中一个项目的构建
    • Jenkins配置项目构建的钉钉通知
    • Jenkins忘记管理员密码怎么办
    • Jenkins与gitlab的交互探微
    • Jenkins根目录详解
    • Jenkins插件之显示构建时间
    • Jenkins插件之批量修改配置
    • Jenkins配置简单构建邮件推送
    • Jenkins复杂邮件推送配置详解
    • Jenkins配置复杂构建邮件推送
    • Jenkins构建安卓项目之前的一些唠叨
    • Jenkins构建安卓项目配置
    • Jenkins与Gitlab分支的交互
    • Jenkins构建nodejs项目
    • 使用docker部署Jenkins及初始配置
    • 配置gitlab提交代码Jenkins自动构建
    • Jenkins回滚方案探微
      • 1,gitlab 代码回滚。
      • 2,脚本方式回滚。
      • 3,war 包回滚。
      • 4,tag 回滚。
    • Jenkins角色控制(小黄锁)探微
    • Jenkins构建的应用配置问题解决探微
    • Jenkins构建中tag的应用
    • Jenkins插件之Ansicolor(神器)
    • 最基础核心的Jenkins功能部署一个java应用
    • Jenkins+sonar构建代码扫描
    • Jenkins+docker+gitlab将应用部署到docker
    • Jenkins参数化构建犀利插件Active-Choices-Plugin
    • 记一次将代码中参数外显到构建历史中的操作
    • Jenkins升级与迁移的经验分享
    • pipeline笔记之从一个简单的项目构建开始
    • Jenkinsfile声明式语法详解
    • 自动构建的原始配置以及pipeline中的用法
    • 多分支构建的实践与思考
    • 使用Jenkinsfile类前端项目的部署与回滚
    • 如何在Jenkinsfile中定义一个全局的时间戳变量
    • Jenkins中自由风格回滚方案的最佳实践
    • Jenkins中pipeline风格回滚方案的最佳实践
    • pipeline结合ansible剧本进行批量的部署与回滚配置
    • 最近配置安卓iOS打包本地化流程中一些值得记录的内容
    • pipeline中如何在environment环节声明一个含有通配符的变量
    • git-Parameter插件在pipeline共享库中的实践详解
    • jenkins作为ci检测代码是否合并的实践
    • 将Jenkins共享库的Jenkinsfile放到ci静态检测的实践
    • Jenkins的pipeline实践之GitSCM参数配置项详解
    • Jenkins中pipeline对接CMDB接口获取主机列表的发布实践
    • Jenkins有任务无法kill提示即将关闭
    • Jenkins基于Share Library共享库的最佳实践探索
    • Jenkins结合MySql Database插件的平台化实践思路
    • Jenkins-Groovy中三元表达式的用法
    • Jenkins-Groovy中Switch的高阶用法
    • Jenkins-pipeline之利用activity choice插件对接查询MySQL数据实现动态参数化的功能
    • CentOS通过yum快速安装Jenkins
    • Jenkins-pipeline语法之错误处理详解(文末有干货)
    • Jenkins常用插件汇总以及简单介绍
    • Jenkins所遇报错汇总及解决
    • Jenkins管理维护运维规范
  • ELK笔记

  • Kubernetes笔记

  • LLM专题

  • 系列专题
  • Jenkins系列文章
二丫讲梵
2018-07-28
目录

Jenkins回滚方案探微

文章发布较早,内容可能过时,阅读注意甄别。

当程序员确认可以发布版本,在由运维人员发布成功之后,测试人员发现刚刚发布版本有问题时,严重的,则需要进行回滚操作了。

对于程序员以及领导来说,回滚只不过是线上业务出现问题的时候一句话而已,但是对于运维人员来说,回滚则是平时就要做好准备的事情,不仅要做好准备,更要有经过演练。

我就曾有过自以为脚本方面都是梳理完整了放进 Jenkins 里,突然一天领导那边说需要回滚一下子,我当然觉得没有问题咯,于是兴致勃勃的跑去进行了回滚的操作,最后却发现,压根儿就没有成功,这就非常尴尬啦,顿时就脸红脖子粗起来,脖子粗也没用呀,问题总还要解决,于是最后只得手动打包,进行了一次原始部署了。

因此,回滚是一件闲时准备,战时不慌的操作,非常重要了。

image

我这里提到的回滚,都是基于 Jenkins 来进行部署考虑的,通过我个人对 Jenkins 的理解,大致分有以下方法可供选择:

# 1,gitlab 代码回滚。

由程序员先将 Git 的版本回退到上一个版本,然后再一次进行部署。就实现了上个版本回退。

但是这种情形很容易受到影响,如果过程中有其他人进行过提交,版本不容易定位,如果牵扯到一些数据库的问题,就更加复杂,极有可能出现一些无法控制的问题,因此这是一种十分不推荐也不可取的方式。但是据我了解到一些公司就曾采用过这种方式来进行回滚的操作,想起来也是十分让人难以理解的。

好了废话不多说,进入今天正题。

# 2,脚本方式回滚。

在 Jenkins 部署脚本当中加入git rev-parse HEAD命令记录每次发布的版本的唯一版本号,并将此记录在一个log文件里,如果需要回滚,则由脚本取出上一次发布的版本号(命令为:tail -n 2 version.log | head -n 1)进行版本的回退,而后在回退的基础上再发布即可。

这是一种非常保险,也绝对靠谱的一种方式了,非常非常推荐。

唯一的缺点,大概可能就是需要重新部署一次有点耗时间,对于某些高访问量(时间就是金钱)的线上业务来说,显得有点耽误工夫了。

具体的这种回滚方式的相关脚本以及思路的参考,我在另一篇文章当中已经写出,可以点击这里进行跳转浏览 (opens new window)。

# 3,war 包回滚。

在每一次发布部署的同时,将每一个部署的(JAVA)war 包按时间进行备份,然后再备份一个紧邻的上次发布的 bak 包,如果需要紧急回滚,则直接将上一个包替换当前包即可。由于一般回滚不会回滚到很久以前的版本,所以这里的备份包,保留五个即可,多余的利用脚本进行删除,避免了时间长占用空间过大的问题。

思路基本如上,我这里列出一个简单脚本仅供参考。

#!/bin/bash
#author:eryajf
#time:2018-7
source /etc/profile
mode=$1
project=$2
code_dir=/root/project/$project
tomcat_dir=/usr/local/tomcat_$project
ROOTWAR_dir=$tomcat_dir/WAR
bakdir=$tomcat_dir/bak_dir
MAVEN_CODE(){
   cd /root/project/$project
   mvn clean install -Dmaven.test.skip=true
   [ $? -ne 0 ] && echo -e '\033[31m[ error ] Failed to maven the code\033[0m' && exit 1
   [ -d $tomcat_dir/WAR ] && mkdir -p $tomcat_dir/WAR
   cp $code_dir/51fbadmin-web/target/ROOT.war $tomcat_dir/WAR
}

deploy()
{
   echo "MAVEN_CODE"
   MAVEN_CODE
   [ ! -d $bakdir ] && mkdir -p $bakdir
   echo "backup"
   [ -f $ROOTWAR_dir/ROOT.war ] && [ -f $tomcat_dir/webapps/ROOT.war ] && mv $tomcat_dir/webapps/ROOT.warbak $bakdir/ROOT_$(date +"%y%m%d%H%M%S").war
   mv $tomcat_dir/webapps/ROOT.{war,warbak}
   echo "stop tomcat_$project" && ps aux | grep "$tomcat_dir" | grep java | grep -v grep | awk '{print $2}' | xargs kill -9
   rm -rf $tomcat_dir/webapps/ROOT && mv $ROOTWAR_dir/ROOT.war $tomcat_dir/webapps
   echo "start tomcat_$project" && /bin/bash /usr/local/tomcat_$project/bin/startup.sh
}

rollback(){
   echo "stop tomcat_$project" && ps aux | grep "$tomcat_dir" | grep java | grep -v grep | awk '{print $2}' | xargs kill -9
   rm -f $tomcat_dir/webapps/ROOT.war && rm -rf $tomcat_dir/webapps/ROOT
   mv $tomcat_dir/webapps/ROOT.{warbak,war}
   echo "start tomcat_$project" && /bin/bash /usr/local/tomcat_$project/bin/startup.sh
}

case "$1" in
   'deploy')
        deploy
        ;;
   'rollback')
        rollback
        ;;
   *)
        echo "Usage: $0 {deploy | rollback}"
        exit 1
esac
exit 0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50

因为这个脚本是一个最后环节的,所以我简单说明一下:

1,脚本承接 Jenkins 处传递过来的两个参数,一个是 mode 的值,一个是 project 的值,mode 决定是部署还是回滚,project 则决定了是对哪个项目进行操作。 2,部署的时候,先将上次备份的 bak 包放进一个专门存放 old 包的目录下,将正在用的包备份成 bak 包,然后进行常规的部署。 3,如果回滚,则直接将 bak 还原回来,即达到回滚目的。

这种简洁高效,非常好用。只要在部署的时候将对应的包进行很好的安置,事情都会非常好处理的。当然了,还少一个定期清理目录下包数量的脚本,别急,您可以参考我的另外一篇文章:如何让不断增加的目录只保留五个文件? (opens new window)

# 4,tag 回滚。

这种回滚方案配置非常简单,而且实用性也非常强,已经在另外一篇文章中进行发布,如需浏览,可以点击跳转:Jenkins 利用 tag 方式进行回滚! (opens new window)

微信 支付宝
#jenkins#回滚
上次更新: 2024/07/04, 22:40:37
配置gitlab提交代码Jenkins自动构建
Jenkins角色控制(小黄锁)探微

← 配置gitlab提交代码Jenkins自动构建 Jenkins角色控制(小黄锁)探微→

最近更新
01
学习周刊-总第211期-2025年第20周
05-15
02
记录二五年五一之短暂回归家庭
05-09
03
学习周刊-总第210期-2025年第19周
05-09
更多文章>
Theme by Vdoing | Copyright © 2017-2025 | 点击查看十年之约 | 浙ICP备18057030号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式