针对 Azure DevOps Rest 验证 Azure Pipelines Powershell 任务 API
Authenticate Azure Pipelines Powershell task against Azure DevOps Rest API
要求
我的要求是,对于我的 Azure devops 发布管道,我想使用包含构建号和日期(在带注释的标签上自动设置)的带注释的标记来标记特定的提交。
建议的解决方案
我的解决方案是使用 Azure Powershell 管道任务,如下所示:
该任务(现在忽略脚本框中的内容)将使用我设置的 Azure 订阅,以便对 Azure DevOps REST API 进行身份验证。我已经能够使用个人访问令牌 (PAT) 成功地执行我想要的任务,但这对于整个团队来说长期不稳定,我想使用我们的 Azure 订阅。
问题
我的问题是我不确定如何正确使用 Azure 订阅的身份验证。我似乎使用 Get-AzureRmContext 获取了一些数据(请参阅下面的当前代码),然后我找到了 a GitHub issue which seems to do sort of the same thing。该代码获得了某种 OAuth 令牌,但使用下面的代码,Azure 仍然 returns 我需要登录,所以我认为它不是正确的令牌。我不明白事情是如何相互孵化的。
请注意,我的订阅应具有执行我想要的操作所需的所有权限。
到目前为止的代码:
Function Get-AccessToken($tenantId) {
$cache = [Microsoft.IdentityModel.Clients.ActiveDirectory.TokenCache]::DefaultShared
$cacheItem = $cache.ReadItems() | Where-Object { $_.TenantId -eq $tenantId } | Select-Object -First 1
return $cacheItem.AccessToken
}
$context = Get-AzureRmContext
$uri = "https://dev.azure.com/<my_org>/<my_area>/_apis/git/repositories/<project_sha>/annotatedtags?api-version=5.0-preview.1"
$token = Get-AccessToken $context.tenantID
$body = @"
{
"taggedObject": {
"objectId": "$(BUILD.SOURCEVERSION)"
},
"name": "D-$(Build.BuildNumber)",
"message": "dummy"
}
"@
$header = @{"Authorization" = "Bearer" + $token}
Invoke-RestMethod -Uri $uri -Method Post -ContentType "application/json" -Body $body -Headers $header
非常感谢任何帮助!
有构建任务的示例:Use a PowerShell script to customize your build pipeline
- 您必须启用对令牌的访问(选项允许脚本访问 OAuth 令牌)
然后在你的脚本中使用它。来自示例的脚本:
$url = "$($env:SYSTEM_TEAMFOUNDATIONCOLLECTIONURI)$env:SYSTEM_TEAMPROJECTID/_apis/build/definitions/$($env:SYSTEM_DEFINITIONID)?api-version=5.0"
Write-Host "URL: $url"
$pipeline = Invoke-RestMethod -Uri $url -Headers @{
Authorization = "Bearer $env:SYSTEM_ACCESSTOKEN"
}
Write-Host "Pipeline = $($pipeline | ConvertTo-Json -Depth 100)"
要求
我的要求是,对于我的 Azure devops 发布管道,我想使用包含构建号和日期(在带注释的标签上自动设置)的带注释的标记来标记特定的提交。
建议的解决方案
我的解决方案是使用 Azure Powershell 管道任务,如下所示:
该任务(现在忽略脚本框中的内容)将使用我设置的 Azure 订阅,以便对 Azure DevOps REST API 进行身份验证。我已经能够使用个人访问令牌 (PAT) 成功地执行我想要的任务,但这对于整个团队来说长期不稳定,我想使用我们的 Azure 订阅。
问题
我的问题是我不确定如何正确使用 Azure 订阅的身份验证。我似乎使用 Get-AzureRmContext 获取了一些数据(请参阅下面的当前代码),然后我找到了 a GitHub issue which seems to do sort of the same thing。该代码获得了某种 OAuth 令牌,但使用下面的代码,Azure 仍然 returns 我需要登录,所以我认为它不是正确的令牌。我不明白事情是如何相互孵化的。
请注意,我的订阅应具有执行我想要的操作所需的所有权限。
到目前为止的代码:
Function Get-AccessToken($tenantId) {
$cache = [Microsoft.IdentityModel.Clients.ActiveDirectory.TokenCache]::DefaultShared
$cacheItem = $cache.ReadItems() | Where-Object { $_.TenantId -eq $tenantId } | Select-Object -First 1
return $cacheItem.AccessToken
}
$context = Get-AzureRmContext
$uri = "https://dev.azure.com/<my_org>/<my_area>/_apis/git/repositories/<project_sha>/annotatedtags?api-version=5.0-preview.1"
$token = Get-AccessToken $context.tenantID
$body = @"
{
"taggedObject": {
"objectId": "$(BUILD.SOURCEVERSION)"
},
"name": "D-$(Build.BuildNumber)",
"message": "dummy"
}
"@
$header = @{"Authorization" = "Bearer" + $token}
Invoke-RestMethod -Uri $uri -Method Post -ContentType "application/json" -Body $body -Headers $header
非常感谢任何帮助!
有构建任务的示例:Use a PowerShell script to customize your build pipeline
- 您必须启用对令牌的访问(选项允许脚本访问 OAuth 令牌)
然后在你的脚本中使用它。来自示例的脚本:
$url = "$($env:SYSTEM_TEAMFOUNDATIONCOLLECTIONURI)$env:SYSTEM_TEAMPROJECTID/_apis/build/definitions/$($env:SYSTEM_DEFINITIONID)?api-version=5.0"
Write-Host "URL: $url"
$pipeline = Invoke-RestMethod -Uri $url -Headers @{ Authorization = "Bearer $env:SYSTEM_ACCESSTOKEN" }
Write-Host "Pipeline = $($pipeline | ConvertTo-Json -Depth 100)"