如何使用pip、virtualenv和Fabric进行部署?

66 投票
2 回答
13276 浏览
提问于 2025-04-15 20:24

你们的设置、技巧,最重要的是,你们的工作流程是怎样的?

这些工具都很不错,但目前还没有什么最佳实践可以参考,所以我不知道用它们的最有效方法是什么。

  • 你是用pip包,还是每次都手动下载?
  • 你是手动设置Apache/Cherokee/MySQL,还是有脚本可以自动完成?
  • 你会把所有东西放在virtualenv里,并使用--no-site-packages吗?
  • 你会为多个项目使用一个virtualenv吗?
  • 你用Fabric做什么(你在部署的哪个部分使用脚本)?
  • 你的Fabric脚本放在客户端还是服务器上?
  • 你是怎么处理数据库和媒体文件迁移的?
  • 你有没有需要像SCons这样的构建工具?
  • 你的部署步骤是什么?你多久执行一次每个步骤?
  • 等等。

2 个回答

9

我使用fabric来构建和部署我的代码,并假设系统已经为此做好了准备。我觉得像puppet这样的工具更适合自动安装一些东西,比如apache和mysql,不过我还没有真正把它加入我的工作流程中。

另外,我通常为每个项目创建一个不同的虚拟环境。这些虚拟环境是从一个“基础”安装的python中创建的,正如Carl所提到的,你可以在其中保留一些全局的python库。

所以在工作流程方面,可以这样理解:

  1. 用puppet来安装所需的服务(比如网页服务器、数据库、ssh服务器等)
  2. 用puppet来设置所需的用户和基础文件夹
  3. 用fabric为应用程序创建虚拟环境
  4. 用fabric从requirements.txt中安装依赖包
  5. 用fabric来部署你的应用
  6. 用fabric来部署配置文件(比如网页服务器的配置)
79

“最佳实践”其实是根据具体情况而定的,所以我不会说我的做法是最好的,只能说对我来说有效。我主要做一些小网站,所以不涉及多个服务器的部署、CDN等。我需要支持Webfaction的共享主机部署,因为有些客户需要最便宜的主机。我经常需要在不同的环境中多次部署网站,所以可重复的脚本化部署非常重要。

  • 我不使用pip包,而是从requirements.txt文件中安装。我自己运行一个chishop服务器,里面有我需要的所有软件包,这样在构建过程中就不会有多个单点故障。我还在开发机器上使用PIP_DOWNLOAD_CACHE来加快项目环境的搭建,因为我大部分项目的需求有很多重叠。
  • 我有一些Fabric脚本,可以自动在Ubuntu VPS上设置和配置nginx + Apache/mod_wsgi,或者在Webfaction共享主机上配置相应的环境,然后部署项目。
  • 我不在virtualenv中使用--no-site-packages选项,因为我更喜欢在系统级别安装一些变化不大的编译包(比如Python Imaging Library和psycopg2);在每个virtualenv中安装这些包太慢也麻烦。我没有遇到系统包污染的问题,因为我通常不会污染它。而且无论如何,你可以在virtualenv中安装不同版本的包,它会优先使用。
  • 每个项目都有自己的virtualenv。我有一些bash脚本(不是virtualenvwrapper,虽然很多人使用并喜欢它)来自动将特定项目的virtualenv部署到一个已知的位置,并安装该项目的需求。
  • 整个部署过程,从一个干净的Ubuntu服务器VPS或Webfaction共享主机账户到一个运行的网站,都是通过Fabric脚本完成的。
  • Fabric脚本是项目源代码的一部分,我从本地开发环境中运行它们。
  • 我目前没有使用SCons的需求。

部署

目前,一个新的部署分为以下几个步骤:

  • fab staging bootstrap(服务器设置和初始代码部署)
  • fab staging enable(启用这个网站的Apache/nginx配置)
  • fab staging reload_server(重新加载Apache/nginx配置)。

当然,这些步骤可以合并成一个命令行 fab staging bootstrap enable reload_server

完成这些步骤后,更新部署新代码只需 fab staging deploy

如果我需要回滚更新,使用 fab staging rollback。回滚并没有什么特别神奇的,只是将代码回滚到上一个部署版本,并将数据库迁移到之前的状态(这需要记录一些关于数据库迁移状态的元数据,我通常会把这些信息放在一个文本文件里)。

示例

我已经有几年没使用这个回答中描述的Fabric脚本了,所以它们并没有维护,我对它们的质量不负责任 :-) 但你可以在 https://bitbucket.org/carljm/django-project-template 查看它们 - 在代码库根目录的 fabfile.pydeploy/ 子目录中。

撰写回答