Artifactory API-列出软件包版本的所有工件

问题描述

通过Artifactory API列出给定包装的所有资产的最佳方法是什么?

我正在尝试编写脚本来获取软件包的资产,并且希望它可以与多种存储库类型(例如Maven和PyPI)一起使用。我知道我可以使用Folder Info API来获取所需的信息,但这取决于存储库的布局,因此它不适用于所有存储库类型。

我当前正在使用此AQL搜索

curl -u user:password -X POST http://<artifactory_url>/artifactory/api/search/aql \
-H "Content-Type: text/plain" \
-d 'items.find({"repo": "libs-release-local"},{"artifact.module.name": "com.foo.bar:fizz-buzz:1.2"})'

响应几乎是我想要的,但似乎包含了我正在搜索的程序包不同版本中的一些资产:

{
"results" : [ {
  "repo" : "libs-release-local","path" : "com/foo/bar/fizz-buzz/1.0","name" : "fizz-buzz-1.0.properties","type" : "file","size" : 790,"created" : "2020-09-29T15:35:59.233Z","created_by" : "user","modified" : "2020-09-29T15:35:59.181Z","modified_by" : "user","updated" : "2020-09-29T15:35:59.233Z"
},{
  "repo" : "libs-release-local","path" : "com/foo/bar/fizz-buzz/1.1","name" : "fizz-buzz-1.1.properties","created" : "2020-09-29T15:42:34.982Z","modified" : "2020-09-29T15:42:34.931Z","updated" : "2020-09-29T15:42:34.983Z"
},"path" : "com/foo/bar/fizz-buzz/1.2","name" : "fizz-buzz-1.2-javadoc.jar","size" : 391843,"created" : "2020-09-30T18:54:41.599Z","modified" : "2020-09-30T18:54:40.650Z","updated" : "2020-09-30T18:54:41.600Z"
},"name" : "fizz-buzz-1.2-sources.jar","size" : 1089,"created" : "2020-09-30T18:54:41.764Z","modified" : "2020-09-30T18:54:41.710Z","updated" : "2020-09-30T18:54:41.765Z"
},"name" : "fizz-buzz-1.2.jar","size" : 1410,"created" : "2020-09-30T18:54:41.902Z","modified" : "2020-09-30T18:54:41.844Z","updated" : "2020-09-30T18:54:41.903Z"
},"name" : "fizz-buzz-1.2.module","size" : 3481,"created" : "2020-09-30T18:54:42.015Z","modified" : "2020-09-30T18:54:41.962Z","updated" : "2020-09-30T18:54:42.015Z"
},"name" : "fizz-buzz-1.2.pom","size" : 781,"created" : "2020-09-30T18:54:42.238Z","modified" : "2020-09-30T18:54:42.190Z","updated" : "2020-09-30T18:54:42.238Z"
},"name" : "fizz-buzz-1.2.properties","created" : "2020-09-30T18:54:42.124Z","modified" : "2020-09-30T18:54:42.078Z","updated" : "2020-09-30T18:54:42.125Z"
} ],"range" : {
  "start_pos" : 0,"end_pos" : 8,"total" : 8
}
}

请注意,即使我在搜索中指定了1.2,fizz-buzz 1.0和1.1的属性文件也是如此。

是否有更好的方法获取我正在寻找的信息?

解决方法

您可以使用Artifactory 7.9中新增的GraphQL功能。
这项新功能使您可以使用GraphQL查询语言查询Artifactory保留的有关程序包,版本,工件等的丰富元数据。

您可以使用元数据REST API进行查询。请注意,您需要使用admin access token进行身份验证。例如:

curl -H "Authorization: Bearer <Your Token>" -XPOST http://localhost:8082/metadata/api/v1/query -d '{"query":"..." }'

作为示例,以下查询正在获取所有文件,这些文件是名为hello-world的软件包的1.0 *版的一部分。此查询适用于Artifactory中可以管理的任何类型的软件包。

query {
    packages(
        filter: {
            name: "hello-world"
        }
    ) {
        edges {
            node {
                name
                packageType
                versions (filter: {name : "1.0*"}) {
                    name
                    repos {
                        name
                        leadFilePath
                    }
                    files {
                        name
                    }
                }
            }
        }
    }
}

结果看起来像

{
    "data": {
        "packages": {
            "edges": [
                {
                    "node": {
                        "name": "hello-world","packageType": "maven","versions": [
                            {
                                "name": "1.0-SNAPSHOT","repos": [
                                    {
                                        "name": "kotlin-local-snapshots","leadFilePath": "org/jetbrains/kotlin/hello-world/1.0-SNAPSHOT/hello-world-1.0-20171225.112927-1.pom"
                                    }
                                ],"files": [
                                    {
                                        "name": "hello-world-1.0-20171225.112927-1.jar"
                                    },{
                                        "name": "hello-world-1.0-20171225.112927-1.pom"
                                    }
                                ]
                            }
                        ]
                    }
                },{
                    "node": {
                        "name": "hello-world","leadFilePath": "org/jetbrains/kotlin/examples/hello-world/1.0-SNAPSHOT/hello-world-1.0-20171225.112138-1.pom"
                                    }
                                ],"files": [
                                    {
                                        "name": "hello-world-1.0-20171225.112138-1.jar"
                                    },{
                                        "name": "hello-world-1.0-20171225.112138-1.pom"
                                    }
                                ]
                            }
                        ]
                    }
                }
            ]
        }
    }
}
,

在下面的路径中尝试使用以下路径,以便仅在回购库libs-release-local中找到与com / foo / bar / fizz-buzz匹配的工件,然后在末尾添加一些jq以使输出更好。还注意到类型:文件,它消除了metdata方面的一些干扰。

您将需要定义或替换USER,API_KEY和ARTIFACTORY_URL。

curl -su "${USER}:${API_KEY}" -X POST "${ARTIFACTORY_URL}/artifactory/api/search/aql" \
   -H "content-type: text/plain" \
   -d "items.find({\"type\" : \"file\",\"\$and\":[{\"path\" : {\"\$match\" : \"com/foo/bar/fizz-buzz*\"},\"repo\" : {\"\$match\" : \"libs-release-local\"} }]}).include(\"name\",\"repo\",\"path\",\"size\").sort({\"\$desc\": [\"size\"]})" \
|  jq -r "to_entries|map(\"\(.key)=\(.value|tostring)\")|.[]" | grep results | cut -f 2 -d = | jq .

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...