Artifactory PyPi repo 布局与构建提升
Posted
技术标签:
【中文标题】Artifactory PyPi repo 布局与构建提升【英文标题】:Artifactory PyPi repo layout with build promotion 【发布时间】:2015-05-20 01:52:04 【问题描述】:第一季度:
我有一个启用了 Artifactory PyPi 的 repo my-pypi-repo,我可以在其中发布我的包。通过 python setup.py -sdist
上传时,我得到这样的结构:
my-pypi-repo|
|my_package|
|x.y.z|
|my_package-x.y.z.tar.gz
问题是这个结构不会匹配 Artifactory 中任何“允许”的 repo 布局,因为 [org] 或 [orgPath] 是强制性的:
模式 '[module]/[baseRev]/[module]-[baseRev].[ext]' 必须至少 包含标记“module”、“baseRev”和“org”或“orgPath”。
我设法通过将包名称“破解”到myorg/my_package
来发布到路径,但是 pip 找不到它,所以它很有用。
第二季度: 有没有人尝试过使用 Artifactory 推广 Python 的“ci-repo”和“releases-repo”?
我想要达到的目标:
CI 回购:
my_package-1.2.3+build90.tar.gz
当这个工件被提升时,构建元数据被删除
发布回购:
my_package-1.2.3.tar.gz
我可以通过 repo 布局来实现这一点(前提是我解决了 Q1)。问题是如何处理我的 Python 脚本中的“嵌入式”版本,在 setup.py 中硬编码。
为了获得最佳实践,我宁愿不再重新构建包。
【问题讨论】:
【参考方案1】:关于您的第一个问题/问题,我遇到了同样的问题。将我的系统配置为使用 pip 发布到工件时,它使用您描述的格式。
正如您所提到的,[org]
或 [orgPath]
是强制性的,这基本上破坏了所有 REST API 功能,例如搜索最新版本等。我目前正在使用它作为我的工件路径模式:
[org]/[module]/[baseRev].([fileItegRev])/[module]-[baseRev].([fileItegRev]).[ext]
问题是 pip 在这种情况下不理解[org]
的概念。我暂时使用 python 脚本将我的包发布到 Artifactory 来解决这个问题。希望 jFrog 团队可以解决这个问题。
python 脚本只是使用 Artifactory 的 REST API 来发布到我的本地 pypi 存储库,添加一些属性以便一些 REST API 函数正常工作,例如 Artifact Latest Version Search Based on Properties。
我需要能够使用该调用,因为我们在内部使用 Chef,并且我们使用该方法来获取最新版本。通过python setup.py sdist upload -r local
发布时添加的pypi.version
属性不适用于REST API,因此我必须手动添加version
属性。说实话很痛苦,因为在 setup.py 中使用上传选项时我们无法添加属性。理想情况下,我希望能够使用 pip 完成所有操作,但目前这是不可能的。
我正在使用 requests 包和 Artifactory 文档 here 中的上传方法。这是我用来发布添加一些属性的功能(如果需要,请随意添加):
def _publish_artifact(name, version, path, summary):
base_url = 'http://server:8081/artifactory/0'.format(PYPI_REPOSITORY)
properties = ';version=0;pypi.name=1;pypi.version=0;pypi.summary=2'\
.format(version, name, summary)
url_path = '/Company/0/1/0-1.zip'.format(name, version)
url = '012'.format(base_url, properties, url_path)
dist_file = r'0\dist\1-2.zip'.format(path, name, version)
files = 'upload_file': open(dist_file, 'rb')
s = requests.Session()
s.auth = ('username', 'password')
reply = s.put(url, files=files)
logger.info('HTTP reply: 0'.format(reply))
【讨论】:
您可以使用pip
在子文件夹中安装上传到 Artifactory 的包吗?我可以应付不使用pip
发布它们,但需要我的用户能够通过 pip 安装包。
是的,您可以搜索并安装手动上传并放置在不同文件夹结构中的软件包:pip3 search my-package --index http://server:8081/artifactory/api/pypi/pypi-test-local
并安装:pip3 install my-package -i http://server:8081/artifactory/api/pypi/pypi-test-local/simple
您是否在为您的 Artifactory pypi 存储库使用促销?
暂时没有,我们目前正在手动移动工件。我们可以,因为我们使用自定义属性标记每个工件。【参考方案2】:
A1:Artifactory 布局不是强制的,您可以将任何文件部署到任何 repo 的任何路径下。一些与布局相关的功能,例如快照清理,届时将无法使用,但我认为您仍然不需要它们。
A2:最好的解决方案是在a promotion user plugin 中编码您的促销活动。在将工件升级到另一个存储库期间动态重命名工件是此类插件最流行的场景之一。
【讨论】:
A1:那些与布局相关的功能正是我所追求的,CI 工件清理就是其中之一。我希望布局被强制执行,顺便说一句。 A2:在我看来,创建一个用于在促销时重命名工件的插件有点矫枉过正,尤其是当您可以通过布局实现相同的效果时。无论如何,我担心的是我的包setup.py
中硬编码的版本,而不是包名本身。
A1:在这种情况下,您必须拥有与组织相对应的目录。可以实施强制执行(通过用户插件,是的)。 A2:使用插件也可以轻松更改文件的内容,例如见renaming the version from SNAPSHOT to release。
A1:我试图弄清楚如何将目录添加到 Python 发布脚本中。对此有任何指示吗? A2:这对我来说看起来很复杂:)。鉴于我们正在谈论 Python 源代码,我认为我最好更改源代码中的版本并再次发布。我能看到的唯一缺点是我失去了这些工件的可追溯性以上是关于Artifactory PyPi repo 布局与构建提升的主要内容,如果未能解决你的问题,请参考以下文章
Artifactory:升级到新的 Artifactory 5.10.3 并支持新的 Pypi 后,本地 Pypi 存储库“慢”
pip 无法从本地 pypi (jfrog artifactory) 找到包
如何从经过身份验证的私有 Artifactory PyPI 存储库中提取 Python 包?