jenkins结合ansible用shell实现自动化部署和回滚
最近用jenkins+gitlab+ansible做持续化集成,自动化部署和版本回滚。然而deploy plugin没能做到增量升级和回滚操作,折腾了很久决定自己写个脚本来简单实现。
环境:
centos 7.0 64位
gitlab:v2.9.0
git:2.9
jenkins 1.651.、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" ]
do
case "$1" in
-l|--local-repository) opt_localrepo=$; shift ;;
-r|--repository-url) opt_url=$; shift ;;
-b|--backup-dir) opt_backupdir=$; shift ;;
-w|--webdir) opt_webdir=$; shift ;;
--) break ;;
*) echo $,$,$show_usage; break ;;
esac
done if [[ -z $opt_localrepo || -z $opt_url || -z $opt_backupdir || -z $opt_webdir ]]; then
echo $show_usage
echo "opt_localrepo: $opt_localrepo , opt_url: $opt_url , opt_backupdir: $opt_backupdir , opt_webdir: $opt_webdir"
exit
fi # 部署脚本所在目录
scriptdir=`pwd`/jenkinsdeploy/
mkdir -p $scriptdir # 当前部署版本号
currversion=$scriptdir/currentversion.txt # 上次部署版本
lastversion=$scriptdir/lastversion.txt
if [ ! -f "$lastversion" ];then
echo "" > $lastversion
fi # git commit日志
gitcommitlog=$scriptdir/gitcommitlog.txt # 两个版本间差异文件列表
difffile=$scriptdir/difffile.txt #if [ "$repodif" == "" ];then
# echo "仓库本地目录不能为空,请输入本地仓库目录参数!"
# exit
#fi # 切换到本地版本库目录
cd $opt_localrepo
# 更新代码
git pull $opt_url
# 获取commit日志
git log --pretty=format:"%H" > $gitcommitlog # 获取当前commit版本
currentcommit=`head - $gitcommitlog`
echo "current commit id: $currentcommit" # 上一次部署的commit id
lastdeployid=`head - $lastversion`
echo "lastdeployid: $lastdeployid" if [ "$lastdeployid" = "" ];then
lastdeployid=`tail - $gitcommitlog`
echo "lastdeployid: $lastdeployid"
fi if [ "$lastdeployid" = "$currentcommit" ];then
echo "与上次部署的版本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 >$lastversion echo "$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" ]
do
case "$1" in
-b|--backup-dir) opt_backupdir=$; shift ;;
-w|--webdir) opt_webdir=$; shift ;;
--) break ;;
*) echo $,$,$show_usage; break ;;
esac
done if [[ -z $opt_backupdir || -z $opt_webdir ]]; then
echo $show_usage
echo "opt_backupdir: $opt_backupdir , opt_webdir: $opt_webdir"
exit
fi # 部署脚本所在目录
scriptdir=`pwd`/jenkinsdeploy/
mkdir -p $scriptdir # 备份记录
backupfile=$scriptdir/backup.txt
# 获取上一次备份的记录
bakdir=`tail - $backupfile` if [ "$bakdir" = "" ];then
echo "无法获取备份目录。"
exit
fi echo "备份目录:$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 in
deploy)
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": ,
"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,如果你有更好的办法不妨告诉我。谢谢!
jenkins结合ansible用shell实现自动化部署和回滚的更多相关文章
- PHP 基于 Jenkins ansible 动态选择版本进行自动化部署与回滚(第二版)
PHP 基于 Jenkins ansible 动态选择版本进行自动化部署与回滚(第二版) 先看流程图: 大概介绍一下: 版本选择使用jenkins 中的 git parameter 插件实现 回滚方式 ...
- Asp.net Core 使用Jenkins + Dockor 实现持续集成、自动化部署(二):部署
前面又是废话 我之前写过: Asp.Net Core 程序部署到Linux(centos)生产环境(一):普通部署 Asp.Net Core 程序部署到Linux(centos)生产环境(二):doc ...
- shell脚本自动化部署
由于公司技术部团队较小,没有专门的运维团队,所以运维工作技术部承包了. 一.纯人工部署是这样的: 1. 本地打包:一般 maven clean package 2. 借助xftp上传到服务器对应目录 ...
- Asp.net Core 使用Jenkins + Dockor 实现持续集成、自动化部署(三):搭建jenkins集群环境
写在前面 大家可以看到本文的配图,左边是jenkins单机环境,右边是jenkins集群.个中区别,不言而喻,形象生动. 前面我分别介绍了.net core 程序的多种部署方式(无绝对孰优孰劣): 1 ...
- Asp.net Core 使用Jenkins + Dockor 实现持续集成、自动化部署(一):Jenkins安装
2019/1/31更新,经过我一段时间的使用 建议大家的jenkins还是不要使用docker方式安装 建议大家的jenkins还是不要使用docker方式安装 建议大家的jenkins还是不要使用d ...
- shell脚本自动化部署服务
shell脚本自动化部署 !/bin/bash #export PATH=$PATH:/export/maven/bin run_flag_dir="/data0/shell/deploy_ ...
- 使用Jenkins结合Gogs和SonarQube对项目代码进行测试、部署、回滚,以及使用keepalived+haproxy调度至后端tomcat
0 环境说明 主tomcat:192.168.0.112 备tomcat:192.168.0.183 haproxy+keepalived-1:192.168.0.156 haproxy+keepal ...
- Jenkins使用FTP进行一键部署及回滚(Windows)
前提条件: 1.必须有两台服务器,一个是生产环境,另一个是测试环境. 2.两台服务器上都必须安装了Jenkins. 3.其中,生产环境上的Jenkins已经开通的CLI的权限(Windows参考:ht ...
- Jenkins使用FTP进行一键部署及回滚2(Windows)(项目实践)
转载:http://www.cnblogs.com/EasonJim/p/6295372.html Jenkins使用FTP进行一键部署及回滚2(Windows)(项目实践) 前提: 这一篇是继上一 ...
随机推荐
- MySQL索引之前缀索引和索引选择性
有时需要索引很长的字符列,它会使索引变大而且变慢.一个策略就是模拟哈希索引.但是有时这也不够好,那? 通常可以索引开始的几个字符,而不是全部值,以节约空间并得到好的性能.这使索引需要的空间变小,但是也 ...
- android自定义控件(2)-拖拽实现开关切换
在这里,我们的主要工作就是在原有代码的基础上,增加一个重写的onTouchEvent方法,刚添加上来的时候是这个样子的: @Override public boolean onTouchEvent(M ...
- 正则表达式基础---转自 Python正则表达式指南 前边
1. 正则表达式基础 1.1. 简单介绍 正则表达式并不是Python的一部分.正则表达式是用于处理字符串的强大工具,拥有自己独特的语法以及一个独立的处理引擎,效率上可能不如str自带的方法,但功能十 ...
- jq 构造函数,然后再表单提交过程中对数据进行修改
先贴代码 <script type="text/javascript"> function appendText(){ var content = $("#t ...
- poj3254 Corn Fields (状压DP)
http://poj.org/problem?id=3254 Corn Fields Time Limit: 2000MS Memory Limit: 65536K Total Submissio ...
- JavaScript 学习笔记 -- Function
JS 中 函数.继承.闭包.作用域链... 一直都是硬伤,一碰到这样的问题头就大了.但是如果我继续着说:我不会,就真的无药可救了.要勇敢地说出:我的字典里就没有不会这个词,吼吼..正好昨天在书城里看了 ...
- ASP.NET原理分析
ASP.NET请求与处理全过程分析 1.用户向服务器的某IP端口发送请求,此端口通过Http.sys来管理,请求报文被Http.sys接收,Http.sys在注册表中找能处理这个请求类型的应用程序,最 ...
- Ubuntu/Windows下利用“HIDAPI”库函数实现与Hid类USB设备通信
一.背景: 最近在做的一个项目需要使用USB传递数据,对USB理解不是很深,USB的系统驱动编写则更是天方 夜谭,因此将设备配置成HID类设备成为了首选.其最大的好处在于,LINUX/Windows系 ...
- 1.交通聚类:编辑距离 (Levenshtein距离)Java实现
1.最近工作中要实现用户车辆的行驶路线的聚类,由于所给的数据只有用户一天中交通卡口所监视的卡口名称 :即青岛路-威海路-济阳路 . 要通过聚类实现车辆路线的规律分析,首先要解决的是相似度问题,我们知道 ...
- Go - template 常用方法详解 及 注意事项
Go template包下面有两个函数可以创建模板实例 func New(name string) *Template func ParseFiles(filenames ...string) (*T ...