具有构建促销的Artifactory PyPi repo布局

时间:2015-03-17 14:56:20

标签: python artifactory

Q1: 我有一个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] 是强制性的:

  

模式' [模块] / [baseRev] / [模块] - [baseRev]。[ext]'必须至少   包含令牌'模块' baseRev'和' org'或者' orgPath'。

我设法通过“黑客攻击”发布了一条路径。包名称为myorg/my_package,但是pip无法找到它,所以它非常有用。

Q2: 有没有人试过" ci-repo"和"发布 - 回购"使用Artifactory推广Python?

我想要实现的目标:

CI repo: my_package-1.2.3+build90.tar.gz当此工件被提升时,构建元数据将被删除

发布回购: my_package-1.2.3.tar.gz

我可以通过回购布局实现这一点(假设我解决了Q1)。问题是如何处理" embedded"我的Python脚本中的版本,在setup.py中硬编码。

我不想再次重建包,以获得最佳实践。

2 个答案:

答案 0 :(得分:3)

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

正如您所提到的,[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并且我们使用该方法来获取最新版本。通过pypi.version发布时添加的python setup.py sdist upload -r local属性不能与REST API一起使用,因此我必须手动添加version属性。说实话很痛苦,因为我们在使用setup.py上传选项时无法添加属性。理想情况下,我希望能够使用pip做所有事情,但目前这是不可能的。

我在Artifactory文档requests中使用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))

答案 1 :(得分:1)

A1:Artifactory布局不具有执行力,您可以将任何路径下的任何文件部署到任何仓库。一些与布局相关的功能(如快照清理)将无法正常工作,但我认为您无论如何都不需要它们。

A2:最佳解决方案是在a promotion user plugin中对您的促销进行编码。在推广到另一个仓库期间动态重命名工件是这种插件最受欢迎的场景之一。