zoukankan      html  css  js  c++  java
  • 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
    web目录:
    成功回滚。
    ", 
        "stdout_lines": [
            "备份目录:/www/test/bak/201607131627", 
            "web目录:", 
            "成功回滚。"
        ]
    }
    Finished: SUCCESS

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

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

  • 相关阅读:
    Lombok——一款Java构建工具,“懒人”必备!!(idea版)
    HTML——列表标签
    HTML——超链接<a>
    python 数据写入json文件时中文显示Unicode编码问题
    Spring——Bean的作用域
    过程与函数
    异常错误处理
    游标变量的使用
    =>符号的意义
    游标的使用
  • 原文地址:https://www.cnblogs.com/rwxwsblog/p/5667772.html
Copyright © 2011-2022 走看看