hello,你們好! 因爲工做緣由,本篇博文遲遲沒有發佈上來,在此深表歉意!因宅鳥做爲一個老鳥,還有不少東西須要和你們分享,因此宅鳥有意將本篇博文做爲Jenkins持續集成自動測試部署系列的收尾之篇,關於這方面的話題,有感興趣的同窗能夠線下交流分享。php
廢話不在多說,本篇是在上篇 基於Jenkins 實現php項目的自動化測試、自動打包和自動部署 基礎上,更深一層更具備實戰性質,徹底是線上環境.本篇有一點難度,若是有看不懂的同窗請從本系列第一篇讀起,若是有條件的同窗能夠本身搭建環境動手試試。因爲本篇須要包含的內容比較多,因此某些細節不會再囉嗦。html
因爲生產環境下網絡拓撲比較複雜,下面宅鳥給出一個簡化版的網路拓撲圖.mysql
若是所示,咱們目前有的資源是分別是:linux
公司內網:nginx
1 svn server 代碼版本庫git
2 jenkins 持續集成服務器web
公司公網服務器資源:sql
webserver1 公網測試服務器shell
webserver2,webserver3公網正式服務器數據庫
db1,db2公網正式db
拿到這些資源咱們該怎麼規劃部署咱們的webapp到這些服務器呢?
咱們以phpweb爲例,假設全部webserver都已經安裝好lnmp環境,dbserver已經安裝好mysql環境
須要注意一點,boss要求全部公網生產服務器必須經過跳板機登陸,而且全部部署到生產服務器的代碼都須要在svn源碼庫和線上服務器上都有歷史記錄,一旦程序發佈後,有問題,能夠方便回滾到以前穩定版本。
在這種清空下,咱們該如何規劃部署咱們的程序呢?
下面宅鳥給出本身的解決方案:(本例以cms系統爲例)
一、在Jenkins系統中建立一個deploy_cmsv4_to_dev的job,在該jobs配置中添加svn源代碼地址,經過自動化單元集成測試後,打包,而後經過Jenkins發佈到測試服務器webserver1上,而後再進行人工測試,肯定無誤後,再在jenkins上給本次構建打tag,並在tag上註明版本日期等。
二、在Jenkins系統中再建立一個deploy_cmsv4_to_production的項目,該job發佈時,引用剛已在deploy_cmsv4_to_dev的job中已經打好的tag,而後經過Jenkins把程序打包經過ssh上傳到指定目錄,而後經過跳板機把程序包發佈到正式公網服務器(跳板機上須要安裝自動化部署工具ansible,進行實現批量部署功能)。
關於ansible的安裝在此不作詳解。有感興趣的同窗可點擊這裏,但須要注意的是須要配置好跳板機到公網上服務器上ssh免密碼登陸,以及在ansible的配置中添加公網webServerIp地址列表.
這裏只作技術交流與分享,本篇涉及到公司公網ip地址以及涉及商業機密的地方均使用畫圖工具遮蓋,給各位同窗帶來不閱讀不便,深表歉意!
下面開始宅鳥的部署之旅:
第一步開始建立一個自由風格的到測試服務器上的job:deploy-cmsv4-to-dev ,進入配置界面 如圖:
在源碼管理下選擇Subversion:
添加上項目svn地址如圖:
而後在增長構建步驟中選擇Invoke Phing targets:
添加自動測試和打包的target,target名稱對應項目根目錄下的build.xml文件
而後在 增長構建步驟 中選擇 Send files or execute commands over SSh:
最後 在 增長構建後操做步驟 中 選擇:Archive the artifacts 存檔打包文件:
配置完畢後,咱們就能夠構建本job.
點擊左上側「當即構建」:
咱們就能夠看到一個job開始執行,完畢後查看查看控制檯輸出結果如圖所示:
而後登陸測試服務器webserver1上到發佈的目錄下查看是結果如圖:
注意:last本次發佈上一個版本
該項目中全部的配置文件(包括db,webapp,crontab,nginx等)均使用軟連從程序目錄config下連接過來的.
如圖展現數據庫遷移的配置文件的連接,其它配置文件亦是如此,不在囉嗦.
下面來看一下程序發佈的歷史版本列表:
到此,公網測試服務器web程序發佈完畢,而後就進入人工測試,測試經過後,就能夠在jenkins服務器上給本次構建打tag而後就能夠發到公網服務器了。
在jenkins上給job打tag此處略去,給你們看一下宅鳥以前在發佈程序時所打過的tag,以下圖所示,右邊顯示標記的表示已打tag。
下面咱們開始介紹公網服務器程序的發佈過程:
第一步、建一個自由風格的job名字爲deploy-cmsv4-to-production
在job配置中選中"構建化參數過程"複選框
選擇 List Subversion tags(and more),而後填寫svn地址等以下信息
而後再添加一個choice ,添加咱們須要部署的服務器組,該地方的組名稱須要在 跳板機的ansible配置文件中指定,而且給部署組指定一組webserver ip列表
注:Choices能夠添加多個服務器組(在ansible中指定,這裏咱們在cms_app_servers名稱下指定了三臺linux服務器作爲webserver).
在源代碼管理中填寫以下配置:
下面再增長打包targets:
再添加發布步驟: 選擇 "send file or execute commands over SSH"
最後存檔:
到此,生產服務器部署配置已經完成,下面就能夠發佈了。
選擇Jenkins左上方的 "Build with Parameters"
如圖顯示,上面的下拉菜單是 咱們已經打好的tag列表,下面是部署服務器羣組列表:
而後點擊"開始構建" jenkins就會按照咱們事配置好的項,開始發佈web程序了。
在控制檯輸出信息中最後一行出現「Finished: SUCCESS」,表示發佈已經成功。這樣咱們能夠登陸到生產服務器上查看咱們已發佈的程序。
數據庫升遷版本列表: 關於mysql遷移 不熟悉的同窗可參看 宅鳥的另外一篇博文:Mysql遷移工具在生產環境下的使用
咱們經過跳板機到服務器下去:
先登陸到cms-app-1,而後到網站目錄下查看經過ls -l |grep cmsv4命令查看結果如圖:
登陸到cms-app-2,結果同cms-app-1如圖:
咱們再檢查一下nginx的配置:
再登陸到cms-app-3 結果亦然,至此咱們的程序已經發布完畢。
仔細閱讀的同窗可能已經注意到在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}
這個config文件夾下的install.sh腳本,是宅鳥根據本身公司的業務要求邏輯本身編寫的,有興趣的同窗能夠本身試着根據本身公司的業務需求本身編寫以實現需求。
在此宅鳥給出一個install的簡單實例(假設咱們的項目名爲myweb):
#!/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 #項目配置文件 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 #初始化數據庫,若是數據庫不存在則自動建立 /usr/bin/php $myweb_path/mysqlMigrations/migrate.php init if [ $? -ne 0 ];then echo "db version table init:"$? exit 1 fi #列出線上數據庫版本 /usr/bin/php $myweb_path/mysqlMigrations/migrate.php list if [ $? -ne 0 ];then echo "db version list:"$? exit 1 fi #更新數據庫到最大版本 /usr/bin/php $myweb_path/mysqlMigrations/migrate.php up $db_version if [ $? -ne 0 ];then echo "db update:"$? exit 1 fi #查看遷升後數據庫版本列表,及當前數據庫版本 /usr/bin/php $myweb_path/mysqlMigrations/migrate.php list #web切換,給老版本更名,而且新版本程序接手老版本程序開始工做 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 #賦權限 chown -R www-data:www-data $myweb_path #從新加載php5-fpm /etc/init.d/php5-fpm reload #nginx應用新配置 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 #刪除臨時文件 rm -rf /tmp/myweb.* echo "/tmp/myweb.* rm -rf:"$?
好了,關於宅鳥的部署系列博文到此告一段落。還有更多關於持續集成發佈以及jenkins與git的集成等方面的話題,有機會再聊一聊。
對支持宅鳥的讀者,宅鳥在此表示感謝!歡迎關注宅鳥博客下一系列關於nginx方面的話題!