【问题标题】:How do you use pip, virtualenv and Fabric to handle deployment?你如何使用 pip、virtualenv 和 Fabric 来处理部署?
【发布时间】:2011-01-27 08:31:38
【问题描述】:

您的设置、技巧,尤其是您的工作流程是什么?

这些工具很棒,但它们的使用仍然没有最佳实践,所以我不知道使用它们的最有效方法是什么。

  • 您使用pip 捆绑包还是一直使用 下载?
  • 您是手动设置 Apache/Cherokee/MySQL 还是自己设置 你有那个脚本吗?
  • 您是否将所有内容都放入virtualenv 并使用--no-site-packages
  • 您是否将一个 virtualenv 用于多个项目?
  • 你用Fabric做什么(哪一部分 你的部署脚本)?
  • 您将 Fabric 脚本放在客户端还是服务器上?
  • 您如何处理数据库和媒体文件迁移?
  • 您是否需要像 SCons 这样的构建工具?
  • 您的部署步骤是什么?您多久执行一次?

【问题讨论】:

    标签: python deployment virtualenv fabric pip


    【解决方案1】:

    “最佳实践”非常依赖于上下文,所以我不会声称我的实践是最好的,只是它们对我有用。我主要在小型站点上工作,因此没有多服务器部署、CDN 等。我确实需要支持 Webfaction 共享托管部署,因为有些客户需要他们能找到的最便宜的托管。我确实经常需要在不同的环境中多次部署站点,因此可重复的脚本部署至关重要。

    • 我不使用 pip 包,我从 requirements.txt 安装。我确实运行我自己的chishop 服务器,其中包含我需要的一切sdists,因此在构建过程中没有多个单点故障。我还在我的开发机器上使用 PIP_DOWNLOAD_CACHE 来加速引导项目环境,因为我的大多数项目的需求重叠很多。
    • 我有 Fabric 脚本,可以在 Ubuntu VPS 上自动设置和配置 nginx + Apache/mod_wsgi,或者在 Webfaction 共享主机上配置等效,然后部署项目。
    • 我不将 --no-site-packages 与 virtualenv 一起使用,因为我更喜欢在系统级别安装缓慢移动的编译包(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 看到它们 - 在 @ 987654333@ 在 repo 根目录和 deploy/ 子目录中。

    【讨论】:

    • 哇,这是一个史诗般的答案,非常感谢!顺便问一下,你如何为你的更新实现回滚?
    • 我很想看看你的面料。
    • 您能否发布一个示例 fabfile,以代码形式演示您的工作流程?
    • @Wernight @James 我已经有几年没有使用这个答案中描述的 Fabric 脚本了,所以它们根本没有得到维护,我对它们的质量不承担责任:-) 但你可以在bitbucket.org/carljm/django-project-template - 在回购根目录中的fabfile.pydeploy/ 子目录中查看它们。
    【解决方案2】:

    我使用fabric 来构建和部署我的代码,并假设已经为此设置了一个系统。我认为像 puppet 这样的工具更适合自动安装 apache 和 mysql 之类的东西,尽管我还没有真正将它包含在我的工作流程中。

    另外,我通常每个项目都有不同的 virtualenv。它们是从 python 的“基础”安装创建的——正如 Carl 指出的那样——你可以留下一些全局 python 库。

    所以就工作流程而言:

    1. puppet 安装所需的服务(Web 服务器、数据库、ssh 服务器……)
    2. puppet 设置所需的用户和基本文件夹
    3. 为应用程序创建 virtualenv 的结构
    4. 从 requirements.txt 点安装的结构
    5. 用于部署应用的结构
    6. 用于部署配置文件的结构(Web 服务器,...)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-11
      • 1970-01-01
      • 2014-10-26
      • 2011-06-22
      • 2014-06-17
      • 2016-02-29
      相关资源
      最近更新 更多