多个存储库中的Python开发

时间:2016-04-12 11:28:36

标签: python git pip setuptools microservices

我们正在努力寻找解决该问题的最佳方法。 假设我在Python环境中工作,使用pip& setuptools的。 我在正常的git流程中工作,或者我希望如此。 所以:

  1. 转到某个应用中的功能分支,进行更改。
  2. 移动到依赖库中的功能分支 - 开发事物。
  3. 使用“-e git + ssh”将应用程序指向依赖库的功能分支。
  4. 创建一个拉取请求。
  5. 当这一切都完成后,我想把东西合并到主人,但我不能不做另外的最后一次更改才能拥有应用程序(上面的步骤3)requirements.txt现在指向该功能的主要分支。

    我们缺少python中的“微服务”或多个依赖源代码是否有良好的工作流程?

2 个答案:

答案 0 :(得分:1)

从开发到部署的Python应用程序工作流程

看起来你正在寻找使用git开发Python应用程序。

以下描述适用于任何类型的基于Python的应用程序, 不仅仅是基于Pyramid的网站。

要求

情况:

  • 使用Pyramid Web框架开发基于Python的解决方案
  • 有多个python包,参与最终解决方案,包可能是依赖的。
  • 一些软件包来自公共pypi,其他软件包可能是私有软件包
  • 由git控制的源代码

期望:

  • 拟议的工作方式应允许:
    • 拉动请求
    • 适用于包依赖的情况
  • 确保部署可重复

提议的解决方案

概念:

  • 甚至将金字塔应用程序作为版本化软件包发布
  • 私人pypi使用devpi-server incl。易失性和释放指数。
  • 创建包时,请使用pbr
  • 使用tox进行包单元测试
  • 测试,在发布新软件包版本之前
  • 测试,部署之前
  • 保持部署配置与应用程序包分开

Pyramid web app as a package

Pyramid允许以Python包的形式创建应用程序。在 事实上,整个初始教程(包含21个阶段)正是使用这个 方法

尽管如此,您可以在开发模式下运行应用程序,但您没有 在生产中这样做。从发布的包中运行很容易。

Pyramid使用漂亮的.ini配置文件。保留development.ini 包存储库,因为它是开发的组成部分。

另一方面,请确保生产.ini文件不存在 不应与应用程序混合,属于部署内容。

为了简化部署,请在包中添加一个打印到的命令 stdout典型的部署配置。为脚本命名,例如myapp_gen_ini

编写单元测试并配置tox.ini来运行它们。

将部署内容与应用程序分开

将应用程序代码与部署配置混合会产生问题 那一刻,你将不得不安装到第二个实例(因为你很可能 至少改变一行配置。)

在部署存储库中:

  • 保持requirements.txt,其中列出了应用程序包和其他 生产所需的包装。请务必指定确切的包版本 至少为您的应用程序包。
  • 保留此production.ini个文件。如果您有更多部署,请为每个部署使用一个分支。
  • 放在tox.ini

tox.ini应具有以下内容:

[tox]
envlist = py27
# use py34 or others, if your prefer

[testenv]
commands = 
deps =
    -rrequirements.txt

部署存储库的预期使用是:

  1. 将其克隆到服务器
  2. 运行tox,这将创建virtualenv .tox/py27
  3. 通过$ source .tox/py27/bin/activate
  4. 激活virtualenv
  5. 如果尚未在repo中存在production.ini,请运行命令 $ myapp_gen_ini > production.ini生成生产模板 构造
  6. 根据需要修改production.ini
  7. 测试,它有效。
  8. production.ini更改提交到存储库
  9. 执行部署应用程序所需的其他内容(配置Web服务器,监督等)
  10. setup.py使用pbr

    使包创建更简单,并使包版本控制与git相关 存储库标签,使用pbr。最终setup.py只有3行 long和所有相关内容将以setup.cfg以ini的形式指定 文件。

    在第一次构建之前,你必须在git repository中有一些文件, 否则会抱怨。当你使用git时,这应该没问题。

    要分配新的软件包版本,请设置$ git tag -a 0.2.0并构建它。这将 使用版本0.2.0创建包。

    作为奖励,它会根据您的提交创建AUTHORSChangeLog 消息。将这些文件保存在.gitignore中并使用它们创建AUTHORS.rstChangeLog.rst手动(基于自动生成的内容)。

    当你将提交推送到另一个git存储库时,不要忘记推送标签。

    使用devpi-server作为私人pypi

    devpi-server是非常出色的私人pypi,它将为您带来以下优势:

    • 拥有私人pypi
    • 缓存公共pypi包
    • 虚拟环境的更快构建(因为它将从缓存的包中安装)
    • 即使没有互联网连接也可以使用pip
    • 在各种类型的包索引之间推送:一个用于开发 (发布的版本可以在这里更改),一个用于部署(发布的版本不会在这里更改)。
    • 对任何有权访问它的人进行简单的单元测试,它甚至会收集 结果并通过网页将其显示出来。

    对于所描述的工作流程,它将作为python包的存储库提供,可以部署。

    要使用的命令是:

    • $ devpi upload将已开发的软件包上传到服务器
    • $ devpi test <package_name>下载,安装,运行单元测试, 将测试结果发布到devpi-server并清理临时安装。
    • $ devpi push ...将已发布的软件包推送到devpi-server上的正确索引,甚至是公共pypi。

    请注意,始终很容易将pip命令配置为使用 来自devpi服务器上$ pip install <package>的所选索引的包。

    devpi-server也可用于持续集成测试。

    git如何适应此工作流程

    所描述的工作流程并未绑定使用git的特定样式。

    另一方面,git可以在以下情况下发挥作用:

    • commit:提交消息将成为自动生成的ChangeLog
    • 的一部分
    • tag:定义版本(由setup.py基于pbr识别)。

    分发git时,有多个存储库,分支等, devpi-server允许类似的分发,因为每个用户都可以拥有它 工作索引发布到。无论如何,最后会有一个git存储库 使用master分支。在devpi-server中也将达成一致 生产指数。

    摘要

    描述的过程并不简单,但复杂性与任务的复杂性有关。

    它基于工具:

    • tox
    • devpi-server
    • pbr(Python包)
    • git

    建议的解决方案允许:

    • 管理python包,包括发布管理
    • 单元测试和持续集成测试
    • 任何使用git
    • 的风格
    • 部署和开发具有明确定义的范围和交互。

    您的问题假设有多个存储库。建议的解决方案允许通过管理良好的软件包版本来解耦多个存储库,并发布到devpi-server。

答案 1 :(得分:0)

我们最终使用git依赖,而不是devpi。 我认为当使用git时,只要pip可以使用它,就不需要添加另一个包存储库。

核心问题,分支代码(由于二级依赖)与合并到master的分支代码不同,尚未解决,而是通过努力消除第二级依赖关系来解决这个问题。