如何通过Azure DevOps REST API获取artifact内的文件名字符串
我想编写脚本统计特定文件在Artifact构建中的出现次数,尝试通过Azure DevOps REST API获取Artifact内的文件名,但没找到合适的API。
目前已实现的步骤:
- 获取特定Pipeline的所有Build:
GET https://dev.azure.com/{organization}/{project}/_apis/pipelines/{pipelineId}/runs/{runId}?api-version=7.1-preview.1 - 通过Build ID获取对应的Artifact列表:
GET https://dev.azure.com/{organization}/{project}/_apis/build/builds/{buildId}/artifacts?api-version=7.0
现在能拿到Build对应的所有Artifact,但无法获取Artifact内的文件名字符串。只找到下载特定Artifact文件的API,但这不是我需要的。请问有没有可以获取Artifact内文件信息的REST API?
1. 扩展Build Artifact详情API获取文件列表
针对Build Artifact,在获取单个Artifact的请求中添加$expand=contents参数,即可返回该Artifact包含的文件和目录结构:
GET https://dev.azure.com/{organization}/{project}/_apis/build/builds/{buildId}/artifacts/{artifactName}?api-version=7.1-preview.5&$expand=contents
返回结果的contents数组中,每个元素包含path(文件/目录完整路径)、itemType(区分文件或目录)等字段,可直接提取文件名用于统计。
2. Pipeline Artifact的文件列表查询
如果是Pipeline Artifact,使用以下API并添加$expand=contents参数:
GET https://dev.azure.com/{organization}/{project}/_apis/pipelines/{pipelineId}/runs/{runId}/artifacts/{artifactName}?api-version=7.1-preview.1&$expand=contents
返回结构与Build Artifact类似,可从中提取文件信息。
3. 备选:下载Artifact后本地解析
若上述API因Artifact类型(如通用包)或权限限制无法返回文件列表,可先下载Artifact压缩包,再在本地解压后遍历统计:
GET https://dev.azure.com/{organization}/{project}/_apis/build/builds/{buildId}/artifacts/{artifactName}/content?api-version=7.1-preview.5
该请求会返回Artifact的压缩包,脚本中可自动下载、解压,再遍历文件名称完成统计。
4. 利用GraphQL API查询
通过Azure DevOps GraphQL API也能查询Artifact的文件内容,示例查询语句:
query { organization(name: "{organization}") { project(name: "{project}") { build(buildId: {buildId}) { artifacts { nodes { name contents { nodes { path itemType } } } } } } } }
请求地址为https://dev.azure.com/{organization}/{project}/_apis/graphql?api-version=7.1-preview.1,以POST方式发送该查询即可获取文件列表。
内容的提问来源于stack exchange,提问作者Flavio Condemi

