jenkins本身作为一款运维利器,具备

1. 持续集成 (Continuous integration)
2. 持续交付(Continuous delivery)
3. 持续部署(continuous deployment)

的强大能力, 对于生产的版本部署, 有时候会遇到新发的版本出现严重BUG等问题, 急需进行版本回退,为了解决这种应急问题, 特地介绍下如何使用jenkins做web版本控制,在不同版本之间可以快速切换。

1. jenkins的“构建”tab中增加构建步骤: Execute shell

shell脚本讲解:

# 设置部署的项目名称
PROJECT_NAME="optimus-mobile"
# 清理掉上次部署遗留下的项目压缩包
rm -rfv /data/work/.jenkins/jobs/${JOB_NAME}/workspace/*.tar.gz;
# 切换到jenkins部署后打包tar.gz存放的目录空间
cd /data/work/.jenkins/jobs/${JOB_NAME}/workspace;
# 重点!! 创建版本文件 命名规则: rev. + 项目名
touch rev.${PROJECT_NAME}
# 把job的构建编码作为版本号存放到rev文件中(对于SVN代码管理的,可以使用SVN的提交ID作为版本号)
echo $BUILD_NUMBER > rev.${PROJECT_NAME}
# 对workspace空间中的所有文件打包成tar.gz
tar zcvf ${JOB_NAME}.tar.gz *;

  

2. jenkins的“构建后操作”tab中增加构建步骤: Send build artifacts over SSH (通过SSH通道发送构建好的文件)

在Exec command框中插入如下脚本:

#定义当前最新版本的tomcat目录(里面是apache tomcat解压文件)

PROJECT_DEPLOY_HOME="/data/work/optimus-mobile"

# 定义版本的存放目录(里面存储了该项目的所有的版本)
PROJECT_RELEASE_HOME="/data/work/release/optimus-mobile"

#定义项目名称
PROJECT_NAME="optimus-mobile"

#定义版本号所在的文件名称
PROJECT_CHECKOUT_REV_FILE="rev.${PROJECT_NAME}"

#定义最新的版本存放的文件夹上级目录(tomcat中docs是配置指向这里)

PROJECT_WEB_HOME="/data/work/web"

# 设置CATALINA_BASE(用于后面的tomcat启动)
CATALINA_BASE="/data/work/optimus-mobile"

#定义当前构建的版本文件所在的文件夹
WORK_FOLD="/data/work/jenkins-deployer-upload/${JOB_NAME}/${BUILD_ID}/"

#进入当前构建的版本文件夹
cd ${WORK_FOLD}

#解压tar
tar zxvf *.tar.gz

#删除tar
rm *.tar.gz

#获取版本号存储文件中存储的版本号值

REV=`cat ${WORK_FOLD}/${PROJECT_CHECKOUT_REV_FILE}`

#定义新版本的文件夹名称(带上.版本号)
REV_PROJECT="${PROJECT_NAME}.${REV}"

#删除同版本号的文件夹(如果有)
rm -rf "${PROJECT_RELEASE_HOME}/${REV_PROJECT}"

#新建新版本对应的文件夹
mkdir "${PROJECT_RELEASE_HOME}/${REV_PROJECT}"

#把tar解压后的文件全部移动到新建的版本文件夹
mv * "${PROJECT_RELEASE_HOME}/${REV_PROJECT}"

#进入tomcat中当前指向的文件夹目录的上级

cd ${PROJECT_WEB_HOME}

# 删除该目录(这是个软链接)
rm ${PROJECT_NAME}

# 重新创建软链接, 指向最新的版本号
ln -s "${PROJECT_RELEASE_HOME}/${REV_PROJECT}" ${PROJECT_NAME}

# 关闭tomcat

sh ${CATALINA_BASE}/bin/shutdown.sh -force;
sleep 10;

# 删除tomcat中的日志
rm -f ${CATALINA_BASE}/logs/*;

#重启tomcat
sh ${CATALINA_BASE}/bin/startup.sh

3. 配置完毕后,保存jenkins, 立即构建实例

蓝色球表示构建成功, BUILD_ID= 27

4. 此时文件已经上传生产服务器.

看下 /data/work/release/optimus-mobile目录下的文件:

看到里面存了两个版本。

5. 查看最新版本文件夹

cd /data/work/web/
ll

看到当前optimus-mobile软链接指向了BUILD_ID=27的版本文件夹, 这个版本是最新的

6. 查看tomcat的conf/server.xml文件配置:

可见tomcat的部署目录指向的是

/data/work/web/optimus-mobile

路径, /data/work/web/optimus-mobile 路径真实是软链接指向最新的

/data/work/release/optimus-mobile/optimus-mobile.27

7. 如果27版本刚发完生产,测试发现问题,需要马上回退,回退方法只需要修改软链接指向:

# 进入optimus-mobile正式版本目录文件夹上级
cd /data/work/web/
# 删除软链接
rm optimus-mobile
# 新建软链接,指向上一个版本号25
ln -s /data/work/release/optimus-mobile/optimus-mobile. optimus-mobile

完毕~~~~~~~~~~~~~~~~~~~~~~~~

jenkin如何实现web版本控制&回退的更多相关文章

  1. web版本控制

    说说你在web开发中是怎么进行版本管理的 在web开发中,我首先将系统框架搭建完成后,我会发布到服务器上,然后给小组成员进行分工,为他们划分各自的模块,他们每天早上上班时就从服务器上先将自己机器上面的 ...

  2. 在Windows2012下配置Mercurial

    所需的安装文件: xampp-win32-1.8.3-4-VC11-installer.exe python-2.7.7.amd64.msi tortoisehg-3.0.1-x64.msi merc ...

  3. 每日一点:git 与 github 区别

    絮絮叨叨在前:以前的公司,都用svn 进行代码管理.最近我那程序猿先生真的受不了我,强迫我使用tortoiseGit. 一开始对于 git 和 github 傻傻分不清,干脆自己整理资料,总结一下. ...

  4. ****Web API 版本控制的几种方式

    个人建议:用content type,即放在Header里面!比如加一个Version:1.4.3 这篇文章写得很好,介绍了三种实现web api版本化的三种方式.我从评论里又收集到两种方式,所以一共 ...

  5. asp.net web api 版本控制

    版本控制   版本控制的方法有很多,这里提供一种将Odata与普通web api版本控制机制统一的方法,但也可以单独控制,整合控制与单独控制主要的不同是:整合控制通过VersionController ...

  6. ASP.NET Core Web API 版本控制

    在nuget.org上,您可以找到  Microsoft.AspNetCore.Mvc.Versioning包,它提供了有关如何对Web API端点进行版本化的更多选项.这个包的好处是允许你直接在控制 ...

  7. 我的第一个python web开发框架(23)——代码版本控制管理与接口文档

    书接上一回,小白和老菜聊到代码的版本控制和接口文档 小白:为什么要做版本控制,我不弄版本控制不也完成了项目了吗?要做版本控制不是很麻烦,又要安装服务又要提交代码,代码又不是多人用开发,还要写文档... ...

  8. List多个字段标识过滤 IIS发布.net core mvc web站点 ASP.NET Core 实战:构建带有版本控制的 API 接口 ASP.NET Core 实战:使用 ASP.NET Core Web API 和 Vue.js 搭建前后端分离项目 Using AutoFac

    List多个字段标识过滤 class Program{  public static void Main(string[] args) { List<T> list = new List& ...

  9. ASP.NET Web API编程——版本控制

    版本控制   版本控制的方法有很多,这里提供一种将Odata与普通web api版本控制机制统一的方法,但也可以单独控制,整合控制与单独控制主要的不同是:整合控制通过VersionController ...

随机推荐

  1. Java的家庭记账本程序(K)

    日期:2019.3.10 博客期:043 星期日 呕吼~这里是编程菜鸟小Master,今天加油的把第二个模板套用了,更改了许多的设定,我想这一个程序的网页版也就到这里结束了,下面是一部分的展示图,想要 ...

  2. iOS开发多线程之NSOperation

    NSInvocationOperation The NSInvocationOperationclass is a concrete subclass of NSOperationthat you u ...

  3. Python_多进程

    Python 多进程库 multiprocessing ,支持子进程.通信.数据共享.执行不同形式的同步 多进程,绕过gil ,实现多核的利用,多进程也是原生进程,由操作系统维护 在pycharm中, ...

  4. Codeforces 513D2 Constrained Tree

    Constrained Tree 没写出来好菜啊啊. 首先根据输入我们能算出某些节点的左儿子的范围, 右儿子的范围(此时并不准确) 然后我们在划分u这个节点的时候我们从左右开始用树状数组check每一 ...

  5. sql语句表连接删除

    DELETE 表1,表2FROM 表1 LEFT JOIN 表2 ON 表1.id=表2.id WHERE 表1.id=需要删除的ID

  6. 2019-2-14SQLserver中function函数和存储过程、触发器、CURSOR

    Sqlserver 自定义函数 Function使用介绍 前言:         在SQL server中不仅可以可以使用系统自带的函数(时间函数.聚合函数.字符串函数等等),还可以根据需要自定义函数 ...

  7. 2017-10-22—LD激光二极管原理

    直接摘抄百科了: 在讲激光产生机理之前,先讲一下受激辐射.在光辐射中存在三种辐射过程, 一是处于高能态的粒子自发向低能态跃迁,称之为自发辐射; 二是处于高能态的粒子在外来光的激发下向低能态跃迁,称之为 ...

  8. php中的public、protected、private三种访问控制模式及self和parent的区别(转)

    php的public.protected.private三种访问控制模式的区别 public: 公有类型 在子类中可以通过self::var调用public方法或属性,parent::method调用 ...

  9. javascript的数组之map()

    map()方法创建一个新数组,其结果是该数组中的每个元素都调用一个提供的回调函数后返回的结果.新数组 // ES6 let numbers = [1, 5, 10, 15]; let doubles ...

  10. 解决C#中FileSystemWatcher类的Changed事件触发多次的问题

    public static void WatchFile() { FileSystemWatcher watcher = new FileSystemWatcher(); watcher.Path = ...