在构建任务中使用 $(System.AccessToken) 调用 RestMethod 时出错 运行

Error running Invoke-RestMethod with $(System.AccessToken) in a build task

我在尝试使用 $(System.AccessToken) 的值作为凭据访问 REST API 时收到 401(大概)。我 运行 的管道与我正在使用的 API URL 在同一个 ADS 2020 本地服务器上。

构建日志中的错误消息如下:

TF400813: Resource not available for anonymous access. Client authentication required. - Azure DevOps Server

受到 this technique 的启发,这是我的 PowerShell 内联脚本任务中的代码:

$Params = @{
  ContentType = 'application/json'
  Headers = @{ Authorization = 'Bearer $(System.AccessToken)' }
  Method = 'Get'
  Uri = 'http://host/collection/project/_apis/build/builds/' + $(Build.BuildId) + '?api-version=6.0'
}

$Result = Invoke-RestMethod @Params

我也试过这个,借用:

$Params = @{
  ContentType = 'application/json'
  Method = 'Get'
  Uri = 'http://$(System.AccessToken)@host/collection/project/_apis/build/builds/' + $(Build.BuildId) + '?api-version=6.0'
}

$Result = Invoke-RestMethod @Params

我已注意打开 Allow scripts to access the OAuth token 选项,如记录 here

奇怪的是它第一次通过(上面的第一个代码块)。现在,无论我尝试什么,我总是会收到上述错误。

如何在构建任务中使用 $(System.AccessToken) 的值来访问同一服务器上的 REST API?

--编辑--

我也尝试了替代变量语法:

$BuildId = $env:BUILD_BUILDID
$Token = $env:SYSTEM_ACCESSTOKEN

$Params = @{
  ContentType = 'application/json'
  Headers = @{ Authorization = 'Bearer $Token' }
  Method = 'Get'
  Uri = 'http://host/collection/project/_apis/build/builds/' + $BuildId + '?api-version=6.0'
}

$Result = Invoke-RestMethod @Params

苦苦思索后,我终于找到了有效的组合:

$BuildId = $env:BUILD_BUILDID
$Token = $env:SYSTEM_ACCESSTOKEN

$Params = @{
  ContentType = "application/json"
  Method = "Get"
  Uri = "http://host/collection/project/_apis/build/builds/$BuildId"
}

$Result = Invoke-RestMethod @Params -Headers @{ Authorization = "Bearer $Token" }

心血来潮试了一下。我不知道为什么这会通过而其他人不会,但没关系。它运行。我在里面贴了一面旗帜。