一:本文通過jenkins調用shell腳本的的方式完成從Git服務器獲取代碼、打包、部署到web服務器、將web服務器從負載均衡器刪除、解壓、複製配置文件、創建軟連接、測試每一臺web服務器、將web服務器添加至負載均衡、回滾到任意指定版本、一鍵回滾到上一版本等功能,腳本放在www用戶家目錄並使用www用戶身份執行,每個web服務器也都使用www用戶運行web服務,且UID相同web目錄和權限都一致,更嚴格的標準化可以帶來更安全的生產環境和更高的效率:
1.1:在jenkins項目配置中調用shell腳本與環境準備:
1.1.1:#jenkins-項目-配置:
1.1.2:www用戶家目錄中的腳本內容:
$ cat code_deploy.sh
<code> NODE_LIST="192.168.10.101 192.168.10.102"
PRE_LIST="192.168.10.101"
GROUP1_LIST="192.168.10.102"
LOG_CDATE=`date"+%Y-%m-%d"
` LOG_CTIME=`date"+%H-%M-%S"
` CDATE=$(date"+%Y-%m-%d"
) CTIME=$(date"+%H-%M-%S"
) SHELL_NAME="deploy.sh"
SHELL_DIR="/home/www"
SHELL_LOG="
${SHELL_DIR}
/${SHELL_NAME}
.LOG" LOCK_FILE="/tmp/deploy.lock"
PRO_NAME="web-demo"
CODE_DIR="/deploy/code/web-demo"
CONFIG_DIR="/deploy/config/web-demo"
TMP_DIR="/deploy/tmp"
TAR_DIR="/deploy/tar"
ROLLBACK_LIST="192.168.10.101 192.168.10.102"
usage
(){echo
$"
$0
使用幫助:$0
deploy or rollback + code version" }writelog
(){ LOGINFO=$1
echo
"
${CDATA}
${CTIME}
:${SHELL_NAME}
:${LOGINFO}
" >>${SHELL_LOG}
}code_get
(){ writelog"code_get"
cd
${CODE_DIR}
&& git pull /bin/cp -rf${CODE_DIR}
${TMP_DIR}
/ API_VERL=$(git show | grep commit | cut -d' '
-f2) API_VER=$(echo
${API_VERL:0:8}
) }code_build
(){echo
code_build }code_config
(){ writelog"conde_config"
/bin/cp -rf${CONFIG_DIR}
/base/*${TMP_DIR}
/${PRO_NAME}
PKG_NAME="
${PRO_NAME}
"_"
${API_VER}
"_"
${CDATE}
-${CTIME}
"cd
${TMP_DIR}
&& mv${PRO_NAME}
${PKG_NAME}
}code_tar
(){ writelog"conde_tar"
cd
${TMP_DIR}
&& tar czf${PKG_NAME}
.tar.gz${PKG_NAME}
--exclude=".git"
writelog"
${PKG_NAME}
.tar.gz 打包成功" }code_scp
(){ writelog"code_scp"
for
nodein
${PRE_LIST}
;do
scp${TMP_DIR}
/${PKG_NAME}
.tar.gz$node
:/opt/webrootdone
for
nodein
${GROUP1_LIST}
;do
scp${TMP_DIR}
/${PKG_NAME}
.tar.gz$node
:/opt/webrootdone
}
cluster_node_remove
(){ writelog"cluster_node_remove"
}pre_deploy
(){ writelog"code_deploy"
for
nodein
${PRE_LIST}
;do
cluster_node_remove${node}
echo
"pre_deploy, cluster_node_remove
${node}
" ssh${node}
"cd /opt/webroot && tar zxf
${PKG_NAME}
.tar.gz" ssh${node}
"rm -f /webroot/web-demo && ln -s /opt/webroot/
${PKG_NAME}
/webroot/web-demo"done
}pre_test
(){for
nodein
${PRE_LIST}
;do
curl -s --head http://${node}
:8899/index.html | grep"200 OK"
if
[ $? -eq 0 ];then
writelog"
${node}
Web Test OK!"echo
"
${node}
Web Test OK!" cluster_node_add${node}
writelog"pre,
${node}
add to cluster OK!"else
writelog"
${node}
test no OK"echo
"
${node}
test no OK" delete_key_filebreak
fi
done
}group1_deploy
(){ writelog"code_deploy"
for
nodein
${GROUP1_LIST}
;do
cluster_node_remove$node
echo
"group1, cluster_node_remove
$node
" ssh${node}
"cd /opt/webroot && tar zxf
${PKG_NAME}
.tar.gz" ssh${node}
"rm -f /webroot/web-demo && ln -s /opt/webroot/
${PKG_NAME}
/webroot/web-demo"done
scp${CONFIG_DIR}
/other/192.168.10.102.server.xml 192.168.10.102:/webroot/web-demo/server.xml }group1_test
(){for
nodein
${PRE_LIST}
;do
curl -s --head http://${node}
:8899/index.html | grep"200 OK"
if
[ $? -eq 0 ];then
writelog"
${node}
Web Test OK!"echo
"group1_test,
${node}
Web Test OK!" cluster_node_add writelog"
${node}
add to cluster OK!"else
writelog"
${node}
test no OK"echo
"
${node}
test no OK" delete_key_filebreak
fi
done
}config_diff
(){ writelog"config_diff"
for
nodein
${NODE_LIST}
;do
curl -s --head http://${node}
:8899/index.html | grep"200 OK"
if
[ $? -eq 0 ];then
writelog"
${node}
Web Test OK!"echo
"
${node}
Web Test OK!"else
writelog"
${node}
test no OK"echo
"
${node}
test no OK"break
fi
done
}code_test
(){echo
code_test }cluster_node_remove
(){ writelog$1
}cluster_node_add
(){echo
cluster_node_add }touch_key_file
(){ #創建鎖文件函數,當鎖文件存在則表示腳本在運行,腳本在運行其他人就不能在同一時間再次執行,因此要退出 touch /tmp/deploy.lockecho
"keyfile"
}delete_key_file
(){ #刪除鎖文件的函數 rm -rf /tmp/deploy.lock }rollback
(){if
[ -z$1
];then
delete_key_fileecho
"請輸入參數"
&&exit
3;fi
case
$1
in
list) ls -l /opt/webroot/*.tar.gz ;; *) rollback_funk$1
;esac
}
rollback_funk
(){for
nodein
${ROLLBACK_LIST}
;do
ssh${node}
"rm -f /webroot/web-demo && ln -s /opt/webroot/
$1
/webroot/web-demo"echo
"
${node}
rollback success!"done
}emergency_code_get
(){ writelog"code_get"
cd
${CODE_DIR}
&& git reset --hard HEAD^ /bin/cp -rf${CODE_DIR}
${TMP_DIR}
/ API_VERL=$(git show | grep commit | cut -d' '
-f2) #代碼回滾取到的git版本號 API_VER=$(echo
${API_VERL:0:8}
) }emergency
(){ emergency_code_get code_build; code_config; code_tar; code_scp; cluster_node_remove; pre_deploy; pre_test; group1_deploy; group1_test; config_diff; code_test; delete_key_file }main
(){if
[ -f$LOCK_FILE
];then
echo
"鎖文件已存在,請稍後執行,退出..."
&&exit
10fi
DEPLOY_METHOD=$1
ROLLBACK_VER=$2
case
$DEPLOY_METHOD
in
deploy) touch_key_file code_get; code_build; code_config; code_tar; code_scp; cluster_node_remove; pre_deploy; pre_test; group1_deploy; group1_test; config_diff; code_test; delete_key_file ;; rollback) rollback$ROLLBACK_VER
; ;; emergency) emergency; ;; *) usage;esac
} main$1
$2
/<code>
1.1.3:在git目錄更新代碼:
<code>[www@saltmaster
~]$
cd
web-demo/
[www@saltmaster
~/web-demo]$
cat
index.html
1111111111111111
[www@saltmaster
~/web-demo]$
echo
"2222222222222222"
>>
index.html
[www@saltmaster
~/web-demo]$
git
add
index.html
[www@saltmaster
~/web-demo]$
git
commit
-m
"2222"
[master
ed7227d]
2222
1
file
changed,
1
insertion(+)
[www@saltmaster
~/web-demo]$
git
push
-u
origin
master
Counting objects:
5
,
done.
Delta
compression
using
up
to
2
threads.
Compressing objects:
100
%
(2/2),
done.
Writing objects:
100
%
(3/3),
277
bytes
|
0
bytes/s,
done.
Total
3
(delta
0
),
reused
0
(delta
0
)
To
[email protected]:web/web-demo.git
9de3b67..ed7227d
master
->
master
Branch
master
set
up
to
track
remote
branch
master
from
origin.
/<code>
1.1.4:當前web頁面:
1.2:在jenkins執行構建,默認傳遞的是構建的參數:
1.2.1:驗證當前的web頁面:
1.3:測試緊急回滾到上一版本,在jenkins配置後執行構建:
1.3.1:jenkins執行過程:
1.3.2:訪問web驗證緊急回滾否成功:
1.4:回滾到任意版本:
1.4.1:在哪看回滾到的版本?:
$ ll /deploy/tmp/ #部署服務器,web服務器在nginx定義的目錄查看版本
<code>drwxrwxr-x
2
www
www
102
Aug
18
00
:55
web-demo_b3881163_2016-08-17-15-21-31
-rw-rw-r--
1
www
www
1852
Aug
18
00
:55
web-demo_b3881163_2016-08-17-15-21-31.tar.gz
drwxrwxr-x
2
www
www
102
Aug
18
00
:55
web-demo_b3881163_2016-08-17-19-39-14
-rw-rw-r--
1
www
www
1857
Aug
18
00
:55
web-demo_b3881163_2016-08-17-19-39-14.tar.gz
drwxrwxr-x
2
www
www
102
Aug
18
00
:55
web-demo_e453bdb7_2016-08-17-23-47-59
-rw-rw-r--
1
www
www
1859
Aug
18
00
:55
web-demo_e453bdb7_2016-08-17-23-47-59.tar.gz
drwxrwxr-x
2
www
www
102
Aug
18
00
:55
web-demo_e453bdb7_2016-08-17-23-51-04
-rw-rw-r--
1
www
www
1862
Aug
18
00
:55
web-demo_e453bdb7_2016-08-17-23-51-04.tar.gz
drwxrwxr-x
2
www
www
102
Aug
18
00
:55
web-demo_e453bdb7_2016-08-17-23-51-20
-rw-rw-r--
1
www
www
1859
Aug
18
00
:55
web-demo_e453bdb7_2016-08-17-23-51-20.tar.gz
drwxrwxr-x
2
www
www
102
Aug
18
00
:55
web-demo_e453bdb7_2016-08-17-23-51-23
-rw-rw-r--
1
www
www
1861
Aug
18
00
:55
web-demo_e453bdb7_2016-08-17-23-51-23.tar.gz
drwxrwxr-x
2
www
www
102
Aug
18
00
:55
web-demo_e6e7ee6f_2016-08-18-00-10-11
-rw-rw-r--
1
www
www
1842
Aug
18
00
:55
web-demo_e6e7ee6f_2016-08-18-00-10-11.tar.gz
drwxrwxr-x
2
www
www
102
Aug
18
00
:55
web-demo_ed7227de_2016-08-18-00-35-14
-rw-rw-r--
1
www
www
1839
Aug
18
00
:55
web-demo_ed7227de_2016-08-18-00-35-14.tar.gz
/<code>
1.4.2:回滾任意版本就將版本的參數傳遞給腳本,腳本會將web-demo的鏈接重新指向傳遞的版本(參數),比如我要回滾到web-demo_e453bdb7_2016-08-17-23-51-20這個版本,則jenkins的配置為:
1.4.3:在jenkins執行回滾:
1.4.4:執行回滾的信息:
1.4.5:訪問web界面測試任意版本回滾是否成功: