【发布时间】:2017-11-14 18:01:35
【问题描述】:
我设置了一个 Python 构建管道,其中一个 Jfrog Artifactory Python 存储库为我们的内部包提供服务。
管道使用此存储库来解决内部依赖关系并上传构建工件。
目前这是通过python setup.py bdist_wheel sdist upload -r local 完成的。此命令实际上要求凭据在磁盘上两次;一次用于通过 ~/.pydistutils.cfg 解决本地依赖关系:
[easy_install]
index_url=https://username:password@artifactory/api/repo/path/simple
...再次在 ~/.pypirc 中上传构建包:
[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 命令会导致堆栈跟踪出现以下错误:
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!我想避免这种方法,因为它在创建全局运行时构建依赖项的意义上是脆弱的。将来,有人可以假设已经创建了配置文件而不自己创建了一个作业,并且它几乎总是可以工作,因为另一个作业首先运行。我无法在每次构建后删除该文件,因为可能存在需要该文件存在的并发构建。
【问题讨论】:
标签: python artifactory setuptools