基於jenkins結合svn、ansible、shell和mysql版本遷移實現多服務器批量發佈

hello,你們好! 因爲工做緣由,本篇博文遲遲沒有發佈上來,在此深表歉意!因宅鳥做爲一個老鳥,還有不少東西須要和你們分享,因此宅鳥有意將本篇博文做爲Jenkins持續集成自動測試部署系列的收尾之篇,關於這方面的話題,有感興趣的同窗能夠線下交流分享。php

廢話不在多說,本篇是在上篇 基於Jenkins 實現php項目的自動化測試、自動打包和自動部署 基礎上,更深一層更具備實戰性質,徹底是線上環境.本篇有一點難度,若是有看不懂的同窗請從本系列第一篇讀起,若是有條件的同窗能夠本身搭建環境動手試試。因爲本篇須要包含的內容比較多,因此某些細節不會再囉嗦。html


因爲生產環境下網絡拓撲比較複雜,下面宅鳥給出一個簡化版的網路拓撲圖.mysql

wKiom1LU7oDQweUTAAD41jMNR-s511.jpg


若是所示,咱們目前有的資源是分別是: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 ,進入配置界面 如圖:



wKioL1LVEnHxsUH9AAF4entEkCk790.jpg



在源碼管理下選擇Subversion:

添加上項目svn地址如圖:

wKioL1LVEs6iRY7GAAD5qDciY8k475.jpg


而後在增長構建步驟中選擇Invoke Phing targets:

添加自動測試和打包的target,target名稱對應項目根目錄下的build.xml文件

wKiom1LVFH2wtbp5AAJzP9cqPT8178.jpg


而後在 增長構建步驟 中選擇 Send files or execute commands over SSh:


wKioL1LVFWbR8XxpAALgp3MgrmM146.jpg


最後 在 增長構建後操做步驟 中 選擇:Archive the artifacts  存檔打包文件:

wKioL1LVFgSDDCGsAACDC0F7rkc821.jpg

配置完畢後,咱們就能夠構建本job.

點擊左上側「當即構建」:

咱們就能夠看到一個job開始執行,完畢後查看查看控制檯輸出結果如圖所示:


wKioL1LV6MuzwRMVAAM7OE-vuZ8665.jpg


而後登陸測試服務器webserver1上到發佈的目錄下查看是結果如圖:

注意:last本次發佈上一個版本

wKioL1LV6d-w12OhAAC2HAke9v4866.jpg


該項目中全部的配置文件(包括db,webapp,crontab,nginx等)均使用軟連從程序目錄config下連接過來的.

如圖展現數據庫遷移的配置文件的連接,其它配置文件亦是如此,不在囉嗦.

wKiom1LV7Ofi9hVtAACaxxfLB_4839.jpg



下面來看一下程序發佈的歷史版本列表:

wKiom1LV7miRCSPEAAFdI15tDmA992.jpg


到此,公網測試服務器web程序發佈完畢,而後就進入人工測試,測試經過後,就能夠在jenkins服務器上給本次構建打tag而後就能夠發到公網服務器了。

在jenkins上給job打tag此處略去,給你們看一下宅鳥以前在發佈程序時所打過的tag,以下圖所示,右邊顯示wKioL1LV8SfDpci1AAAFzTr63FA762.jpg標記的表示已打tag。


wKioL1LV8NOxwd9EAADHgOnjPlk767.jpg



下面咱們開始介紹公網服務器程序的發佈過程:

第一步、建一個自由風格的job名字爲deploy-cmsv4-to-production

在job配置中選中"構建化參數過程"複選框

wKioL1LV9NWS7JLKAAC_9_r3YP0040.jpg

選擇 List Subversion tags(and more),而後填寫svn地址等以下信息

wKioL1LV9R7CkHysAAFY6VS59x8954.jpg



而後再添加一個choice ,添加咱們須要部署的服務器組,該地方的組名稱須要在 跳板機的ansible配置文件中指定,而且給部署組指定一組webserver ip列表

wKioL1LV-zvgPxQiAACfujrbt6w027.jpg



wKioL1LV-8vQUCZFAAA7zp-0VTM770.jpg

注:Choices能夠添加多個服務器組(在ansible中指定,這裏咱們在cms_app_servers名稱下指定了三臺linux服務器作爲webserver).



在源代碼管理中填寫以下配置:


wKiom1LV9dvxpMOIAADODbK-H3A731.jpg

下面再增長打包targets:

wKiom1LV9iWyt6_mAAElYmkQIJQ627.jpg



再添加發布步驟: 選擇 "send file or execute commands over SSH"

wKioL1LV-jjgo2xKAAECAgm4Uyc373.jpg


wKiom1LV-nqzcB8VAANpFSRrFxM146.jpg


最後存檔:

wKioL1LV_U_zDs6pAAHTOalpAwE289.jpg


wKiom1LV_XbCqYkdAABjJ3u1D8U094.jpg

到此,生產服務器部署配置已經完成,下面就能夠發佈了。

選擇Jenkins左上方的 "Build with Parameters"

如圖顯示,上面的下拉菜單是 咱們已經打好的tag列表,下面是部署服務器羣組列表:

wKiom1LWAhbzz8oXAAEYLwxr8Y4177.jpg


而後點擊"開始構建" jenkins就會按照咱們事配置好的項,開始發佈web程序了。

在控制檯輸出信息中最後一行出現「Finished: SUCCESS」,表示發佈已經成功。這樣咱們能夠登陸到生產服務器上查看咱們已發佈的程序。


數據庫升遷版本列表: 關於mysql遷移 不熟悉的同窗可參看 宅鳥的另外一篇博文:Mysql遷移工具在生產環境下的使用


wKioL1LWKF2gZXVfAAMNrow_qj0134.jpg


wKiom1LWBbHgpm_VAAMuKb3ZuXk866.jpg



咱們經過跳板機到服務器下去:

先登陸到cms-app-1,而後到網站目錄下查看經過ls -l |grep cmsv4命令查看結果如圖:

wKioL1LWB-yDeFv0AACIu-B25xU255.jpg


登陸到cms-app-2,結果同cms-app-1如圖:

wKiom1LWCCyRCC3FAACcO-WXAhM917.jpg


咱們再檢查一下nginx的配置:

wKioL1LWCVCBpTK1AACN76K-JMc749.jpg

再登陸到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方面的話題!

相關文章
相關標籤/搜索