jenkins結合腳本實現代碼自動化部署及一鍵回滾至上一版本

一:本文通過jenkins調用shell腳本的的方式完成從Git服務器獲取代碼、打包、部署到web服務器、將web服務器從負載均衡器刪除、解壓、複製配置文件、創建軟連接、測試每一臺web服務器、將web服務器添加至負載均衡、回滾到任意指定版本、一鍵回滾到上一版本等功能,腳本放在www用戶家目錄並使用www用戶身份執行,每個web服務器也都使用www用戶運行web服務,且UID相同web目錄和權限都一致,更嚴格的標準化可以帶來更安全的生產環境和更高的效率:


1.1:在jenkins項目配置中調用shell腳本與環境準備:

1.1.1:#jenkins-項目-配置:

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

node

in

${PRE_LIST}

;

do

scp

${TMP_DIR}

/

${PKG_NAME}

.tar.gz

$node

:/opt/webroot

done

for

node

in

${GROUP1_LIST}

;

do

scp

${TMP_DIR}

/

${PKG_NAME}

.tar.gz

$node

:/opt/webroot

done

}

cluster_node_remove

(){ writelog

"cluster_node_remove"

}

pre_deploy

(){ writelog

"code_deploy"

for

node

in

${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

node

in

${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_file

break

fi

done

}

group1_deploy

(){ writelog

"code_deploy"

for

node

in

${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

node

in

${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_file

break

fi

done

}

config_diff

(){ writelog

"config_diff"

for

node

in

${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.lock

echo

"keyfile"

}

delete_key_file

(){ #刪除鎖文件的函數 rm -rf /tmp/deploy.lock }

rollback

(){

if

[ -z

$1

];

then

delete_key_file

echo

"請輸入參數"

&&

exit

3;

fi

case

$1

in

list) ls -l /opt/webroot/*.tar.gz ;; *) rollback_funk

$1

;

esac

}

rollback_funk

(){

for

node

in

${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

10

fi

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頁面:

jenkins結合腳本實現代碼自動化部署及一鍵回滾至上一版本

1.2:在jenkins執行構建,默認傳遞的是構建的參數:

jenkins結合腳本實現代碼自動化部署及一鍵回滾至上一版本

1.2.1:驗證當前的web頁面:

jenkins結合腳本實現代碼自動化部署及一鍵回滾至上一版本

1.3:測試緊急回滾到上一版本,在jenkins配置後執行構建:

jenkins結合腳本實現代碼自動化部署及一鍵回滾至上一版本

1.3.1:jenkins執行過程:

jenkins結合腳本實現代碼自動化部署及一鍵回滾至上一版本

1.3.2:訪問web驗證緊急回滾否成功:

jenkins結合腳本實現代碼自動化部署及一鍵回滾至上一版本

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的配置為:

jenkins結合腳本實現代碼自動化部署及一鍵回滾至上一版本

1.4.3:在jenkins執行回滾:

jenkins結合腳本實現代碼自動化部署及一鍵回滾至上一版本

1.4.4:執行回滾的信息:

jenkins結合腳本實現代碼自動化部署及一鍵回滾至上一版本

1.4.5:訪問web界面測試任意版本回滾是否成功:

jenkins結合腳本實現代碼自動化部署及一鍵回滾至上一版本


分享到:


相關文章: