Artifactory 和 Jenkins - 使用 newest/biggest 自定义 属性 获取文件
Artifactory and Jenkins - get file with newest/biggest custom property
我有通用存储库 "my_repo"。我从 jenkins 那里上传文件到路径 my_repo/branch_buildNumber/package.tar.gz 和自定义 属性 "tag" 像“1.9.0”,“1.10.0”等。我想要使用 latest/newest 标签获得 item/file。
我试图从这个 link 修改示例 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
但是我收到 "unknown property desc" 错误。
与大多数 JFrog 客户端一样,Jenkins Artifactory 插件支持用于下载和上传通用文件的文件规范。
描述了文件规范架构 here。创建用于下载文件的文件规范时,您可以选择使用 "pattern" 属性,其中可以包含通配符。例如,以下规范将所有 zip 文件从 my-local-repo 存储库下载到本地 froggy 目录:
{
"files": [
{
"pattern": "my-local-repo/*.zip",
"target": "froggy/"
}
]
}
或者,您可以使用 "aql" 而不是 "pattern"。以下规范提供与前一个相同的结果:
{
"files": [
{
"aql": {
"items.find": {
"repo": "my-local-repo",
"$or": [
{
"$and": [
{
"path": {
"$match": "*"
},
"name": {
"$match": "*.zip"
}
}
]
}
]
}
},
"target": "froggy/"
}
]
}
文件规范中允许的 AQL 语法不包括 Artifactory 查询语言允许的所有内容。例如,您不能使用 "include" 或 "sort" 子句。这些限制已到位,以使响应结构已知且恒定。
然而,无论您选择使用 "pattern" 还是 "aql",排序仍然适用于文件规范。支持抛出 "sortBy"、"sortOrder"、"limit" 和 "offset" 文件规范属性。
例如,以下文件规范将仅下载 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/"
}
]
}
您可以阅读有关文件规范的更多信息 here。
(在这里回答了这个问题后,我们还使用这些示例更新了文件规范文档)。
经过大量测试和实验后,我发现有很多方法可以解决我的主要问题(获取最新版本的软件包),但每种方法都需要一些功能,这些功能在付费版本中可用。就像 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 订阅。
我有通用存储库 "my_repo"。我从 jenkins 那里上传文件到路径 my_repo/branch_buildNumber/package.tar.gz 和自定义 属性 "tag" 像“1.9.0”,“1.10.0”等。我想要使用 latest/newest 标签获得 item/file。
我试图从这个 link 修改示例 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
但是我收到 "unknown property desc" 错误。
与大多数 JFrog 客户端一样,Jenkins Artifactory 插件支持用于下载和上传通用文件的文件规范。 描述了文件规范架构 here。创建用于下载文件的文件规范时,您可以选择使用 "pattern" 属性,其中可以包含通配符。例如,以下规范将所有 zip 文件从 my-local-repo 存储库下载到本地 froggy 目录:
{
"files": [
{
"pattern": "my-local-repo/*.zip",
"target": "froggy/"
}
]
}
或者,您可以使用 "aql" 而不是 "pattern"。以下规范提供与前一个相同的结果:
{
"files": [
{
"aql": {
"items.find": {
"repo": "my-local-repo",
"$or": [
{
"$and": [
{
"path": {
"$match": "*"
},
"name": {
"$match": "*.zip"
}
}
]
}
]
}
},
"target": "froggy/"
}
]
}
文件规范中允许的 AQL 语法不包括 Artifactory 查询语言允许的所有内容。例如,您不能使用 "include" 或 "sort" 子句。这些限制已到位,以使响应结构已知且恒定。
然而,无论您选择使用 "pattern" 还是 "aql",排序仍然适用于文件规范。支持抛出 "sortBy"、"sortOrder"、"limit" 和 "offset" 文件规范属性。 例如,以下文件规范将仅下载 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/"
}
]
}
您可以阅读有关文件规范的更多信息 here。
(在这里回答了这个问题后,我们还使用这些示例更新了文件规范文档)。
经过大量测试和实验后,我发现有很多方法可以解决我的主要问题(获取最新版本的软件包),但每种方法都需要一些功能,这些功能在付费版本中可用。就像 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 订阅。