1

我有通用存储库“my_repo”。我从詹金斯那里上传了文件,路径为 my_repo/branch_buildNumber/package.tar.gz 和自定义属性“标签”,如“1.9.0”、“1.10.0”等。我想获取最新的项目/文件/最新的标签。

我试图从此链接修改示例 2 ... https://www.jfrog.com/confluence/display/JFROG/Using+File+Specs#UsingFileSpecs-Examples

...并添加排序并限制它在这里完成的方式... https://www.jfrog.com/confluence/display/JFROG/Artifactory+Query+Language#ArtifactoryQueryLanguage-limitDisplayLimitsandPagination

但我收到“未知属性描述”错误。

詹金斯代码

4

2 回答 2

2

与大多数 JFrog 客户端一样,Jenkins Artifactory 插件支持用于下载和上传通用文件的文件规范。文件规范架构在此处描述。在为下载文件创建文件规范时,您可以选择使用“模式”属性,其中可以包含通配符。例如,以下规范将 my-local-repo 存储库中的所有 zip 文件下载到本地 froggy 目录中:

{
    "files": [
        {
            "pattern": "my-local-repo/*.zip",
            "target": "froggy/"
        }
    ]
}

或者,您可以使用“aql”而不是“模式”。以下规范提供与前一个相同的结果:

{
  "files": [
    {
      "aql": {
        "items.find": {
          "repo": "my-local-repo",
          "$or": [
            {
              "$and": [
                {
                  "path": {
                    "$match": "*"
                  },
                  "name": {
                    "$match": "*.zip"
                  }
                }
              ]
            }
          ]
        }
      },
      "target": "froggy/"
    }
  ]
}

File Specs 中允许的 AQL 语法不包括 Artifactory Query Language 允许的所有内容。例如,您不能使用“include”或“sort”子句。这些限制已经到位,以使响应结构已知且恒定。

但是,无论您选择使用“模式”还是“aql”,文件规范仍然可以进行排序。支持抛出“sortBy”、“sortOrder”、“limit”和“offset”文件规范属性。例如,以下 File Spec 将仅下载 3 个最大的 zip 文件:

{
  "files": [
    {
      "aql": {
        "items.find": {
          "repo": "my-local-repo",
          "$or": [
            {
              "$and": [
                {
                  "path": {
                    "$match": "*"
                  },
                  "name": {
                    "$match": "*.zip"
                  }
                }
              ]
            }
          ]
        }
      },
      "sortBy": ["size"],
      "sortOrder": "desc",
      "limit": 3,
      "target": "froggy/"
    }
  ]
}

你可以用“pattern”代替“aql”做同样的事情:

{
  "files": [
    {
      "pattern": "my-local-repo/*.zip",
      "sortBy": ["size"],
      "sortOrder": "desc",
      "limit": 3,
      "target": "local/output/"
    }
  ]
}

您可以在此处阅读有关文件规范的更多信息。

(在此处回答此问题后,我们还使用这些示例更新了 File Specs 文档)。

于 2020-04-05T17:51:13.867 回答
0

经过大量测试和试验后,我发现有很多方法可以解决我的主要问题(获取最新版本的软件包),但每种方法都需要一些付费版本中可用的功能。就像 AQL 中的 sort() 或 REST API 中的 [RELEASE]。但我发现我仍然可以获得带有完整文件列表及其属性的 JSON。我也可以下载每个文件。这使我使用简单的 python 脚本解决了问题。我不能全部发布,只能发布应该相当明显的核心

import requests, argparse
from packaging import version

...

query="""
items.find({
  "type" : "file",
  "$and":[{
    "repo" : {"$match" : \"""" + args.repository +  """\"}, 
    "path" : {"$match" :  \"""" + args.path +  """\"} 
    }]
}).include("name","repo","path","size","property.*")
"""       
auth=(args.username,args.password) 


def clearVersion(ver: str):
    new = ''
    for letter in ver:
        if letter.isnumeric() or letter == ".":
            new+=letter
    return new

def lastestArtifact(response: requests):
    response = response.json()
    latestVer = "0.0.0"
    currentItemIndex = 0
    chosenItemIndex = 0
    for results in response["results"]:
        for prop in results['properties']:
            if prop["key"] == "tag":
                if version.parse(clearVersion(prop["value"])) > version.parse(clearVersion(latestVer)):
                    latestVer = prop["value"]
                    chosenItemIndex = currentItemIndex 
        currentItemIndex += 1
    return response["results"][chosenItemIndex]

req = requests.post(url,data=query,auth=auth)
if args.verbose:
    print(req.text)

latest = lastestArtifact(req)
...

我只想指出这不是永久的解决方案。我们只是因为一个问题而不想购买许可证。但是如果会有更多这样的问题,那么我们肯定会购买 PRO 订阅。

于 2020-04-09T07:51:28.330 回答