如何在受限环境下管理Python?

Ifr*_*rit 4 python

需求:

\n\n
    \n
  • 支持数百名 Python 开发人员和/或产品服务器在高度限制的环境中运行 Python 代码。
  • \n
  • 能够提供开发人员需要的 PyPi.org 中找到的任何兼容模块。
  • \n
\n\n

环境:

\n\n
    \n
  • 没有外部访问。
  • \n
  • 内部网络可用。
  • \n
  • 支持多平台(Windows、Linux、Apple)
  • \n
  • 大部分开发人员和/或产品服务器无法访问编译工具。
  • \n
  • 至少支持最新的 Python 2.7 和 Python 3.x
  • \n
\n\n

询问:

\n\n
    \n
  • 如何为安装Python模块的分发提供支持?
  • \n
  • 如何处理那些需要编译的 Python 模块?请记住,许多机器没有可用的编译工具。
  • \n
\n\n

Def 欣赏基于类似现实世界经验的解决方案。

\n\n

假设:

\n\n
    \n
  • 假设存在一个神奇的过程,该过程授权将模块拉入内部网络进行分发。
  • \n
  • 并不是说 Anaconda 可以\xe2\x80\x99t 成为答案的一部分,只需确保解决如何解决在那里找不到的 PyPi.org 包的问题。
  • \n
\n\n

澄清:

\n\n
    \n
  • 允许使用 Docker 容器。
  • \n
\n

hoe*_*ing 5

前言

\n\n

如今,如果您想托管自己的 PyPI 存储库,有很多可行的选择。有许多可用的软件包可以实现 PyPI 存储库服务器,最值得注意的是:

\n\n\n\n

还有一些其他或多或少奇特的软件包,例如PyPICloud,可将软件包文件直接上传到 Amazon S3 实例。JFrog 的Artifactory还支持提供 python 包,尽管不是免费版本,所以只有当您已经支付许可证费用时才有意义。您甚至可以只使用 python 的 stdlib 创建本地 PyPI 存储库,请参阅我对 SO 的回答

\n\n

此外,这个主题在 SO 上讨论了多次,最常见的问题是如何推出我自己的 pypi?以及如何在没有镜像的情况下创建本地自己的 pypi 存储库索引?请注意,第一个问题相当古老,并且包含大部分过时的答案,第二个问题则更为最新。

\n\n

devpi

\n\n

在我的工作中,我们两年前评估了可用的解决方案,并一直坚持使用devpi。由流行测试框架pytest和 CI 任务自动化工具背后的同一个人开发toxdevpi是一个多功能工具,它:

\n\n
    \n
  • 可以托管多个存储库(称为索引),允许您对包访问进行分组;
  • \n
  • 默认情况下充当 PyPI 镜像,可以根据需要关闭;
  • \n
  • 为上传包提供基于角色的访问控制;
  • \n
  • 提供可选的 Web UI,可通过页面模板进行自定义;
  • \n
  • 提供主服务器复制 - 所有副本将在更改时自动从主服务器同步包基础;
  • \n
  • 可以托管包文档(Sphinx);
  • \n
  • 如果连接到像Jenkins这样的CI服务器,可以在包上传时触发测试运行并显示测试运行结果;
  • \n
  • 有一个用于在服务器和 CLI 客户端上扩展的插件 API(基于pluggy库;与用于扩展的 API 相同tox,或者pytest如果您熟悉它们);您可以通过编写自己的插件来定制很多东西,从身份验证到存储后端。Github 页面上还有几个可用的内部插件。
  • \n
\n\n

IMO 最强大的功能是索引。索引定义了一组可以从索引 URL 安装的包。例如,假设一个devpi实例配置了两个索引:index fooOffers packageA和 Index barOffers B。现在您有两个存储库 URL:

\n\n
$ pip install A --index-url=https://my.pypi.org/foo\n
Run Code Online (Sandbox Code Playgroud)\n\n

会成功,但是

\n\n
$ pip install A --index-url=https://my.PyPI.org/bar\n
Run Code Online (Sandbox Code Playgroud)\n\n

将失败。索引可以在扩展自己的包基础的意义上相互继承,因此如果bar继承foo,您将能够从索引安装A两者。Bbar

\n\n

这使我们能够轻松配置包限制策略:比如说,我们有两个主要的用户组(开发人员和 QA),每个组都有自己所需的一组包,我们还开发提供给客户的包和供内部使用的工具。将它们与索引分组没有问题:

\n\n
root/pypi\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 company/base    <- contains common packages like pip or setuptools\n\xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 company/internal    <- in-house tools\n\xe2\x94\x82       \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 company/dev    <- packages necessary for development\n\xe2\x94\x82       \xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 developer/sandbox    <- private index for single developer\n\xe2\x94\x82       \xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 developer2/sandbox\n\xe2\x94\x82       \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 company/qa    <- packages for QA (test automation etc)\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 customer/release    <- customer packages\n
Run Code Online (Sandbox Code Playgroud)\n\n

现在,例如,开发人员设置索引 URLhttps://my.pypi.org/developer/sandbox一次,就可以访问上传到 例如 的所有新包company/base,而客户设置索引 URL 时https://my.pypi.org/customer/release,无法访问来自 的任何包company/internal

\n\n

root/pypi是一个特殊的元索引:它始终存在;如果索引继承它,则所有未包含在索引中的安装包的请求都会被代理到 pypi.org。要关闭 pypi.org 镜像,只需不要继承自root/pypi.

\n\n

上传限制策略也很容易在每个索引的基础上设置:所有开发人员都可以上传到自己的私有沙箱company/dev;所有 QA 都可以上传至company/qa; 只有管​​理员可以上传到company/base,上传到company/internal并且客户索引是在成功的夜间构建上从 CI 服务器创建的。

\n\n

整个设置和配置过程请参阅devpi 文档;这些文档非常广泛,涵盖了将出现的大多数问题。

\n