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

本文发布时间: 2019-Mar-22
最近用jenkins+gitlab+ansible做持续化集成,自动化部署和版本回滚。然而deploy plugin没能做到增量升级和回滚操作,折腾了很久决定自己写个脚本来简单实现。  环境:centos 7.0 64位gitlab:v2.9.0git:2.9jenkins 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仓库urlopt_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 ;; esacdoneif [[ -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 0fi# 部署脚本所在目录scriptdir=`pwd`/jenkinsdeploy/mkdir -p $scriptdir# 当前部署版本号currversion=$scriptdir/currentversion.txt# 上次部署版本lastversion=$scriptdir/lastversion.txtif [ ! -f '$lastversion' ];then echo '' > $lastversionfi# 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 idlastdeployid=`head -1 $lastversion`echo 'lastdeployid: $lastdeployid'if [ '$lastdeployid' = '' ];then lastdeployid=`tail -1 $gitcommitlog` echo 'lastdeployid: $lastdeployid'fiif [ '$lastdeployid' = '$currentcommit' ];then echo '与上次部署的版本id相同,$currentcommit,不作部署操作。' exitfi# 获取两个版本间差异的文件列表echo 'pwd: `pwd`'git diff $lastdeployid $currentcommit --name-only > $difffileecho 'git diff $lastdeployid $currentcommit --name-only $difffile'>$scriptdir/log.txt# 根据当前时间生成备份目录bakversion=`date '+%Y%m%d%H%M'`bakdir=$opt_backupdir/$bakversionecho 'bakdir: $bakdir'# 创建备份目录mkdir -p $bakdir# 备份文件,要保存相对目录结构必须切换到程序根目录,否则获取的是绝对目录cd $opt_webdircat $difffile | xargs -i -t cp -rf --parents {} $bakdir/# 部署,,要保存相对目录结构必须切换到程序根目录,否则获取的是绝对目录cd $opt_localrepocat $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' ]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 ;; esacdoneif [[ -z $opt_backupdir || -z $opt_webdir ]]; then echo $show_usage echo 'opt_backupdir: $opt_backupdir , opt_webdir: $opt_webdir' exit 0fi# 部署脚本所在目录scriptdir=`pwd`/jenkinsdeploy/mkdir -p $scriptdir# 备份记录 backupfile=$scriptdir/backup.txt# 获取上一次备份的记录bakdir=`tail -1 $backupfile`if [ '$bakdir' = '' ];then echo '无法获取备份目录。' exitfiecho '备份目录:$bakdir'echo 'web目录:$opt_webdir'cd $bakdircp -rf --parents ./* $opt_webdir/echo '成功回滚。'  jenkins配置:添加一个可选参数  This build is parameterized --> Choice Parameter  变量名为:deploy_envirenment  变量值:deployrollback    执行脚本:echo $deploy_envirenmentcase $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 xxxBuilding in workspace /var/lib/jenkins/jobs/ttt/workspace[workspace] $ /bin/sh -xe /tmp/hudson8451273492016631046.sh+ echo rollbackrollback+ 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/201607131627web目录:成功回滚。', 'stdout_lines': [ '备份目录:/www/test/bak/201607131627', 'web目录:', '成功回滚。' ]}Finished: SUCCESS  这里只是简单地实现了自动化部署和回滚操作,如果做得更智能的话,结合数据库可以做成回滚到某个版本等。  更多参考内容见:http://www.cnblogs.com/rwxwsblog/category/850777.html,如果你有更好的办法不妨告诉我。谢谢!


(以上内容不代表本站观点。)
---------------------------------
本网站以及域名有仲裁协议。
本網站以及域名有仲裁協議。

2024-Mar-04 02:08pm
栏目列表