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

如何解决在 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”。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?