资源预览内容
第1页 / 共16页
第2页 / 共16页
第3页 / 共16页
第4页 / 共16页
第5页 / 共16页
第6页 / 共16页
第7页 / 共16页
第8页 / 共16页
第9页 / 共16页
第10页 / 共16页
亲,该文档总共16页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
_ 分布式自动化版本发布系统 _ 目 录 第 1 章 分布 式自动化版本发布系统 . 3 1.1. 概述 . 3 1.2. 架构说明 . 3 1.3. 系统 UI . 4 第 2 章 实现原理 . 7 2.1. 版本信息获取模块 . 7 2.1.1. SVN 版本库 . 7 2.1.2. Maven . 9 2.2. 版本信息数据库 . 12 2.3. 版本发布系统及任务分发模块 . 12 2.4. 任务执行模块 . 14 第 1章 分布式自动化版本发布系统 1.1. 概述 在 页游或手游行业, 游戏的版本发布是运维日常工作 主要部分, 在短暂的停机维护时间内要 将游戏的新版本发布到几十台甚至数百台服务器中。 这种工作 强度下,运维必须采用一些自动化运维的手段,在实现自 动化运维时,不同的团队会采用不同的技术,大致如下: 1. 采用 puppet、 chef、 func、 salt 等开源工具 2. 写一些 shell 或 python 脚本 3. 开发自己的自动化运维系统 笔者采用的是第 3 种方式, 理由是 : 1. 第 3 方开源工具 的 安装、 配置 、维护 比较麻烦, 有一定的学习成本, 且功能不太灵活; 2. 第 2 种方式需要登陆一台运维服务器,根据 需求输入一些命令,对其他SA、 运营、策划的同 学 有一定的学习成本,且容易发生误操作; 3. 自主开发自动化运维系统,对团队的开发水平有一定的要求, 但是灵活性高, 可以根据业务情况开发出非常适合自己公司业务需要的工具, 提供 友好的 WEB 操作界面的话, 可以招一些水平较差的 SA 来培养,降低人力成本。 1.2. 架构说明 以 下为笔者开发的自动化运维工具的架构图 : 版 本 信 息 获 取 模 块版 本 信 息 数 据 库版 本 发 布 系 统 W E B 及任 务 分 发 模 块任 务 执 行 模 块 任 务 执 行 模 块 任 务 执 行 模 块任 务 队 列 及 任 务 执 行结 果 数 据 库架构说明: 1. 版本信息获取模块的功能是从 SVN 或 maven 中每隔 1 分钟获取一次版本信号,然后将版本信息存入数据库; 2. 版本发布系统 提供一个 WEB 界面, 用户 可以 进行版本发布、 服务器开、关、重启、项目录入、游戏大区录入等操作,操作指令将作为任务存入任务队列; 3. 任务队 列数据库将保存每个任务信息及执行结果 4. 任务执行模块会实时从任务队列中拉取任务信息并执行,可以部署 1 个或多个,加快任务执行速度。 1.3. 系统 UI 在使用前需要通过域账户登陆: 登陆后如下所示 ( 这个是一个游戏后端的项目,代码提交后 maven 会自动构建 成 zip 文件 ) : 在版本发布前需要录入项目信息及游戏大区信息: 项目和游戏大区录入后就可以使用本系统进行版本发布了,如下图所示: 版本发布时,可以在任务执行服务器中看到详细的发布过程,如下图所示: 版本发布完成后,会自动完 成重启,正好在此过程中被监控系统发现,然后邮件报警了。 重启任务发出后跳转到服务管理页面,如下图所示: 第 2章 实现原理 2.1. 版本信息获取模块 2.1.1. SVN 版本库 SVN 版本库的检查可以使用 pysvn 模块, 代码片段如下: #检查 SVN的更新情况 def project_svn(path, team): #pathA = /data/release/tech project = pathname ret = svnchanges(pathpath) old_rev = retold_rev new_rev = retnew_rev del retold_rev del retnew_rev svnupstr = %s updated from %s to %s. % (project, old_rev, new_rev) print svnupstr values = if int(new_rev) int (old_rev): entry = svninfo(pathpath) print entry for i in entry: print i messagea = uSVN版本号: %sn % entry.commit_revision.number messagea += u提交者: %sn % entry.commit_author messagea += u更新日期: %snn % str(datetime.datetime.fromtimestamp(entry.commit_time):-7 messagea += u更新内容: n valuesproject = pathname valuesrevision = entry.commit_revision.number valuesauthor = entry.commit_author valuesdate = str(datetime.datetime.fromtimestamp(entry.commit_time):-7 valuescontent = 以下为一个使用该功能的另一个系统的截图: 2.1.2. Maven 我们的项目代码是 提交到 TFS 中,然后通过 maven 构建的,构建出来会保存到 windows 中的一个目录中,然后通过 python 脚本挂载 Windows 的目录,并用 rsync 把新构建的版本信息存入数据库,代码片段如下 : #coding:utf8 import os import datetime import pymongo import time #- #同步 maven编译过的版本到本地服务器 def synsfile(): #卸载挂载过的磁盘 umount = umount -a os.system(umount) #挂载 TFS中的服务器端发布目录 mount = mount.cifs -o username=xxxx.zhao,domain=xxxx.com,password=mypasword /111.111.111.111/output/server /mnt/projectl_server/ os.system(mount) local = /mnt/projectl_server/ dest = /data/release/project_L/server rsync = rsync -avz -include */ -include *.zip -exclude */* -exclude * %s %s % (local, dest) #print rsync os.system(rsync) #分到到另一台版本发布服中 local = /data/release/project_L/server/ rsync_cmd = rsync -avz -e ssh %s root%s:%s -delete % (local, 192.168.5.14, dest) print rsync_cmd os.system(rsync_cmd) #- #列出版本内容 def listversion(path, verpath): versionlist = os.listdir(path) version = for ver in versionlist: version.append(ver + verpath) #print version return version #- #更新记录入库 def InsertDB(values): conn = pymongo.Connection(111.111.111.111, 27017) version_db = conn.version release_record = version_db.release_record release_record.update(path : valuespath, values, True) if _name_ = _main_: while True: path = /data/release/project_L/server/ verpath = /MavenOutput/mobileGame/target/mobileGame-deploy.zip,/MavenOutput/gameGate/target/gameGate-deploy.zip,/MavenOutput/game
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号