Python项目自动化部署最佳实践@搜狐

标签: python 项目 自动化 | 发表时间:2013-11-25 23:08 | 作者:the5fire
出处:http://www.the5fire.com

今天主要介绍下我们组刚刚开源出来的一个自动化部署的工具 essay ,功能在readme上已经介绍的很详细了,这篇文章只是介绍下外围的情况,产生的环境,一些决策的考虑。

诞生之初

事情还得从头开始说起,从那些自动化的fabric文件开始,也从我刚入职搜狐负责手机搜狐开发开始说起。我参与开发的时候项目的部署已经是自动化了,不过并没有抽象出一个工具来。那会儿主要由两个项目,一个基于tornado,一个基于Django。两个项目都有各自的发版方法,但逻辑基本一致。

两个项目的上线流程都是先打包(py的源码包),然后在通过内部的pypiserver安装到各个服务器上,由supervisord启动、管理。

随着业务的发展,新的项目逐渐多了起来。这时一个新的项目开发流程是这样的:先从就项目中把fabfile(fabric的配置文件)和supervisord配置文件以及setup.py文件拷贝过来,然后再往里面填源码。流程依然是一致的。

这就是一开始的状态,混沌中带着那么一点秩序。

开始造轮子

说起来,程序员都是十足的懒人。这样copy的方式多少让自己都有点不忍直视,于是 @熊总 建议我们不如造这样一个轮子,让所有的项目都能在这上面滚起来。于是把这个造轮子的任务交给我来做,刚好我也是懒人一个,于是很happy的开始了。

要造一个通用的轮子,必然是要把项目中用到的部分抽象出来,哪些部分是通用的呢,这只有深切参与到项目的开发和部署中才能体会得到。刚好在那段时间之前,我也参与了修改bug,打包,部署上线的过程,包括copy那些打包的脚本和配置文件。

有了上面的经验,只要把必需的东西输出就行了。总结了一下,当时项目的打包和上线涉及到这几个方面::

1. 打包 —— 生成版本号,渲染setup中的版本和项目信息,然后放到pypi server的packages目录下
2. 虚拟环境 —— 在新的服务器上创建虚拟环境
3. 安装项目 —— 从pypiserver安装项目到虚拟环境中
4. 启动supervisord —— 管理项目进程
5. 切换nginx配置 —— 我们有两套环境在线上同时运行,可以称为a环境和b环境,主要用于上线以及线上突然出现问题时回滚

细分的话就上面五个步骤,不太理解的可以去看看我们的essay说明。也就是只要满足了这些功能,那么这轮子就算是完成了。另外还考虑到为了便于新项目的开发,还需要能自动创建具备这些功能的项目模板。这其实是最主要的痛点,总是拷贝什么的最没技术含量了。

于是添加了创建项目并且初始化模板,然后还能初始化到gitlab或者github上。

这样的工具俨然是项目开发部署、居家旅行之良品。

争论之处

需求明确之后,怎么组织项目的代码呢,对于正常的web项目来说,没有啥难度的,都有固定的模板。对于这个工具类的东西,还是第一次考虑,怎么设计才能更合理——易扩展、易维护。在翻了好久django的源代码之后,我开始按照一个core,然后一些tools的思路开始码代码。

我的考虑是,这个工具应该有一个核心的功能,然后是周围的一些辅助工具。遗憾的是,这种思路最后还是被推翻了。熊总的意思是应该参考linux的pipeline来设计,所有的功能都应能单独拿出来。于是底层的工具模块都按照这个逻辑被他重写了(so,如果你们觉得那部分代码有槽点尽管吐好了,我不介意的,^_^)。

代码结构的争论还好些,基于经验就能看出哪种更好。但是一些逻辑的设计却不是经验能得到的,就像软件开发没有银弹一样,各自的业务场景都不同,没有统一的解决方案。

另外一个争执的点是部署方式。如果你已经看了我们的文档,或者已经理解了上面的部署方式。你可能已经疑惑了:“为毛你们不直接用git部署呢?还可以打tag什么的。” 这也是我们之前在考虑的问题。

摆在我们面前的有两条路,一条路是用git来部署代码,另外一条路是用pip install项目包来部署。我们选择了后者。原因是这样的::

1. 历史原因 —— 之前的项目一直在用这样的方式
2. 服务器配置的成本 —— 这个我觉得是最主要的,对比两种方式,git部署的话服务器要统一安装git环境,但是我们申请到新的服务器没有这东西,我们得自己安装;另外还有一个包依赖的问题。而使用pip的方式安装,不需要做多余的处理,新来机器,给了ip,直接就能部署上去。

大概就基于上述的两个原因,选择了用pip install的方式来部署了。有什么没说到得地方,有同事路过留言补充下吧。

开放的初衷

有了上面的过程,也就产生了这么个工具: essay 。在项目完成之后,后面的时间里我们划分了不同的组,又开始负责新的项目。这个工具算是一直在我们的项目开发中起着重要的作用。我们觉得这个工具算是我们在过去一年多中开发和部署经验的总结,开放出来应该会有些价值,无论是对于开发者还是对于团队。

我自己是在这个工具的开发过程中学到很多东西,我想任何一个渴望了解项目从开发到部署整个流程的开发人员都应该能从中有所收益。

开放的目的除了分享经验,还有一个重要的作用就是交流。我们所积累的经验在业内并不一定是最佳的,肯定还有更多更好的解决方案,而这些东西都要来源于交流。这样才能相互促进,而相互促进才是开放和开源的初衷。

项目地址: https://github.com/SohuTech/essay

补充一些数据

手机搜狐网(m.sohu.com)每天有几亿的PV,在这样的情况下,发现线上bug,一般情况下从修复bug到上线不会超过15分钟。并且在上线的时候用户是不会感觉到页面访问慢或者打不开的。在新功能点或者bug多的情况下,一天上线十几个版本的情况也是有的。每次上线都不会对用户造成影响的关键在于我们部署了a,b两套环境。

之前在我参与手机搜狐网开发时后台有100多台虚机,在遇到热点事件的时候会扩充一倍。在这种情况下,新功能上线的过程我印象中不会超过5分钟,如果关闭fabric的success的console输出以及开启并行模式,发布的速度会更快。

相关 [python 项目 自动化] 推荐:

Python项目自动化部署最佳实践@搜狐

- - the5fire的技术博客
今天主要介绍下我们组刚刚开源出来的一个自动化部署的工具 essay ,功能在readme上已经介绍的很详细了,这篇文章只是介绍下外围的情况,产生的环境,一些决策的考虑. 事情还得从头开始说起,从那些自动化的fabric文件开始,也从我刚入职搜狐负责手机搜狐开发开始说起. 我参与开发的时候项目的部署已经是自动化了,不过并没有抽象出一个工具来.

2013流行Python项目汇总

- - ITeye资讯频道
Python作为程序员的宠儿,越来越得到人们的关注,使用Python进行应用程序开发的越来也多. 那么,在2013年有哪些流行的Python项目呢. python_koans:Python Koans 算 “Ruby Koans” 的一部分,作为交互式教程,可以学习. sure:Sure 是最适合自动化测试的 Python 工具,包含流利的断言、深度选择器等等特性.

值得学习的python项目

- - CSDN博客编程语言推荐文章
此网站整理的2014年值得一学的pytho项目,http://pycoders.com/2014/. 项目资源都在github上,python程序员进阶必备. Nice looking web dashboard written in Flask that can display data about your system and its processes as returned by psutil.

使用VitrualEnvWrapper隔离python项目的库依赖

- jeff - Jeff的妙想奇境
VirtualEnv用于在一台机器上创建多个独立的python运行环境,VirtualEnvWrapper为前者提供了一些便利的命令行上的封装. - 隔离项目之间的第三方包依赖,如A项目依赖django1.2.5,B项目依赖django1.3. - 为部署应用提供方便,把开发环境的虚拟环境打包到生产环境即可,不需要在服务器上再折腾一翻.

记项目 Python-MySQL 访问类的优化

- litefy - python.cn(jobs, news)
接手一些Python项目的后续开发与维护,发现这些项目都用同一个数据库访问类,而生成的结果行竟然是用list存的,一个简单的row['id']访问需要遍历整行去找,遂优化之. 一般访问数据行的字段都是使用字段名访问,显然应该使用dict. 但也有可能使用数字下标访问,例如对于select count(*)的结果集,可能就使用rs[0][0]访问了.

2013年最好的Python开源项目汇总

- - ITeye资讯频道
2013年Python社区诞生了很多实用的开发工具,这些工具在一定程度上可以帮助你节省更多的时间. 本文为你汇总了这些工具,它们大部分都是开源的,你还可以通过源码来学习更多的Python开发知识. Radon是一个用于从源代码中计算出各种指标的Python工具,包括:. McCabe复杂性计算,也就是循环复杂度.

5个方便好用的 Python 自动化脚本,拿来即用!

- - xLog Latest
相比大家都听过自动化生产线、自动化办公等词汇,在没有人工干预的情况下,机器可以自己完成各项任务,这大大提升了工作效率. 编程世界里有各种各样的自动化脚本,来完成不同的任务. 尤其 Python 非常适合编写自动化脚本,因为它语法简洁易懂,而且有丰富的第三方工具库. 这次我们使用 Python 来实现几个自动化场景,或许可以用到你的工作中.

Python 项目推介:扇贝网,一个从 2 到 30 万的故事

- 杀手 - python.cn(jobs, news)
我想说一说“扇贝网 http://shanbay.com”,一家致力于帮助英语学习者解决词汇问题的网站,我是创始人之一. 在创办扇贝网之前,我曾经花了几个月时间看完一本原版的达芬奇密码,期间最为纠结的无非是随处可见的英语生词,一开始我还能不厌其烦的查字典做记录,但是发现这些生词再次出现,我依然不记得是什么意思;屡经挫折后,我渴望能有一个网站让我在看书或者文章过程中把遇到的单词丢进去,而后我只要登录这一网站,它就能按照一定规律提醒我复习.

疑Google员工把8w行Python项目用4w行Java重写了

- - est's blog
发信人: daluobu (阿土仔), 信区: Python. 标 题: 终于把一个8万行的Python程序用Java重写了. 发信站: 水木社区 (Fri Dec 6 08:10:26 2013), 转信. 在噩梦般地维护了一年多一个8万多行的Python程序之后,终于争取到机会把这个破烂玩.

我们整理了20个Python项目,送给正在求职的你

- -
关注「实验楼」,每天分享一个项目教程   . “金三银四”、“金九银十”的说法. 如果你是一名正在求职或准备跳槽的程序员,不妨趁着这两个月时间好好准备一下. “金三银四”、“金九银十”的说法. 尤其是3、4月刚过完年后,很多企业的员工会选择离职,大量空缺职位被放出,同时HR招聘压力增大,求职者往往可以借此机会,获得一个更好的报价.