我有一个 Azure 管道。我可以启动 Chrome 并查看日志。但我想从命令行执行这些步骤(实际上
Cygwin
,但恕我直言,这不相关)。
az pipelines run --name $pipeline --branch $branch
此命令在
stdout
上返回 json 文件格式文本。这个 json 有一个条目,名为 logs
:
{
...
"logs": {
"id": 0,
"type": "Container",
"url": "https://dev.azure.com/myazure/a56234f9-0101-5183-b422-db6f8cb55857/_apis/mybuild/mybuilds/1822266/logs"
},
...
}
如果我将“url”复制到
Chrome
,我会得到另一个json
格式的主页,例如:
{"count":27,"value":[{"lineCount":371,"createdOn":"2022-10-17T13:38:14.013Z","lastChangedOn":"2022-10-17T13:38:14.183Z","id":1,"type":"Container","url":"https://dev.azure.com/myazure/...
但是我无法从命令行取回这个
json
数据。我试图通过curl
或wget
。我得到了一个 HTML 页面(充满 JavaScript),而不是 json
答案。
我也尝试过
az
:
az rest --method get --url "$logs_url"
但得到的回应是:
Can't derive appropriate Azure AD resource from --url to acquire an access token. If access token is required, use --resource to specify the resource
Not a json response, outputting to stdout. For binary data suggest use "--output-file" to write to a file
然后我尝试这样做:
az account get-access-token --query accessToken --output tsv > access_token.tsv
az rest --method get --resource access_token.tsv --url "$logs_url"
因此,我认为我应该获得 URL 的访问令牌。但怎样才能获得呢?
Minxin Yu 引用的 Rest API (https://learn.microsoft.com/en-us/rest/api/azure/devops/pipelines/logs/list?view=azure-devops-rest-6.0) 是我发现“正确”的一个仅提供与此运行相关的日志文件的列表。我发现需要过滤该结果,假设最长的日志是“原始日志”,然后转身调用构建日志 API (https://learn.microsoft.com/en -us/rest/api/azure/devops/build/builds/get-build-log?view=azure-devops-rest-6.0) 获取实际日志。
az devops invoke
而不是 az rest
,这允许您重用 az devops
az cli 扩展提供的身份验证令牌/机制。关于如何正确使用它的文档并不多,但是这篇博文让我做到了。
如果有人有更直接的方式来获取此信息,我很乐意使用它而不是下面的方式。更好的是,如果 az devops 可以扩展为开箱即用地支持这一点。
$pipelineLogs = az devops invoke --org "https://dev.azure.com/$organization" --area pipelines --resource logs --route-parameters project=$project pipelineId=$pipelineId runId=$runId --api-version=7.0 | ConvertFrom-Json
$longestLogId = ($pipelineLogs.Logs | Sort-Object -Property lineCount -Descending | Select-Object -First 1).id
$buildLog = (az devops invoke --org "https://dev.azure.com/$organization" --area build --resource logs --route-parameters project=$project buildId=$runId logId=$longestLogId --api-version=7.0 --only-show-errors | ConvertFrom-Json).Value
我必须使用
--only-show-errors
,因为https://github.com/Azure/azure-cli/issues/14426,因为我们的日志包含各种UTF-8字符,出于我们的目的,我们可以截断这些值,但是如果您关心,您可能需要进一步评估。
您可以使用curl调用rest api:https://learn.microsoft.com/en-us/rest/api/azure/devops/pipelines/logs/list?view=azure-devops-rest-6.0
例如
curl https://dev.azure.com/{organization}/{project}/_apis/pipelines/{pipelineId}/runs/{runId}/logs?api-version=6.0-preview.1 ' -H 'Authorization: Basic YourPAT'
解决方案如下:
我的解决方案受到@aolszowka 解决方案的启发
# Retrieve the top log ID
$topLogId = (az devops invoke --area pipelines --resource logs --route-parameters project=$project pipelineId=$pipelineId runId=$runId --api-version=7.0 | ConvertFrom-Json).Logs | Sort-Object -Property lastChangedOn -Descending | Select-Object -First 3 | Sort-Object -Property lineCount -Descending | Select-Object -First 1 | Select-Object -ExpandProperty id
# Output the top log ID for verification
Write-Output $topLogId
# Retrieve the build log using the top log ID
$buildLog = (az devops invoke --org "https://dev.azure.com/$organization" --area build --resource logs --route-parameters project=$project buildId=$runId logId=$topLogId --api-version=7.0 --only-show-errors | ConvertFrom-Json).Value
# Output the build log
Write-Output $buildLog
检索顶部日志 ID:此命令获取特定管道运行的顶部日志 ID。它通过查询 Azure DevOps API 并按 lastChangedOn 属性按降序对日志进行排序来实现此目的。然后选择前 3 条日志,进一步按 lineCount 降序排序,最后选择前 3 个日志 ID 进行进一步处理。
检索构建日志:获取顶级日志 ID 后,此命令将使用另一个 Azure CLI 命令来检索构建日志。它指定项目、构建 ID(运行 ID)和之前获取的顶级日志 ID,以从 Azure DevOps 获取相关日志文件。