你如何使用pip,virtualenv和Fabric来处理部署?
你的设置,你的技巧,最重要的是,你的工作stream程是什么?
这些工具很棒,但是仍然没有最佳实践,所以我不知道使用它们的最有效的方法是什么。
- 你使用PIP捆绑或总是下载?
- 你是否手工设置了Apache / Cherokee / MySQL,或者你有脚本吗?
- 你把一切都在virtualenv和使用
--no-site-packages
? - 你有几个项目使用一个virtualenv?
- 你使用Fabric的哪些部分(脚本的哪个部分是你的脚本)?
- 你把你的Fabric脚本放在客户端还是服务器上?
- 你如何处理数据库和媒体文件迁移?
- 你有没有需要像SCons这样的构build工具?
- 你的部署步骤是什么? 你多久执行一次?
- 等等
“最佳实践”是非常依赖于上下文的,所以我不会说我的做法是最好的,只是他们为我工作。 我主要在小型网站上工作,所以没有多服务器部署,CDN等。我确实需要支持Webfaction共享主机部署,因为有些客户需要最便宜的主机,他们可以find。 我经常不得不在不同的环境中多次部署站点,因此可重复的脚本部署至关重要。
- 我不使用pip捆绑,我从一个requirements.txt安装。 我运行我自己的chishop服务器sdists我所需要的一切,所以在构build过程中没有多个单点故障。 我也在我的开发机器上使用PIP_DOWNLOAD_CACHE来加速引导项目环境,因为我的大部分项目需求重叠了很多。
- 我有Fabric脚本,可以在Ubuntu VPS上自动设置和configurationnginx + Apache / mod_wsgi,或者在Webfaction共享主机上configuration相应的function,然后部署该项目。
- 我不使用带virtualenv的–no-site-packages,因为我更喜欢在系统级安装缓慢移动的编译软件包(Python Imaging Library,psycopg2) 在每个虚拟世界里面都很慢,很麻烦。 我没有遇到污染的系统站点包,因为我一般不污染它。 在任何情况下,您都可以在virtualenv中安装不同版本的东西,并且将优先考虑。
- 每个项目都有自己的virtualenv。 我有一些bash脚本(不是virtualenvwrapper ,尽pipe很多人使用它并且喜欢它),将给定项目的virtualenv自动部署到一个已知的位置,并将该项目的需求安装到其中。
- 从裸Ubuntu服务器VPS或Webfaction共享托pipe帐户到正在运行的网站的整个部署过程使用Fabric脚本。
- 结构脚本是项目源代码树的一部分,我从本地开发结帐运行它们。
- 我不需要SCons(我知道)。
部署
目前,全新的部署分为以下几个步骤:
-
fab staging bootstrap
(服务器设置和初始代码部署) -
fab staging enable
(启用此站点的Apache / nginxconfiguration) -
fab staging reload_server
(重新加载Apache / nginxconfiguration)。
那些当然可以组合成一个单一的命令行fab staging bootstrap enable reload_server
。
完成这些步骤后,使用新代码更新部署仅仅是fab staging deploy
。
如果我需要回滚一个更新, fab staging rollback
。 没有什么特别神奇的回滚; 它只是将代码回滚到最后部署的版本,并将数据库迁移到以前的状态(这确实需要logging一些关于数据库部署后迁移状态的元数据,我只是在文本文件中这样做)。
例子
我还没有使用这个答案中描述的结构脚本几年,所以他们没有被维护,我不承担责任的质量:-)但你可以看到他们在https://bitbucket.org/carljm / django-project-template – 在repo根目录下的fabfile.py
中,以及deploy/
子目录下。
我使用结构来构build和部署我的代码,并假设已经为此设置了一个系统。 我认为像puppet这样的工具更适合自动安装apache和mysql之类的东西,尽pipe我还没有真正把它包含在我的工作stream程中。
另外,我通常每个项目都有不同的virtualenv。 它们是从python的“基础”安装中创build的,正如Carl指出的那样 – 你可以留下一些全局的python库。
所以在工作stream程方面将是:
- 木偶安装所需的服务(networking服务器,数据库,SSH服务器,…)
- 木偶设置所需的用户和基本文件夹
- 结构为应用程序创buildvirtualenv
- fabric从requirements.txt安装
- 结构来部署你的应用程序
- 结构来部署configuration文件(networking服务器,…)