繁体   English   中英

根据Azure DevOps Rest API对Azure Pipelines Powershell任务进行身份验证

[英]Authenticate Azure Pipelines Powershell task against Azure DevOps Rest API

要求

我的要求是,对于我的Azure devops发布管道,我想使用带有内部版本号和日期(已在带注释的标签上自动设置)的带注释的标签标记特定的提交。

拟议的解决方案

我的解决方案是使用Azure Powershell管道任务,如下所示: 在此处输入图片说明

该任务(现在忽略脚本框中的内容)将使用我设置的Azure订阅,以便向Azure DevOps REST API进行身份验证。 我已经能够使用个人访问令牌(PAT)成功执行我想要的任务,但是对于整个团队来说这不是长期稳定的,我想使用我们的Azure订阅。

问题

我的问题是我不确定如何正确使用Azure订阅的身份验证。 我似乎使用Get-AzureRmContext获取了一些数据(请参见下面的当前代码),然后我发现了一个GitHub问题,它似乎在做同样的事情 该代码获取某种OAuth令牌,但是使用下面的代码,Azure仍然会返回给我我需要登录的信息,因此我认为它不是正确的令牌。 我不明白事情是如何相互影响的。

请注意,我的订阅应具有执行我要执行的操作所需的所有权限。

到目前为止的代码:

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

任何帮助是极大的赞赏!

以下是构建任务的示例: 使用PowerShell脚本自定义构建管道

  1. 您必须启用对令牌的访问(选项允许脚本访问OAuth令牌

在此处输入图片说明

  1. 然后在脚本中使用它。 示例中的脚本:

    $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)"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM