打算写这样一个系列,说说我们在360里面,如何使用Python。在360,除非是需要包含在360客户端软件当中的功能,技术人员使用什么语言进行开发,更多的是一种个人,最多是项目团队的决定。因此我们的同事会使用 php写页面,用python的工具,用c/c++写模块,甚至用易语言写界面。

也正是因为这个原因,虽然这个标题写得很大,但其实我也只能写一下我所在的团队如何使用Python。我们目前有Python代码约6万行,程序运行在Linux下,使用 Python2.5 和 Python 2.7 环境。

这6万行Python代码被被分成80余个项目进行组织。每个项目提供一个或一组完整的功能集合,每个项目都有自己的 setup.py 文件用来将项目代码打包成 Python 发布包(Distribution),部分项目还有自动文档生成,我们使用的是 Sphinx 和 reST格式的文本。打包好的Python包被发布到我们自己搭建的内网的与 pypi.python.org 兼容的私有 pypi 服务器上,而文档保存在内网的类似于 readthedocs 的服务器上。

后台团队的代码主要运行我们自己的Linux服务器集群上,开发和部署的成本比较低,因此我们使用比较敏捷的开发流程。流程大体上可以分为下面几个步骤:

  1. 开发:顾名思义,这个步骤当中,开发人员在开发机上面写代码实现功能,不同的开发人员的开发环境使用 扩展过的 virtualenv 脚本进行隔离;
  2. 单元测试:开发人员负责对代码当中的关键部分进行单元测试,通常使用 unittest,我们使用 nose 将测试用例聚合和进行回归测试,不定期使用 coverage 确定代码测试覆盖率(集成在nose当中)。这一步还会使用 PyLint 对代码进行扫描;
  3. 构建:使用 python distribute 将 Python代码构建成包,同时将这个包发布到测试版 pypi 服务器(pypi-testing),测试版pypi服务器是我们搭建的若干个私有pypi其中之一,发布工作使用的是我们扩展的 distribute 命令;
  4. 测试:在测试机器或测试流程当中,从测试版pypi当中获取最新的库并测试,这个部署过程我们使用 distribute 提供的 easy_install 工具进行;
  5. 发布:将经过测试的包从测试版pypi服务器移到发布版pypi服务器,这个同样通过扩展的 distribute 命令;
  6. 部署:运维人员从发布版pypi服务器上获取最新的库,并更新到真实的服务器上,并应用新的变更。这个过程当中任何一台单机部署使用的都是 easy_install,在分布式环境下,我们使用 Fabric 进行多机部署;
  7. 监控:新版本上线之后,会持续通过日志和报警系统进行系统监控。我们专门扩展了 logging 模块以便适应我们的监控需求。

熟悉Python的朋友们可能看到这些名词和包都很熟悉,因为我们所使用的都是业界广泛使用的开发、测试和运维的工具。但这些工具很多都适合于开源软件(Open Source Software)而非私有软件(Proprietary Software),例如 distribute 与 pypi.python.org 的结合是天衣无缝的,Sphinx 和 readthedocs 也是很容易结合,但是作为一个私有软件,我们无法将代码和文档放到 pypi 或 readthedocs 上面。为此我们几乎复制了整套的基础架构,包括 pypi 服务,readthedocs 服务等,后续我会介绍我们如何做到这点的。希望这个系列对于其他正在使用Python开发私有软件的同仁能有些帮助。