如何从命令行获取Azure管道日志文件

问题描述 投票:0回答:3

我有一个 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 的访问令牌。但怎样才能获得呢?

command-line azure-pipelines
3个回答
2
投票

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) 获取实际日志。

PowerShell 代码片段如下所示。如上所述,使用

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字符,出于我们的目的,我们可以截断这些值,但是如果您关心,您可能需要进一步评估。


0
投票

您可以使用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'

0
投票

解决方案如下:

我的解决方案受到@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 获取相关日志文件。

© www.soinside.com 2019 - 2024. All rights reserved.