hello,大家好! 由于工作原因,本篇博文遲遲沒(méi)有發(fā)布上來(lái),在此深表歉意!因宅鳥作為一個(gè)老鳥,還有很多東西需要和大家分享,所以宅鳥有意將本篇博文作為Jenkins持續(xù)集成自動(dòng)測(cè)試部署系列的收尾之篇,關(guān)于這方面的話題,有感興趣的同學(xué)可以線下交流分享。
廢話不在多說(shuō),本篇是在上篇 基于Jenkins 實(shí)現(xiàn)php項(xiàng)目的自動(dòng)化測(cè)試、自動(dòng)打包和自動(dòng)部署 基礎(chǔ)上,更深一層更具有實(shí)戰(zhàn)性質(zhì),完全是線上環(huán)境.本篇有一點(diǎn)難度,如果有看不懂的同學(xué)請(qǐng)從本系列第一篇讀起,如果有條件的同學(xué)可以自己搭建環(huán)境動(dòng)手試試。由于本篇需要包含的內(nèi)容比較多,所以某些細(xì)節(jié)不會(huì)再啰嗦。
由于生產(chǎn)環(huán)境下網(wǎng)絡(luò)拓?fù)浔容^復(fù)雜,下面宅鳥給出一個(gè)簡(jiǎn)化版的網(wǎng)路拓?fù)鋱D.
如果所示,我們目前有的資源是分別是:
公司內(nèi)網(wǎng):
1 svn server 代碼版本庫(kù)
2 jenkins 持續(xù)集成服務(wù)器
公司公網(wǎng)服務(wù)器資源:
webserver1 公網(wǎng)測(cè)試服務(wù)器
webserver2,webserver3公網(wǎng)正式服務(wù)器
db1,db2公網(wǎng)正式db
拿到這些資源我們?cè)撛趺匆?guī)劃部署我們的webapp到這些服務(wù)器呢?
我們以phpweb為例,假設(shè)所有webserver都已經(jīng)安裝好lnmp環(huán)境,dbserver已經(jīng)安裝好mysql環(huán)境
需要注意一點(diǎn),boss要求所有公網(wǎng)生產(chǎn)服務(wù)器必須通過(guò)跳板機(jī)登錄,并且所有部署到生產(chǎn)服務(wù)器的代碼都需要在svn源碼庫(kù)和線上服務(wù)器上都有歷史記錄,一旦程序發(fā)布后,有問(wèn)題,可以方便回滾到之前穩(wěn)定版本。
在這種清空下,我們?cè)撊绾我?guī)劃部署我們的程序呢?
下面宅鳥給出自己的解決方案:(本例以cms系統(tǒng)為例)
1、在Jenkins系統(tǒng)中創(chuàng)建一個(gè)deploy_cmsv4_to_dev的job,在該jobs配置中添加svn源代碼地址,通過(guò)自動(dòng)化單元集成測(cè)試后,打包,然后通過(guò)Jenkins發(fā)布到測(cè)試服務(wù)器webserver1上,然后再進(jìn)行人工測(cè)試,確定無(wú)誤后,再在jenkins上給本次構(gòu)建打tag,并在tag上注明版本日期等。
2、在Jenkins系統(tǒng)中再創(chuàng)建一個(gè)deploy_cmsv4_to_production的項(xiàng)目,該job發(fā)布時(shí),引用剛已在deploy_cmsv4_to_dev的job中已經(jīng)打好的tag,然后通過(guò)Jenkins把程序打包通過(guò)ssh上傳到指定目錄,然后通過(guò)跳板機(jī)把程序包發(fā)布到正式公網(wǎng)服務(wù)器(跳板機(jī)上需要安裝自動(dòng)化部署工具ansible,進(jìn)行實(shí)現(xiàn)批量部署功能)。
關(guān)于ansible的安裝在此不做詳解。有感興趣的同學(xué)可點(diǎn)擊這里,但需要注意的是需要配置好跳板機(jī)到公網(wǎng)上服務(wù)器上ssh免密碼登錄,以及在ansible的配置中添加公網(wǎng)webServerIp地址列表.
這里只做技術(shù)交流與分享,本篇涉及到公司公網(wǎng)ip地址以及涉及商業(yè)機(jī)密的地方均使用畫圖工具遮蓋,給各位同學(xué)帶來(lái)不閱讀不便,深表歉意!
下面開(kāi)始宅鳥的部署之旅:
第一步開(kāi)始創(chuàng)建一個(gè)自由風(fēng)格的到測(cè)試服務(wù)器上的job:deploy-cmsv4-to-dev ,進(jìn)入配置界面 如圖:
在源碼管理下選擇Subversion:
添加上項(xiàng)目svn地址如圖:
然后在增加構(gòu)建步驟中選擇Invoke Phing targets:
添加自動(dòng)測(cè)試和打包的target,target名稱對(duì)應(yīng)項(xiàng)目根目錄下的build.xml文件
然后在 增加構(gòu)建步驟 中選擇 Send files or execute commands over SSh:
最后 在 增加構(gòu)建后操作步驟 中 選擇:Archive the artifacts 存檔打包文件:
配置完畢后,我們就可以構(gòu)建本job.
點(diǎn)擊左上側(cè)“立即構(gòu)建”:
我們就可以看到一個(gè)job開(kāi)始執(zhí)行,完畢后查看查看控制臺(tái)輸出結(jié)果如圖所示:
然后登錄測(cè)試服務(wù)器webserver1上到發(fā)布的目錄下查看是結(jié)果如圖:
注意:last本次發(fā)布上一個(gè)版本
該項(xiàng)目中所有的配置文件(包括db,webapp,crontab,nginx等)均使用軟連從程序目錄config下鏈接過(guò)來(lái)的.
如圖展示數(shù)據(jù)庫(kù)遷移的配置文件的鏈接,其它配置文件亦是如此,不在啰嗦.
下面來(lái)看一下程序發(fā)布的歷史版本列表:
到此,公網(wǎng)測(cè)試服務(wù)器web程序發(fā)布完畢,然后就進(jìn)入人工測(cè)試,測(cè)試通過(guò)后,就可以在jenkins服務(wù)器上給本次構(gòu)建打tag然后就可以發(fā)到公網(wǎng)服務(wù)器了。
在jenkins上給job打tag此處略去,給大家看一下宅鳥之前在發(fā)布程序時(shí)所打過(guò)的tag,如下圖所示,右邊顯示
下面我們開(kāi)始介紹公網(wǎng)服務(wù)器程序的發(fā)布過(guò)程:
第一步、建一個(gè)自由風(fēng)格的job名字為deploy-cmsv4-to-production
在job配置中選中"構(gòu)建化參數(shù)過(guò)程"復(fù)選框
選擇 List Subversion tags(and more),然后填寫svn地址等如下信息
然后再添加一個(gè)choice ,添加我們需要部署的服務(wù)器組,該地方的組名稱需要在 跳板機(jī)的ansible配置文件中指定,并且給部署組指定一組webserver ip列表
注:Choices可以添加多個(gè)服務(wù)器組(在ansible中指定,這里我們?cè)赾ms_app_servers名稱下指定了三臺(tái)linux服務(wù)器做為webserver).
在源代碼管理中填寫如下配置:
下面再增加打包targets:
再添加發(fā)布步驟: 選擇 "send file or execute commands over SSH"
最后存檔:
到此,生產(chǎn)服務(wù)器部署配置已經(jīng)完成,下面就可以發(fā)布了。
選擇Jenkins左上方的 "Build with Parameters"
如圖顯示,上面的下拉菜單是 我們已經(jīng)打好的tag列表,下面是部署服務(wù)器群組列表:
然后點(diǎn)擊"開(kāi)始構(gòu)建" jenkins就會(huì)按照我們事配置好的項(xiàng),開(kāi)始發(fā)布web程序了。
在控制臺(tái)輸出信息中最后一行出現(xiàn)“Finished: SUCCESS”,表示發(fā)布已經(jīng)成功。這樣我們可以登錄到生產(chǎn)服務(wù)器上查看我們已發(fā)布的程序。
數(shù)據(jù)庫(kù)升遷版本列表: 關(guān)于mysql遷移 不熟悉的同學(xué)可參看 宅鳥的另一篇博文:Mysql遷移工具在生產(chǎn)環(huán)境下的使用
我們通過(guò)跳板機(jī)到服務(wù)器下去:
先登錄到cms-app-1,然后到網(wǎng)站目錄下查看通過(guò)ls -l |grep cmsv4命令查看結(jié)果如圖:
登錄到cms-app-2,結(jié)果同cms-app-1如圖:
我們?cè)贆z查一下nginx的配置:
再登錄到cms-app-3 結(jié)果亦然,至此我們的程序已經(jīng)發(fā)布完畢。
仔細(xì)閱讀的同學(xué)可能已經(jīng)注意到在deploy-cmsv4-to-dev&deploy-cmsv4-to-production -> configure "Send files or execute commands over SSH"的"Exec command" 文本列表最后一條shell命令:
cmsv4.${BUILD_NUMBER}.${BUILD_ID}/config/install.sh ${BUILD_NUMBER} ${BUILD_ID}
這個(gè)config文件夾下的install.sh腳本,是宅鳥根據(jù)自己公司的業(yè)務(wù)要求邏輯自己編寫的,有興趣的同學(xué)可以自己試著根據(jù)自己公司的業(yè)務(wù)需求自己編寫以實(shí)現(xiàn)需求。
在此宅鳥給出一個(gè)install的簡(jiǎn)單實(shí)例(假設(shè)我們的項(xiàng)目名為myweb):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 | #!/bin/bash #created by lihuibin #date 2014-01-15 #deploy web app to production install script build_number=$1 build_id=$2 db_version= "max_version" myweb_path= /webdir/myweb/myweb .$build_number.$build_id #項(xiàng)目配置文件 config_path=$myweb_path /config .php ln -s $myweb_path /config/config .php $config_path #crontab ln -s $myweb_path /config/crontab .txt /etc/cron .d /myweb #初始化數(shù)據(jù)庫(kù),如果數(shù)據(jù)庫(kù)不存在則自動(dòng)創(chuàng)建 /usr/bin/php $myweb_path /mysqlMigrations/migrate .php init if [ $? - ne 0 ]; then echo "db version table init:" $? exit 1 fi #列出線上數(shù)據(jù)庫(kù)版本 /usr/bin/php $myweb_path /mysqlMigrations/migrate .php list if [ $? - ne 0 ]; then echo "db version list:" $? exit 1 fi #更新數(shù)據(jù)庫(kù)到最大版本 /usr/bin/php $myweb_path /mysqlMigrations/migrate .php up $db_version if [ $? - ne 0 ]; then echo "db update:" $? exit 1 fi #查看遷升后數(shù)據(jù)庫(kù)版本列表,及當(dāng)前數(shù)據(jù)庫(kù)版本 /usr/bin/php $myweb_path /mysqlMigrations/migrate .php list #web切換,給老版本改名,并且新版本程序接手老版本程序開(kāi)始工作 web_path= "/htdocs/myweb" uploads= '/webdir/myweb/uploaded' if [ -L $web_path ]; then ln -sfn $(readlink -f "/htdocs/myweb" ) "/htdocs/myweb_last" ln -sfn $myweb_path $web_path echo "$myweb_path $web_path ln -s :" $? else if [ -d $web_path ]; then mv -f $web_path "/uploaded" $uploads mv -f $web_path "/webdir/myweb/myweb_lagacy" ln -sfn $myweb_path $web_path ln -sfn "/webdir/myweb/myweb_lagacy" "/htdocs/myweb_last" else ln -s $myweb_path $web_path if [ ! -d "$uploads" ]; then mkdir -p $uploads chown -R www-data:www-data $uploads fi fi fi ln -s $uploads $myweb_path /uploaded #賦權(quán)限 chown -R www-data:www-data $myweb_path #重新加載php5-fpm /etc/init .d /php5-fpm reload #nginx應(yīng)用新配置 nginx= /etc/nginx/sites-enabled/myweb .conf if [ -f $nginx ]; then rm $nginx fi ln -s $myweb_path /config/myweb .conf $nginx #nginx加載新配置 /etc/init .d /nginx reload #刪除臨時(shí)文件 rm -rf /tmp/myweb .* echo "/tmp/myweb.* rm -rf:" $? |
好了,關(guān)于宅鳥的部署系列博文到此告一段落。還有更多關(guān)于持續(xù)集成發(fā)布以及jenkins與git的集成等方面的話題,有機(jī)會(huì)再聊一聊。
對(duì)支持宅鳥的讀者,宅鳥在此表示感謝!歡迎關(guān)注宅鳥博客下一系列關(guān)于nginx方面的話題!
本文出自 “宅鳥樂(lè)園” 博客,請(qǐng)務(wù)必保留此出處http://birdinroom.blog.51cto.com/7740375/1351875
聯(lián)系客服