最近用jenkins+gitlab+ansible做持续化集成,自动化部署和版本回滚。然而deploy plugin没能做到增量升级和回滚操作,折腾了很久决定自己写个脚本来简单实现。

  环境:

centos 7.0 64位
gitlab:v2.9.0
git:2.9
jenkins 1.651.3、git plugin、GitLab Plugin、Dynamic Parameter Plug-in等
ansible:2.1.0.0

  各工具职能:

  1、gitlab做版本管理
  2、jenkins根据指定参数,分别执行部署或回滚操作;以及执行结果的展现和记录。
  3、ansible负责脚本的远程执行。

  以下的所有操作都是在上述条件安装完成且可用的前提下进行。

  部署脚本:

#!/bin/sh
#说明
show_usage="args: [-l , -r , -b , -w]\[--local-repository=, --repository-url=, --backup-dir=, --webdir=]"
#参数
# 本地仓库目录
opt_localrepo=""# git仓库url
opt_url=""# 备份目录
opt_backupdir=""# web目录
opt_webdir=""GETOPT_ARGS=`getopt -o l:r:b:w: -al local-repository:,repository-url:,backup-dir:,webdir: -- "$@"`
eval set -- "$GETOPT_ARGS"
#获取参数
while [ -n "$1" ]
docase "$1" in-l|--local-repository) opt_localrepo=$2; shift 2;;-r|--repository-url) opt_url=$2; shift 2;;-b|--backup-dir) opt_backupdir=$2; shift 2;;-w|--webdir) opt_webdir=$2; shift 2;;--) break ;;*) echo $1,$2,$show_usage; break ;;esac
doneif [[ -z $opt_localrepo || -z $opt_url || -z $opt_backupdir || -z $opt_webdir ]]; thenecho $show_usageecho "opt_localrepo: $opt_localrepo , opt_url: $opt_url , opt_backupdir: $opt_backupdir , opt_webdir: $opt_webdir"exit 0
fi# 部署脚本所在目录
scriptdir=`pwd`/jenkinsdeploy/
mkdir -p $scriptdir# 当前部署版本号
currversion=$scriptdir/currentversion.txt# 上次部署版本
lastversion=$scriptdir/lastversion.txt
if [ ! -f "$lastversion" ];thenecho "" > $lastversion
fi# git commit日志
gitcommitlog=$scriptdir/gitcommitlog.txt# 两个版本间差异文件列表
difffile=$scriptdir/difffile.txt#if [ "$repodif" == "" ];then
#        echo "仓库本地目录不能为空,请输入本地仓库目录参数!"
#        exit 1
#fi# 切换到本地版本库目录
cd $opt_localrepo
# 更新代码
git pull $opt_url
# 获取commit日志
git log --pretty=format:"%H" > $gitcommitlog# 获取当前commit版本
currentcommit=`head -1 $gitcommitlog`
echo "current commit id: $currentcommit"# 上一次部署的commit id
lastdeployid=`head -1 $lastversion`
echo "lastdeployid: $lastdeployid"if [ "$lastdeployid" = "" ];thenlastdeployid=`tail -1 $gitcommitlog`echo "lastdeployid: $lastdeployid"
fiif [ "$lastdeployid" = "$currentcommit" ];thenecho "与上次部署的版本id相同,$currentcommit,不作部署操作。"exit
fi# 获取两个版本间差异的文件列表
echo "pwd: `pwd`"
git diff $lastdeployid $currentcommit --name-only > $difffile
echo "git diff $lastdeployid $currentcommit --name-only  $difffile">$scriptdir/log.txt# 根据当前时间生成备份目录
bakversion=`date "+%Y%m%d%H%M"`
bakdir=$opt_backupdir/$bakversion
echo "bakdir: $bakdir"# 创建备份目录
mkdir -p $bakdir
# 备份文件,要保存相对目录结构必须切换到程序根目录,否则获取的是绝对目录
cd $opt_webdir
cat $difffile | xargs -i -t cp -rf --parents {} $bakdir/# 部署,,要保存相对目录结构必须切换到程序根目录,否则获取的是绝对目录
cd $opt_localrepo
cat $difffile | xargs -i -t cp -rf --parents {} $opt_webdir/# 记录当前部署版本信息
echo $currentcommit >$lastversionecho "$bakdir">>$scriptdir/backup.txt

  版本回滚脚本:

#!/bin/sh
#说明
show_usage="args: [-b , -w]\[--backup-dir=, --webdir=]"
#参数# 备份目录
opt_backupdir=""# web目录
opt_webdir=""GETOPT_ARGS=`getopt -o b:w: -al backup-dir:,webdir: -- "$@"`
eval set -- "$GETOPT_ARGS"
#获取参数
while [ -n "$1" ]
docase "$1" in-b|--backup-dir) opt_backupdir=$2; shift 2;;-w|--webdir) opt_webdir=$2; shift 2;;--) break ;;*) echo $1,$2,$show_usage; break ;;esac
doneif [[ -z $opt_backupdir || -z $opt_webdir ]]; thenecho $show_usageecho "opt_backupdir: $opt_backupdir , opt_webdir: $opt_webdir"exit 0
fi# 部署脚本所在目录
scriptdir=`pwd`/jenkinsdeploy/
mkdir -p $scriptdir# 备份记录
backupfile=$scriptdir/backup.txt
# 获取上一次备份的记录
bakdir=`tail -1 $backupfile`if [ "$bakdir" = "" ];thenecho "无法获取备份目录。"exit
fiecho "备份目录:$bakdir"
echo "web目录:$opt_webdir"cd $bakdir
cp -rf --parents ./* $opt_webdir/echo "成功回滚。"

  jenkins配置:添加一个可选参数

  This build is parameterized --> Choice Parameter

  变量名为:

deploy_envirenment

  变量值:

deploy
rollback

  

  执行脚本:

echo $deploy_envirenment
case $deploy_envirenment indeploy)echo "deploy: $deploy_envirenment"ansible webservers -m script -a "~/bashscript/xxxxxx_deploy.sh --local-repository=/www/test/test --repository-url=git仓库地址 --backup-dir=/www/test/bak --webdir=/www/test/www";;rollback)echo "rollback: $deploy_envirenment"ansible webservers -m script -a '~/bashscript/xxxxxx_rollback.sh --backup-dir=/www/test/bak --webdir=/www/test/www';;*)exit;;
esac

  

  最后执行

  

  执行回滚操作的输出日志

执行脚本:
Started by user xxx
Building in workspace /var/lib/jenkins/jobs/ttt/workspace
[workspace] $ /bin/sh -xe /tmp/hudson8451273492016631046.sh
+ echo rollback
rollback
+ case $deploy_envirenment in
+ echo 'rollback: rollback'
rollback: rollback
+ ansible webservers -m script -a '~/bashscript/xxxx_rollback.sh --backup-dir=/www/test/bak --webdir=/www/test/www'
xxx.xxx.xxx.xxx | SUCCESS => {"changed": true, "rc": 0, "stderr": "", "stdout": "备份目录:/www/test/bak/201607131627\r\nweb目录:\r\n成功回滚。\r\n", "stdout_lines": ["备份目录:/www/test/bak/201607131627", "web目录:", "成功回滚。"]
}
Finished: SUCCESS

  这里只是简单地实现了自动化部署和回滚操作,如果做得更智能的话,结合数据库可以做成回滚到某个版本等。

  更多参考内容见:http://www.cnblogs.com/rwxwsblog/category/850777.html,如果你有更好的办法不妨告诉我。谢谢!

转载于:https://www.cnblogs.com/rwxwsblog/p/5667772.html

jenkins结合ansible用shell实现自动化部署和回滚相关推荐

  1. 企业里实现代码自动部署、回滚的解决方案——Caphub

    上周给大家介绍了capistrano,它可以帮助我们来解决代码自动部署与回滚的软件,但这个软件还是有点缺点,比如如果你同时有多个项目的时候,就得创建多个目录,然后每次进行代码更新的时候,进入到不同的目 ...

  2. (三)jenkins+bonobo git server+windows系统自动化部署springboot项目(远程windows自动化部署)

    前提 jenkins安装,参考:(一)jenkins+bonobo git server+windows系统自动化部署springboot项目(jenkins安装) 自动化部署,参考:(二)jenki ...

  3. shell脚本自动化部署服务

    shell脚本自动化部署 !/bin/bash#export PATH=$PATH:/export/maven/binrun_flag_dir="/data0/shell/deploy_wo ...

  4. (二)jenkins+bonobo git server+windows系统自动化部署springboot项目(自动化部署)

    前提:jenkins安装 参考:(一)jenkins+bonobo git server+windows系统自动化部署springboot项目(jenkins安装) 1插件下载 主要是检查如下插件是否 ...

  5. maven配置自动部署到服务器上,jenkins+svn+maven安装配置并自动化部署成功(超级详细)...

    jenkins+svn+maven安装配置并自动化部署成功(超级详细) jenkins+svn+maven安装配置并自动化部署成功(超级详细) 简言 写这篇博客的原因是因为每次部署服务器的流程都是在做 ...

  6. shell半自动化部署standalone的spark分布式集群

    背景:以前每次配置hadoop和spark都要各种输入配置,太烦了.这次花了点时间,自己做了个shell来辅助自己的spark部署方式.cdh的hadoop没有部署,以后再部署,hadoop和spar ...

  7. Jenkins使用FTP进行一键部署及回滚(Windows)

    前提条件: 1.必须有两台服务器,一个是生产环境,另一个是测试环境. 2.两台服务器上都必须安装了Jenkins. 3.其中,生产环境上的Jenkins已经开通的CLI的权限(Windows参考:ht ...

  8. Jenkins:参数化构建:多分支|多模块|回滚|打印日志

    Jenkins:参数化构建:多分支|多模块|回滚|打印日志 多分支 安装Git Parameter Plug-In 配置参数 选择构建分支 分模块 前提 分模块build 参数配置 分模块shell脚 ...

  9. Serverless化让服务部署和回滚更快乐

    导读: 今年,阿里巴巴即将迎来线上业务全面上云,在这样宏大的工程背后会有哪些精彩有趣的细节?这次我们采访了阿里巴巴云研发部创新产品方向负责人林帆老师,从 Serverless 技术落地这个主题来一窥究 ...

最新文章

  1. 关于DWG文件转换成PDF
  2. java -jar Incompatible argument to function
  3. 盘启动盘_[装机]推荐唯二的两个开源免费的启动盘工具,轻松创建USB启动盘
  4. Linux之curl命令使用详解—网络故障定位(五)
  5. 1920+1080+android三星手机,三星Galaxy Note3能拍摄1080p视频吗?支持1080p播放吗?
  6. ArcGIS Pro发布三维场景服务
  7. ssh无密码登录设置(centos6系统下实现)
  8. LINUX系统管理----GRUB笔记
  9. POJ 1719 Shooting Contest
  10. 《科学》公布2018十大科学突破技术
  11. matlab vs2010编译器xml,如何在MATLAB R2010a 中使用Visual C++ 2010编译器
  12. varnish服务器在内存大量富余时使用交换空间的原因及解决方法
  13. html5游戏制作入门系列教程(七)
  14. 2017百度之星初赛:B-1006. 小小粉丝度度熊(贪心+尺取)
  15. 华三 h3c Vlan静态路由
  16. 居民身份证号码查询系统
  17. android计算器括号,计算器(一)——加减和括号
  18. 幅频特性曲线的绘制(2)
  19. 菜鸟运维笔记:小记编译安装Nginx所遇到的坑
  20. Python实现psf2otf

热门文章

  1. 新手指南:X5Cloud云端应用安装步骤(有图有说明)
  2. TOP10十大GPS导航手机(有车一族必备手机)
  3. datetime 索引_【免费毕设】ASP.NET基于Ajax+Lucene构建搜索引擎的设计和实现(源代码+论文)...
  4. linux里的网卡自动连接,【Raspberry Pi】USB无线网卡自动连接
  5. iis10.0 php多版本,IIS7 IIS8 中多个版本php共存的方法
  6. java公约数_Java:获得最大的公约数
  7. 消息中间件kafka集群搭建
  8. PostgreSQL中的执行计划
  9. arduino 步进电机驱动库_一文看懂arduino驱动uln2003操作步进电机的方法
  10. 求离散数据的突变点_数据的离散程度分析1