在 Azure DevOps 中,是否可以使用 API 递归枚举子管道构建工件?

问题描述

在 Azure DevOps 中,我想从管道构建中获取递归工件元素的列表。如果我不必下载整个工件根对象,那就太好了。有谁知道如何用当前的 API 做到这一点?

门户已在管道工件视图中支持功能。您可以打开和浏览子工件,并可以下载。然而,该 API 似乎不支持此用例。

enter image description here

当前 API https://docs.microsoft.com/en-us/rest/api/azure/devops/build/Artifacts/List?view=azure-devops-rest-6.0#buildartifact

我找到了对该功能的请求,但我不确定它是否会很快实施。 https://developercommunity.visualstudio.com/idea/1300697/api-list-artifacts-enumerate-recursively-same-as-w.html

有没有其他人能够解决这个问题?

解决方法

这并未记录在案,但您可以使用与在 Azure DevOps 上完成的相同的 API 调用。所以会是

Post https://dev.azure.com/{organization1}/_apis/Contribution/HierarchyQuery/{projectId}?api-version=5.0-preview.1

就我而言是

https://dev.azure.com/thecodemanual/_apis/Contribution/HierarchyQuery/project/4fa6b279-3db9-4cb0-aab8-e06c2ad550b2?api-version=5.0-preview.1

具有与此类似的类似负载:

{
    "contributionIds": [
        "ms.vss-build-web.run-artifacts-data-provider"
    ],"dataProviderContext": {
        "properties": {
            "artifactId": 1158,"buildId": 7875,"sourcePage": {
                "url": "https://dev.azure.com/thecodemanual/DevOps%20Manual/_build/results?buildId=7875&view=artifacts&pathAsName=false&type=publishedArtifacts","routeId": "ms.vss-build-web.ci-results-hub-route","routeValues": {
                    "project": "DevOps Manual","viewname": "build-results","controller": "ContributedPage","action": "Execute","serviceHost": "be1a2b52-5ed1-4713-8508-ed226307f634 (thecodemanual)"
                }
            }
        }
    }
}

所以你会得到这样的回应:

{
    "dataProviderSharedData": {},"dataProviders": {
        "ms.vss-web.component-data": {},"ms.vss-web.shared-data": null,"ms.vss-build-web.run-artifacts-data-provider": {
            "buildId": 7875,"buildNumber": "20201114.2","definitionId": 72,"definitionName": "kmadof.hadar","items": [
                {
                    "artifactId": 1158,"name": "/hadar.zip","sourcePath": "/hadar.zip","size": 1330975,"type": "file","items": null
                },{
                    "artifactId": 1158,"name": "/scripts","sourcePath": "/scripts","size": 843,"type": "directory","items": [
                        {
                            "artifactId": 1158,"name": "/scripts/check-hadar-settings.ps1","sourcePath": "/scripts/check-hadar-settings.ps1","size": 336,"items": null
                        },{
                            "artifactId": 1158,"name": "/scripts/check-webapp-settings.ps1","sourcePath": "/scripts/check-webapp-settings.ps1","size": 507,"items": null
                        }
                    ]
                }
            ]
        }
    }
}

当然,您需要使用 PAT 令牌来授权您的请求。

,

您可以尝试以下步骤:

  1. 执行 Artifacts API 的端点“Artifacts - Get Artifact”。从响应正文中,您可以像这样看到“downloadUrl”的值。
https://artprodcus3.artifacts.visualstudio.com/{organization_ID}/{project_ID}/_apis/artifact/{object_ID}/content?format=zip

enter image description here

此 URL 用于将整个工件下载 (GET) 作为 ZIP 文件。

  1. 如果您想下载工件中的指定子文件夹或文件。
  • 要下载工件中的指定子文件夹,您可以执行以下端点。

    GET https://artprodcus3.artifacts.visualstudio.com/{organization_ID}/{project_ID}/_apis/artifact/{object_ID}/content?format=zip&subPath={/path/to/the/folder}
    

    例如:

    GET https://artprodcus3.artifacts.visualstudio.com/{organization_ID}/{project_ID}/_apis/artifact/{object_ID}/content?format=zip&subPath=/ef-tools
    

    这将从您的工件“ef-tools”下载文件夹“drop”及其内容作为 ZIP 文件。

  • 要下载工件中的指定文件,您可以执行以下端点。

    GET https://artprodcus3.artifacts.visualstudio.com/{organization_ID}/{project_ID}/_apis/artifact/{object_ID}/content?format=file&subPath={/path/to/the/file}
    

    例如:

    GET https://artprodcus3.artifacts.visualstudio.com/{organization_ID}/{project_ID}/_apis/artifact/{object_ID}/content?format=file&subPath=/ef-tools/migrate.exe
    

    这将从您的工件“ef-tools/migrate.exe”下载文件“drop”。

相关问答

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