自动化代码发布系统实现

日常运维问题

在我日常运维工作中,代码发布可能是最普遍的一项工作之一,尤其是网页代码的更新,碎片化发布需求非常频繁。在前期开发人员比较少时,还可以由自己 来上服务器通过脚本来发布代码。但随着公司项目的增多,更多的开发人员加入到公司,发布代码需求开始增多,这就占用了我大部分时间,经常的被打断其它工作 来发布代码,非常地不爽,然后开始想解决方法。

尝试解决问题

当然,发布代码肯定是运维的职责之一了,但频繁的发布导致运维大部分时间浪费在重复的操作上,非常的不值得。基于此,开始限制代码发布频率,要求把 不是很紧急的更新延后到一周中的几个时间点。但实施起来效果不理想,治标不治本,原因是你不能强制把需要立即上线的更改延后。实施这样的定时发布,有可能 影响项目的快速迭代。

最终

想到这样子下去也不是办法,会造成工作很被动,于是开始着手建立以Web操作方式,结合git,rsync来实现自动代码发布。公司代码管理目前用的是svn,开发人员在发布前也没有打Tag的习惯,所以想到分布式的git来完成版本的管理,rsync当然是用来同步代码到其它服务器了。附上几张代码发布系统的截图:

开源技术使用

  • rsync:用来同步代码到服务器;
  • git: 用来标记版本,回滚版本;
  • tornado: python的一个web构架,提供后台服务;
  • angularjs: 前端的一个mvc框架,用来实现浏览器与后端的交互,使得后端不需要关心前端网页的渲染,专注后端逻辑的开发。前端和后端通过json数据来通信;
  • bootstrap: 让运维人员写的网站后台UI也可以很专业。

代码发布流程

从流程图可以看到,我们只需要把审核发布的权限交给开发组负责人,运维只需要维护系统的稳定,之后代码发布就不需要运维来参与了。

以上是整体的流程,现在来说详细说下具体的逻辑实现:

  • 1、开发人员提交代码更新,主要提交的字段包括“更新理由”,“svn代码路径”;
  • 2、后端收到请求后,把此数据插入到数据库,标记此更新单为“等待预发布环境更新”的状态;
  • 3、后台进程定时查询是否有等待预发布环境更新的更新单,如果有,读取svn路径,执行svn up更新代码操作,并标记此更新单为“预发布环境已更新,等待完成测试”;
  • 4、开发人员或者测试人员通过预发布环境的域名来测试功能是否正常,如果不正常,作代码修改后提交svn,再到web发布后台点击“返回修改”, 对svn路径或者不做任何修改再点击“重新提交”,然后更新单又一次回到”等待预发布环境更新“状态。循环3、4步骤,直至预发布环境测试通过为止;
  • 5、在确认测试通过后,开发人员点击”测试通过“,这时更新单进入”等待审核状态“;
  • 6、负责人确认可以发布后,点击”审批“按钮,这时更新单进入”审核通过,等待执行发布操作“的状态。这时,开发人员得到发布代码的授权;
  • 7、开发人员点击”发布代码“按钮,更新单进入”已执行发布,等待系统完成发布“状态;
  • 8、后台进程查询状态为”已执行发布,等待系统完成发布“的更新单,执行git发布命令。git命令大概为,进入预发布代码目录,执行git add .;git commit -m "更新原因";git tag 上一次版本号+1,再进入已发布代码的目录,执行git pull同步预发布代码目录的更改。最后调用rsync命令同步代码到生产环境。

下面是回滚流程:

  • 1、进入web代码发布系统,选择已发布的版本,点击“申请回滚”;
  • 2、负责人审核此次回滚;
  • 3、开发人员执行回滚操作;
  • 4、后台查询“等待回滚”的记录,假如回滚的版本号为18,进入已发布代码的目录,执行git checkout -b 18 18;git checkout 18(这两条git命令作用为,以tag 18创建分支号为18的分支,并切换当前分支为18),然后再通过rsync命令来同步代码到生产环境,这样就实现了版本的回滚。

最后想说的话

最后想说的是,运维工作可以是枯燥的,也可以是有趣的。枯燥是因为没有意识或者懒得把重复的操作通过制定流程来使其自动化,在不断地把各种在运维工 作中占用时间比较多的重复操作通过技术来使得自动化时,我们既高效完成了工作,节省了时间,又能提高编程和解决问题的能力,只有这样,我们才能让运维工作 变得既有趣又有挑战性。

原文发布于微信公众号 - 马哥Linux运维(magedu-Linux)

原文发表时间:2015-02-27

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java后端技术栈

关于缓存命中率的几个关键问题!

不命中:无法直接通过缓存获取到想要的数据,需要再次查询数据库或者执行其它的操作。原因可能是由于缓存中根本不存在,或者缓存已经过期。

2351
来自专栏idba

有赞MySQL自动化运维系统--ZanDB

有赞作为"新零售"的软件服务供应商,随着业务的不断发展,从第一批几十家商户到现在300万商家,涉及零售,美业,餐饮,自媒体等众多商家,业务规模以及访问量爆发式...

4712
来自专栏伪君子的梦呓

安装谷歌扩展

虽然说是谷歌 Chrome 内核 安装扩展,但是使用了谷歌 Chrome 内核的浏览器基本上都能安装扩展,至于使用起来的感受我就不敢保证了。

2103
来自专栏smy

一张图解释负载均衡

首先当大量用户访问时候,先请求到nignx服务器,因为nignx对于高并发支持较好,所以由nignx服务器将访问需求分配给不同的apache服务器,apache...

1573
来自专栏Java技术分享

Redis 在 SNS 类应用中的最佳实践有哪些?

2. 热点数据的实时缓存(比如feed,数据库、缓存同时写)

2309
来自专栏云瓣

使用 Node.js 搭建一个 API 网关

外部客户端访问微服务架构中的服务时,服务端会对认证和传输有一些常见的要求。API 网关提供共享层来处理服务协议之间的差异,并满足特定客户端(如桌面浏览器、移动设...

6667
来自专栏网商云

腾讯云cvm--linux结合腾讯云企业邮箱配置mailx

新账号关联我们公司购买腾讯云产品,有优惠哦!联系电话:13430587834(微信同号)

4844
来自专栏黑泽君的专栏

Github全面学习笔记

==================================================== 如何创建分支branch?   分支可以方便同时处理...

2512
来自专栏EAWorld

容器云之K8s自动化安装方式的选择

目前kubernetes 已经发展到1.5的时代,但在这之前学习和使用kubernetes还是走了不少弯路,第一个问题就是安装,也许你会说安装很简单。照着官网或...

3459
来自专栏Java后端技术

解决Eclipse里Maven工程报 An error occurred while filtering resources错误

这几天被maven的单元测试折腾死了,以为是自己的eclipse有问题呢,今天早上来了又发现eclipse报了一个很奇怪的错误:An error occurre...

1122

扫码关注云+社区

领取腾讯云代金券