设为首页 收藏本站
查看: 2861|回复: 1

[Devops] 基于jenkins结合svn、ansible、shell和mysql版本迁移实现多服务器批量发布

[复制链接]
累计签到:2 天
连续签到:1 天
发表于 2018-7-31 06:50:19 | 显示全部楼层 |阅读模式
  hello,大家好! 由于工作原因,本篇博文迟迟没有发布上来,在此深表歉意!因宅鸟作为一个老鸟,还有很多东西需要和大家分享,所以宅鸟有意将本篇博文作为Jenkins持续集成自动测试部署系列的收尾之篇,关于这方面的话题,有感兴趣的同学可以线下交流分享。
  废话不在多说,本篇是在上篇 基于Jenkins 实现php项目的自动化测试、自动打包和自动部署 基础上,更深一层更具有实战性质,完全是线上环境.本篇有一点难度,如果有看不懂的同学请从本系列第一篇读起,如果有条件的同学可以自己搭建环境动手试试。由于本篇需要包含的内容比较多,所以某些细节不会再啰嗦。
  由于生产环境下网络拓扑比较复杂,下面宅鸟给出一个简化版的网路拓扑图.
DSC0000.jpg

  如果所示,我们目前有的资源是分别是:
  公司内网:
  1 svn server 代码版本库
  2 jenkins 持续集成服务器
  公司公网服务器资源:
  webserver1 公网测试服务器
  webserver2,webserver3公网正式服务器
  db1,db2公网正式db
  拿到这些资源我们该怎么规划部署我们的webapp到这些服务器呢?
  我们以phpweb为例,假设所有webserver都已经安装好lnmp环境,dbserver已经安装好mysql环境
  需要注意一点,boss要求所有公网生产服务器必须通过跳板机登录,并且所有部署到生产服务器的代码都需要在svn源码库和线上服务器上都有历史记录,一旦程序发布后,有问题,可以方便回滚到之前稳定版本
  在这种清空下,我们该如何规划部署我们的程序呢?
  下面宅鸟给出自己的解决方案:(本例以cms系统为例)
  1、在Jenkins系统中创建一个deploy_cmsv4_to_dev的job,在该jobs配置中添加svn源代码地址,通过自动化单元集成测试后,打包,然后通过Jenkins发布到测试服务器webserver1上,然后再进行人工测试,确定无误后,再在jenkins上给本次构建打tag,并在tag上注明版本日期等。
  2、在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 ,进入配置界面 如图:
DSC0001.jpg

  在源码管理下选择Subversion:
  添加上项目svn地址如图:
DSC0002.jpg

  然后在增加构建步骤中选择Invoke Phing targets:
  添加自动测试和打包的target,target名称对应项目根目录下的build.xml文件
DSC0003.jpg

  然后在 增加构建步骤 中选择 Send files or execute commands over SSh:
DSC0004.jpg

  最后 在 增加构建后操作步骤 中 选择:Archive the artifacts  存档打包文件:
DSC0005.jpg

  配置完毕后,我们就可以构建本job.
  点击左上侧“立即构建”:
  我们就可以看到一个job开始执行,完毕后查看查看控制台输出结果如图所示:
DSC0006.jpg

  然后登录测试服务器webserver1上到发布的目录下查看是结果如图:
  注意:last本次发布上一个版本
DSC0007.jpg

  该项目中所有的配置文件(包括db,webapp,crontab,nginx等)均使用软连从程序目录config下链接过来的.
  如图展示数据库迁移的配置文件的链接,其它配置文件亦是如此,不在啰嗦.
DSC0008.jpg

  下面来看一下程序发布的历史版本列表:
DSC0009.jpg

  到此,公网测试服务器web程序发布完毕,然后就进入人工测试,测试通过后,就可以在jenkins服务器上给本次构建打tag然后就可以发到公网服务器了。
  在jenkins上给job打tag此处略去,给大家看一下宅鸟之前在发布程序时所打过的tag,如下图所示,右边显示 DSC00010.jpg 标记的表示已打tag。
DSC00011.jpg

  下面我们开始介绍公网服务器程序的发布过程:
  第一步、建一个自由风格的job名字为deploy-cmsv4-to-production
  在job配置中选中"构建化参数过程"复选框
DSC00012.jpg

  选择 List Subversion tags(and more),然后填写svn地址等如下信息
DSC00013.jpg

  然后再添加一个choice ,添加我们需要部署的服务器组,该地方的组名称需要在 跳板机的ansible配置文件中指定,并且给部署组指定一组webserver ip列表
DSC00014.jpg

DSC00015.jpg

  注:Choices可以添加多个服务器组(在ansible中指定,这里我们在cms_app_servers名称下指定了三台linux服务器做为webserver).
  在源代码管理中填写如下配置:
DSC00016.jpg

  下面再增加打包targets:
DSC00017.jpg

  再添加发布步骤: 选择 "send file or execute commands over SSH"
DSC00018.jpg

DSC00019.jpg

  最后存档:
DSC00020.jpg

DSC00021.jpg

  到此,生产服务器部署配置已经完成,下面就可以发布了。
  选择Jenkins左上方的 "Build with Parameters"
  如图显示,上面的下拉菜单是 我们已经打好的tag列表,下面是部署服务器群组列表:
DSC00022.jpg

  然后点击"开始构建" jenkins就会按照我们事配置好的项,开始发布web程序了。
  在控制台输出信息中最后一行出现“Finished: SUCCESS”,表示发布已经成功。这样我们可以登录到生产服务器上查看我们已发布的程序。
  数据库升迁版本列表: 关于mysql迁移 不熟悉的同学可参看 宅鸟的另一篇博文:Mysql迁移工具在生产环境下的使用
DSC00023.jpg

DSC00024.jpg

  我们通过跳板机到服务器下去:
  先登录到cms-app-1,然后到网站目录下查看通过ls -l |grep cmsv4命令查看结果如图:
DSC00025.jpg

  登录到cms-app-2,结果同cms-app-1如图:
DSC00026.jpg

  我们再检查一下nginx的配置:
DSC00027.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>  
#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>  
#删除临时文件
  
rm -rf /tmp/myweb.*
  
echo "/tmp/myweb.* rm -rf:"$?
  好了,关于宅鸟的部署系列博文到此告一段落。还有更多关于持续集成发布以及jenkins与git的集成等方面的话题,有机会再聊一聊。
  对支持宅鸟的读者,宅鸟在此表示感谢!欢迎关注宅鸟博客下一系列关于nginx方面的话题!

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-543774-1-1.html 上篇帖子: RabbitMq在有限资源下使系统性能从容倍增 下篇帖子: 帖子失效
累计签到:73 天
连续签到:1 天
发表于 2019-1-26 23:11:36 | 显示全部楼层
好东西啊,多谢楼主

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表