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

  最近用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" ]
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

  

  执行脚本:

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": 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,如果你有更好的办法不妨告诉我。谢谢!

时间: 2024-10-26 19:10:38

jenkins结合ansible用shell实现自动化部署和回滚的相关文章

Linux下的Jenkins+Tomcat+Maven+Gitlab+Shell环境的搭建使用(jenkins自动化部署)

jenkins自动化部署   目标:jenkins上点构建(也可以自动检查代码变化自动构建)>>>项目部署完成.   一.安装jenkins 1.下载jenkins       这里我选择的是war包安装jenkins,简单不伤脑,别的博客写的jenkins版本都很旧,没用最新的,写个比较新的配置2.20版. 官网:https://jenkins.io/index.html WAR包下载地址:http://mirrors.tuna.tsinghua.edu.cn/jenkins/war/

基于jenkins的自动化部署几种方式

通过之前的努力,将自动编译过程通过脚本在60多个项目组推广了,接下来就需要"自动部署"了.最近几天也在考虑这个自动部署的具体如何实现,自己能想到的先总结下: 1.共享目录.通过脚本 net use \\remote_machine_ip\share_folder 的方式实现(仅仅通过脚本就能实现,前提是目录共享,有一定的安全风险) 2.临时文件中转服务器.一般实现自动化编译,有一套的自己的源码管理服务器(比如: svn 或 git 服务器),在编译服务器上将编译好的文件上传到临时的文件

基于jenkins的自动化部署实现

好久没碰过 jenkins 了,最近公司准备将几十个项目都是先自动化部署(自动编译已经实现),让配置基于 jenkins 做一下,配置写了个 .bat 使用 use 来开共享文件夹的方式实现,之前有正常执行成功做(这种方式是可以完成目标的),但今天出现了问题: 在 cmd 命令行下执行 net use \\x.x.x.x\shared_folder password /user:username 时,正常,但是在 jenkins 中执行是,就遇到错误:"无法使用资源" 经过仔细思考,j

一步一步用jenkins,ansible,supervisor打造一个web构建发布系统

新blog地址:http://hengyunabc.github.io/deploy-system-build-with-jenkins-ansible-supervisor/ 一步一步用jenkins,ansible,supervisor打造一个web构建发布系统. 本来应该还有gitlab这一环节的,但是感觉加上,内容会增加很多.所以直接用github上的spring-mvc-showcase项目来做演示. https://github.com/spring-projects/spring-

自动化部署难驾驭?这篇文章分分钟拯救你的运维体系!

作者介绍 徐亮伟,江湖人称标杆徐,曾负责大规模集群架构自动化运维工作.擅长自动化运维,并且在分布式.Python自动化.云计算虚拟化等领域有较深入研究.个人博客:http://www.xuliangwei.com.   一.自动化部署代码实践   早期手动部署代码  纯手动scp上传代码. 纯手动登陆,git pull 或者svn update. 纯手动xftp上传代码. 开发发送压缩包,rz上传,解压部署代码.   缺点: 全程运维参与,占用大量时间. 如果节点多,上线速度慢. 人为失误多,目

jenkins集成ansible注意事项Failed to connect to the host via ssh.

  在集成jenkins和ansible实现自动化部署时,root用户下执行ansible命令时可以正常运行.由于是通过jenkins用户去执行ansible命令,而jenkins用户却报如下异常: XXXXXXX | UNREACHABLE! => { "changed": false, "msg": "Failed to connect to the host via ssh.", "unreachable": tr

构建iOS持续集成平台(三)CI服务器与自动化部署

CI服务器 写到这儿,对于iOS开发者来说,需要准备好: 一个比较容易获取的源代码仓库(包含源代码) 一套自动化构建脚本 一系列围绕构建的可执行测试 接下来就需要一个CI服务器来根据源代码的变更触发构建,监控测试结果.目前,业界比较流行的,支持iOS构建的CI服务器有Travis CI和Jenkins Travis CI Travis CI[20]是一个免费的云服务平台,主要功能就是为开源社区提供免费的CI服务,对于商业用户可以使用Travis Pro版本,其基本上支持所有目前主流的语言,Obj

在Docker中自动化部署Ruby on Rails的教程

  这篇文章主要介绍了在Docker中部署Ruby on Rails的教程,Docker是当下最火的虚拟机,而本文所介绍的Ruby on Rails的部署则充分利用了Ruby中的rake这一炫酷的实现自动化的方法,需要的朋友可以参考下 基本的Rails应用程序 现在让我们启动一个基本的Rails应用.为了更好的展示,我使用Ruby 2.2.0和Rails 4.1.1 在终端运行: ? 1 2 $ rvm use 2.2.0 $ rails new && cd docker-test 创建一

Apache Ant 实现自动化部署

Apache Ant 实现自动化部署 http://www.netkiller.cn/journal/java.ant.html Mr. Neo Chen (陈景峯), netkiller, BG7NYT 中国广东省深圳市龙华新区民治街道溪山美地518131+86 13113668890 <netkiller@msn.com> 版权声明 转载请与作者联系,转载时请务必标明文章原始出处和作者信息及本声明. 文档出处: http://netkiller.github.io http://netki