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

摘要:
最近用jenkins+gitlab+ansible做持续化集成,自动化部署和版本回滚。环境:centos7.064位gitlab:v2.9.0git:2.9jenkins1.651.3、gitplugin、GitLabPlugin、DynamicParameterPlug-in等ansible:2.1.0.0各工具职能:1、gitlab做版本管理2、jenkins根据指定参数,分别执行部署或回滚操作;以及执行结果的展现和记录。"#exit1#fi#切换到本地版本库目录cd$opt_localrepo#更新代码gitpull$opt_url#获取commit日志gitlog--pretty=format:"%H"˃$gitcommitlog#获取当前commit版本currentcommit=`head-1$gitcommitlog`echo"currentcommitid:$currentcommit"#上一次部署的commitidlastdeployid=`head-1$lastversion`echo"lastdeployid:$lastdeployid"if["$lastdeployid"=""];thenlastdeployid=`tail-1$gitcommitlog`echo"lastdeployid:$lastdeployid"fiif["$lastdeployid"="$currentcommit"];thenecho"与上次部署的版本id相同,$currentcommit,不作部署操作。

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

环境:

centos 7.064位
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"]
do
        case "$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
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 0
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 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" = "" ];then
        lastdeployid=`tail -1$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=$2; shift 2;;
                -w|--webdir) opt_webdir=$2; shift 2;;
                --) break ;;
                *) echo $1,$2,$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 0
fi
# 部署脚本所在目录
scriptdir=`pwd`/jenkinsdeploy/
mkdir -p $scriptdir
# 备份记录 
backupfile=$scriptdir/backup.txt
# 获取上一次备份的记录
bakdir=`tail -1$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

jenkins结合ansible用shell实现自动化部署和回滚第1张

执行脚本:

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

jenkins结合ansible用shell实现自动化部署和回滚第2张

最后执行

jenkins结合ansible用shell实现自动化部署和回滚第3张

执行回滚操作的输出日志

执行脚本:
Started by user xxx
Building in workspace /var/lib/jenkins/jobs/ttt/workspace
[workspace] $ /bin/sh -xe /tmp/hudson8451273492016631046.sh
+ echorollback
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
web目录:
成功回滚。
", 
    "stdout_lines": [
        "备份目录:/www/test/bak/201607131627", 
        "web目录:", 
        "成功回滚。"
    ]
}
Finished: SUCCESS

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

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

免责声明:文章转载自《jenkins结合ansible用shell实现自动化部署和回滚》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇学JAVA第十七天,接口与抽象方法[转帖]ArcGIS标注 [VBScript] Joe下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Python机器学习(5)——朴素贝叶斯分类器

朴素贝叶斯分类器是一个以贝叶斯定理为基础,广泛应用于情感分类领域的优美分类器。本文我们尝试使用该分类器来解决上一篇文章中影评态度分类。 1、贝叶斯定理 假设对于某个数据集,随机变量C表示样本为C类的概率,F1表示测试样本某特征出现的概率,套用基本贝叶斯公式,则如下所示: 上式表示对于某个样本,特征F1出现时,该样本被分为C类的条件概率。那么如何用上式来...

转 Android智能手机上捕获数据包

如何在Android智能手机上捕获数据包? 本文由CSDN-蚍蜉撼青松【主页:http://blog.csdn.net/howeverpf】原创,转载请注明出处! 当前Android系统越来越流行,无论是对于安卓应用的开发人员,还是对于网络安全的研究人员,都有可能需要掌握捕获Android应用通信数据包的方法。根据技术手段不同,常用的抓包方法分两类,一类是...

mvn打包时,出现数据库连接错误

原因: maven在install的时候会默认去执行test包下的test示例,导致打包失败,只需要把测试注释掉就可以了包括类上的注解,或者在install的时候跳过测试,install -Dmaven.test.skip=true 重新输入:mvn install -Dmaven.test.skip=true 打包成功!...

shell替换jar包中配置文件脚本

脚本运行平台:centos7.3 1、编写脚本 vi /tmp/change.sh #!/bin/bash#需要替换的包名称bmc=$1#需要替换的文件名称hhwjmc=$2#找到替换文件路径thwjlj=`jar -tvf \$bmc|grep \$hhwjmc|awk '{print \$NF}'` echo $bmcecho $hhwjmcecho...

记录yii2-imagine几个常用方法

记录yii2-imagine几个常用方法:      //压缩 Image::thumbnail('@webroot/img/test-image.jpg', 120, 120)->save(Yii::getAlias('@webroot/img/thumb-test-image.jpg'), ['quality' => 100...

shell函数的调用执行

要想调用执行自己编写的shell文件中的函数,有如下方法: 比如,自己编写了一个test.sh文件如下, #===========test.sh: #! /bin/sh echo_line() {         echo date         echo "Wellcome to shell func!" } echo_line() {...