python - 具有构建提升功能的 Artifactory PyPi repo 布局

标签 python artifactory

Q1: 我有一个启用了 Artifactory PyPi 的存储库 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] 是强制性的:

Pattern '[module]/[baseRev]/[module]-[baseRev].[ext]' must at-least contain the tokens 'module', 'baseRev' and 'org' or 'orgPath'.

我设法通过将包名称“破解”到 myorg/my_package 来发布到一个路径,但是 pip 找不到它,所以它非常有用。

Q2: 有没有人尝试过使用 Artifactory 推广 Python 的“ci-repo”和“releases-repo”?

我想实现的目标:

CI repo : my_package-1.2.3+build90.tar.gz 当这个 Artifactory 被提升时构建元数据被删除

发布 repo : my_package-1.2.3.tar.gz

我可以通过 repo 布局实现这一点(前提是我解决了 Q1)。问题是如何处理我的 Python 脚本中的“嵌入式”版本,硬编码在 setup.py 中。

为了最佳实践,我不想再次重建包。

最佳答案

关于您的第一个问题/问题,我遇到了同样的问题。在配置我的系统以使用 pip 发布到 artifactory 时,它使用您描述的格式。

如您所述,[org][orgPath] 是强制性的,这基本上破坏了所有 REST API 功能,例如搜索最新版本等。我我目前正在使用它作为我的 Artifactory 路径模式:

[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,因此我必须手动添加 版本属性。说实话很痛苦,因为在使用 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 = '{0}{1}{2}'.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))

关于python - 具有构建提升功能的 Artifactory PyPi repo 布局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29102415/

相关文章:

maven - 无法在 Artifactory 中配置 Vaadin 插件 maven 存储库

python - 从 artifactory 下载文件,使用 API Key 进行身份验证

python - 有没有一种惯用的方法来建立一个以变量名作为键,值作为值的字典?

python - 我的代码以错误的顺序给我数字

python - 求一个数的除法余数

maven-2 - 将 artifactory 存储库连接到 nexus

artifactory - 删除artifactory中的artifact

python - 使用、准备用于回归的词袋数据

python - 如何对齐 QGraphicsTextItem 的网格?

tomcat - Artifactory rpm 安装已启动但控制台 webapp 无法正常工作