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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介:

hello,大家好! 由于工作原因,本篇博文迟迟没有发布上来,在此深表歉意!因宅鸟作为一个老鸟,还有很多东西需要和大家分享,所以宅鸟有意将本篇博文作为Jenkins持续集成自动测试部署系列的收尾之篇,关于这方面的话题,有感兴趣的同学可以线下交流分享。

废话不在多说,本篇是在上篇 基于Jenkins 实现php项目的自动化测试、自动打包和自动部署 基础上,更深一层更具有实战性质,完全是线上环境.本篇有一点难度,如果有看不懂的同学请从本系列第一篇读起,如果有条件的同学可以自己搭建环境动手试试。由于本篇需要包含的内容比较多,所以某些细节不会再啰嗦。


由于生产环境下网络拓扑比较复杂,下面宅鸟给出一个简化版的网路拓扑图.

wKiom1LU7oDQweUTAAD41jMNR-s511.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 ,进入配置界面 如图:



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):

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
#项目配置文件
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的集成等方面的话题,有机会再聊一聊。



本文转自birdinroom 51CTO博客,原文链接:http://blog.51cto.com/birdinroom/1351875,如需转载请自行联系原作者

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
5月前
|
运维 应用服务中间件 网络安全
自动化运维的新篇章:使用Ansible进行服务器配置管理
【10月更文挑战第34天】在现代IT基础设施的快速迭代中,自动化运维成为提升效率、确保一致性的关键手段。本文将通过介绍Ansible工具的使用,展示如何实现高效的服务器配置管理。从基础安装到高级应用,我们将一步步揭开自动化运维的神秘面纱,让你轻松掌握这一技术,为你的运维工作带来革命性的变化。
|
5月前
|
运维 Prometheus 监控
如何在测试环境中保持操作系统、浏览器版本和服务器配置的稳定性和一致性?
如何在测试环境中保持操作系统、浏览器版本和服务器配置的稳定性和一致性?
|
4月前
|
运维 Ubuntu 应用服务中间件
自动化运维之路:使用Ansible进行服务器管理
在现代IT基础设施中,自动化运维已成为提高效率和可靠性的关键。本文将引导您通过使用Ansible这一强大的自动化工具来简化日常的服务器管理任务。我们将一起探索如何配置Ansible、编写Playbook以及执行自动化任务,旨在为读者提供一条清晰的路径,从而步入自动化运维的世界。
104 11
|
4月前
|
运维 网络安全 Python
自动化运维:使用Ansible实现批量服务器配置
在快速迭代的IT环境中,高效、可靠的服务器管理变得至关重要。本文将介绍如何使用Ansible这一强大的自动化工具,来简化和加速批量服务器配置过程。我们将从基础开始,逐步深入到更复杂的应用场景,确保即使是新手也能跟上节奏。文章将不包含代码示例,而是通过清晰的步骤和逻辑结构,引导读者理解自动化运维的核心概念及其在实际操作中的应用。
|
4月前
|
运维 Ubuntu 网络协议
自动化运维:使用Ansible进行服务器配置管理
在现代IT架构中,自动化运维已成为提升效率、减少人为错误的关键。本文将介绍如何使用Ansible这一强大的自动化工具来简化和标准化服务器的配置管理过程。通过具体的代码示例和操作步骤,我们将展示如何快速部署应用、管理配置以及自动化日常任务,从而确保环境的一致性和可靠性。
|
5月前
|
运维 安全 Ubuntu
自动化运维:使用Ansible进行服务器配置管理
在现代IT基础设施中,自动化运维是确保高效、稳定和安全服务的关键。本文将深入介绍如何使用Ansible这一开源工具来简化服务器配置管理工作,从基础安装到高级应用,我们将一步步展示如何通过Ansible Playbooks实现自动化部署和维护,旨在帮助读者构建更加灵活和可扩展的运维体系。
96 7
|
5月前
|
运维 应用服务中间件 调度
自动化运维:使用Ansible实现服务器批量管理
【10月更文挑战第26天】在当今快速发展的IT领域,自动化运维已成为提升效率、降低人为错误的关键技术手段。本文通过介绍如何使用Ansible这一强大的自动化工具,来简化和加速服务器的批量管理工作,旨在帮助读者理解自动化运维的核心概念和实践方法。文章将围绕Ansible的基础使用、配置管理、任务调度等方面展开,通过实际案例引导读者深入理解自动化运维的实现过程,最终达到提高运维效率和质量的目的。
|
6月前
|
运维 负载均衡 安全
自动化运维:使用Ansible进行服务器配置管理
【10月更文挑战第15天】在本文中,我们将探讨如何利用Ansible这一强大的自动化工具来简化和加速服务器的配置管理工作。通过实际案例和代码示例,我们将展示Ansible如何帮助运维人员高效地进行软件部署、系统更新和日常维护任务,从而提升工作效率并减少人为错误。
|
26天前
|
存储 缓存 网络协议
阿里云特惠云服务器99元与199元配置与性能和适用场景解析:高性价比之选
2025年,阿里云长效特惠活动继续推出两款极具吸引力的特惠云服务器套餐:99元1年的经济型e实例2核2G云服务器和199元1年的通用算力型u1实例2核4G云服务器。这两款云服务器不仅价格亲民,而且性能稳定可靠,为入门级用户和普通企业级用户提供了理想的选择。本文将对这两款云服务器进行深度剖析,包括配置介绍、实例规格、使用场景、性能表现以及购买策略等方面,帮助用户更好地了解这两款云服务器,以供参考和选择。
|
1月前
|
域名解析 人工智能 弹性计算
DeepSeek服务器繁忙解决方法:使用阿里云一键部署DeepSeek个人网站!
通过阿里云一键部署DeepSeek个人网站,解决服务器繁忙问题。学生用户可领取300元代金券实现0成本部署,普通用户则可用99元/年的服务器。教程涵盖从选择套餐、设置密码到获取百炼API-KEY的全流程,助您快速搭建专属大模型主页,体验DeepSeek、Qwen-max、Llama等多款模型,无需代码,最快5分钟完成部署。支持绑定个人域名,共享亲友使用,日均成本仅约1元。
142 10

热门文章

最新文章