jenkins結合ansible用shell實現自動化部署和回滾

  最近用jenkins+gitlab+ansible作持續化集成,自動化部署和版本回滾。然而deploy plugin沒能作到增量升級和回滾操做,折騰了好久決定本身寫個腳原本簡單實現。html

  環境:git

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

  各工具職能:web

  一、gitlab作版本管理
  二、jenkins根據指定參數,分別執行部署或回滾操做;以及執行結果的展示和記錄。
  三、ansible負責腳本的遠程執行。數據庫

  如下的全部操做都是在上述條件安裝完成且可用的前提下進行。centos

  部署腳本:bash

#!/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配置:添加一個可選參數gitlab

  This build is parameterized --> Choice Parameterui

  變量名爲:url

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,若是你有更好的辦法不妨告訴我。謝謝!

相關文章
相關標籤/搜索