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