如何通过Azure DevOps CLI或API获取多仓库流水线的分支与提交ID?
在Azure DevOps YAML流水线中获取多仓库资源的分支与提交ID
可以通过Azure DevOps CLI或者ADO REST API实现需求,以下是两种方案的具体PowerShell脚本,均可获取所有配置的仓库资源信息,以及指定仓库的分支和提交ID。
方案一:使用Azure DevOps CLI实现
前置条件
- 已安装Azure DevOps CLI(可通过
az extension add --name azure-devops安装) - 已完成ADO CLI登录(流水线内运行时可自动使用系统身份,本地运行需执行
az devops login --org <组织URI>)
PowerShell脚本
# 流水线内可直接使用预定义环境变量,本地运行需手动替换为实际值 $organizationUri = $env:SYSTEM_COLLECTIONURI $projectName = $env:SYSTEM_TEAMPROJECT $buildId = $env:BUILD_BUILDID # 获取当前流水线运行的完整详情 $runDetails = az pipelines runs show --org $organizationUri --project $projectName --id $buildId --output json | ConvertFrom-Json # 提取所有配置的仓库资源 $allRepoResources = $runDetails.resources.repositories # 输出所有仓库资源信息 Write-Host "所有仓库资源信息:" $allRepoResources | ForEach-Object { Write-Host "------------------------" Write-Host "仓库别名:$($_.alias)" Write-Host "仓库ID:$($_.repository.id)" Write-Host "完整分支引用:$($_.refName)" Write-Host "提交ID:$($_.version.id)" } # 获取指定别名的仓库信息(替换为你的目标仓库别名) $targetAlias = "repo2" $targetRepo = $allRepoResources | Where-Object { $_.alias -eq $targetAlias } if ($targetRepo) { Write-Host "`n目标仓库($targetAlias)详情:" Write-Host "分支名:$($targetRepo.refName -replace 'refs/heads/','')" Write-Host "提交ID:$($targetRepo.version.id)" } else { Write-Host "`n未找到别名为$targetAlias的仓库资源" }
方案二:使用ADO REST API实现
前置条件
- 拥有个人访问令牌(PAT),需赋予
Build(读取)和Code(读取)权限 - 流水线内运行时,需在代理作业中勾选「允许脚本访问OAuth令牌」,可直接使用
SYSTEM_ACCESSTOKEN作为PAT
PowerShell脚本
# 流水线内使用预定义变量,本地运行手动替换参数 $organizationUri = $env:SYSTEM_COLLECTIONURI $buildId = $env:BUILD_BUILDID $pat = $env:SYSTEM_ACCESSTOKEN # 本地运行替换为你的PAT字符串 # 构建API请求URL $apiUrl = "$organizationUri/_apis/build/builds/$buildId?api-version=7.1-preview.7&includeResources=true" # 构建认证头 $base64Auth = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(":$pat")) $headers = @{ Authorization = "Basic $base64Auth" } # 发送API请求获取流水线详情 try { $runDetails = Invoke-RestMethod -Uri $apiUrl -Headers $headers -Method Get -ContentType "application/json" } catch { Write-Host "API请求失败:$($_.Exception.Message)" exit 1 } # 提取所有仓库资源 $allRepoResources = $runDetails.resources.repositories # 输出所有仓库资源信息 Write-Host "所有仓库资源信息:" $allRepoResources | ForEach-Object { Write-Host "------------------------" Write-Host "仓库别名:$($_.alias)" Write-Host "仓库名称:$($_.repository.name)" Write-Host "完整分支引用:$($_.refName)" Write-Host "提交ID:$($_.version.id)" } # 获取指定别名的仓库信息 $targetAlias = "repo2" $targetRepo = $allRepoResources | Where-Object { $_.alias -eq $targetAlias } if ($targetRepo) { Write-Host "`n目标仓库($targetAlias)详情:" Write-Host "分支名:$($targetRepo.refName -replace 'refs/heads/','')" Write-Host "提交ID:$($targetRepo.version.id)" } else { Write-Host "`n未找到别名为$targetAlias的仓库资源" }
关键说明
- 两种方案返回的
resources.repositories集合包含所有通过YAML流水线resources配置的仓库 refName为完整分支引用(如refs/heads/main),可通过字符串替换提取短分支名version.id即为该仓库在流水线运行时使用的提交ID
内容的提问来源于stack exchange,提问作者NK94
相关产品推荐
相关产品推荐

