首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在不将凭据写入磁盘的情况下从本地Python存储库构建并上载到本地Python存储库

在不将凭据写入磁盘的情况下从本地Python存储库构建并上载到本地Python存储库
EN

Stack Overflow用户
提问于 2017-11-14 18:01:35
回答 1查看 3.3K关注 0票数 2

我已经设置了一个Python构建管道,其中包含一个为我们的内部包服务的存储库。

该管道使用此存储库解决内部依赖关系,并上载构建构件。

目前,这是用python setup.py bdist_wheel sdist upload -r local完成的。实际上,该命令要求磁盘上有两次凭据;一次用于通过~/.pydistutils.cfg解析本地依赖:

代码语言:javascript
复制
[easy_install]
index_url=https://username:password@artifactory/api/repo/path/simple

...and在~/..pypirc中再次用于上传构建包:

代码语言:javascript
复制
[distutils]
index-servers = local

[local]
repository: https://artifactory/api/repo/path
username: build_agent
password: ****

出于安全考虑,我希望用户名和密码永远不要碰磁盘。我们已经有了一种从(Hashicorp) Vault向构建环境中注入秘密的安全方法,我想在Artifactory凭证中利用这一点。

但是,虽然我可以设置PIP_INDEX_URL来安装带有pip的软件包,但我看不到setuptools的等效。如果没有定义这些文件,命令python setup.py sdist将导致堆栈跟踪以下错误:

代码语言:javascript
复制
distutils.errors.DistutilsError: Could not find suitable distribution for Requirement.parse('local-package==0.0.3')

显然,它试图解决对公共pypi的本地依赖,这是不可取的,原因有很多(本地存储库代理pypi,因此我们不应该读取公共pypi以防止劫持)。

从本质上讲,我的问题是:如何使用环境变量中的凭证,而不是在~/..pypirc或~/.pydistutils.cfg?中使用环境变量中的凭据,将具有本地存储库依赖关系的python包构建并上载到该存储库。

附加背景

最初的实现在使用Packer构建的构建代理AMI中烘焙了.pypirc和.pydistutils.cfg。

问题在于,存储库的用户名和密码基本上可以被任何访问AWS帐户和使用映像下载或创建新实例的人以纯文本形式读取。

这很简单,只需添加一个构建步骤,在开始构建之前设置pypirc!我想避免这种方法,因为它是脆弱的,因为它创建了一个全局运行时构建依赖。将来,如果配置文件已经创建了,而不需要自己创建配置文件,那么就可以设置一个作业,而且由于另一个作业已经先运行,所以它几乎总是可以工作的。我无法在每次构建之后删除该文件,因为可能存在并发构建,要求文件存在。

EN

回答 1

Stack Overflow用户

发布于 2017-11-16 13:47:44

我找到了解决办法,但不是特别漂亮。

第一个问题是setup_requires。因为它在这个过程中很早就调用了easy_install,所以很难覆盖;即使创建一个分发子类和重写fetch_egg方法也没有帮助。现在我已经确定的解决方法是包装安装方法,并通过pip预装它们(使用PIP_INDEX_URL设置):

代码语言:javascript
复制
from setuptools import setup

def _setup(**kwargs):
    requires = kwargs.get('setup_requires') or []

    for req in requires:
        pip.main(['install', req])

    return setup(**kwargs)


_setup(
    name='mypackage',
    ...
)

这仅适用于在setup_requires中指定本地依赖项的包,并且python setup.py install仍然处于崩溃状态。就像pip在tox中进行安装(deps = .[test][testenv]部分中),并且从不使用setup.py来安装一样,失败的安装命令也不是问题。

第二个问题是上传。与其用setup.py上传进行上传,不如将此任务转移到麻绳。如果TWINE_USERNAME、TWINE_PASSWORD和TWINE_REPOSITORY_URL不在传统的配置文件中,则它们的最新版本可以从环境中读取它们。

无论如何,我很乐意为第一个问题找到一个更优雅的解决方案,特别是一个没有让setup.py安装中断的解决方案,但是现在就可以了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47292421

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档