无法在Azure DevOps发布管道任务中更改服务连接

时间:2020-09-05 19:34:29

标签: azure azure-devops azure-pipelines-release-pipeline serviceconnection

我在Azure DevOps中有一个发布管道,其中有一个阶段。该阶段包含一个任务“ Kubectl”,用于登录AKS集群。它期望将服务连接作为参数。我的问题是我从上一个任务中获得了服务连接,该任务从“应用程序配置”中读取了值。我从“应用程序配置”中获得的值设置为环境变量,然后我以这种方式echo "##vso[task.setvariable variable=SC]$AKS_SERVICECONNECTION"进行传递。因此,变量为SC,我使用$(SC)在“ Kubectl”登录中设置了服务连接。 $AKS_SERVICECONNECTION的值正确,我将其打印出来以进行检查。

这不起作用。即使环境变量SC现在具有正确的值,也不会设置该值。因此,我使用命名空间参数对其进行了测试,并且可以正常工作,但不适用于服务连接。我的问题和假设是服务连接必须在执行时设置,并且不能在下一个任务将使用的上一个任务中设置?

1 个答案:

答案 0 :(得分:0)

似乎Kubectl任务的服务连接是在执行任务之前的编译时检索的。 我在发布管道“变量”部分创建了一个测试变量,并使用echo "##vso[task.setvariable..在脚本任务中更改了测试变量的值。我在任务日志中看到总是选择测试变量的原始值。

看到类似的问题here

但是,您可以使用rest api作为解决方法。请参阅以下步骤:

1,在发布管道中添加第二阶段。选择触发器为Manual Only。在第二阶段(即下面的屏幕快照中的Kubetcl阶段)移动Kubectl任务和相关任务 enter image description here

2,在ServiceCon部分中定义变量Variables。选择第二阶段的变量Scope(即Kubetcl)。选中Settable at release time

enter image description here

3,添加脚本任务以在第一阶段(即SetServiceCon阶段)调用更新release environment rest api。请参见下面的内联Powershell脚本:在上一个任务中,为变量SC分配了服务连接名称。

$url = "https://vsrm.dev.azure.com/Org/Project/_apis/Release/releases/$(Release.ReleaseId)/environments/$($(Release.EnvironmentId)+1)?api-version=6.1-preview.7"

#override the variable ServiceCon by referencing to variable $(SC) from your previous task
$body = @{
  status= "inProgress";
  variables= @{ ServiceCon= @{value= $(SC)}}
}

Invoke-RestMethod -Uri $url -Headers @{Authorization = "Bearer $(System.AccessToken)"} -Method patch -Body (ConvertTo-Json $body) -ContentType "application/json"

上面的脚本将使用更新的服务连接名称触发第二阶段(即kubetcl阶段)

4,为了在上一步中访问令牌$(System.AccessToken),您需要转到第一阶段的编辑页面并选中选项Allow scripts to access the OAuth token,请参见下面的屏幕截图。

enter image description here

5,您还需要对构建服务帐户拥有allowManage deployments的权限。请参见下面的屏幕截图。

在您的发布管道编辑页面中。单击右上角的3个点。然后选择edit release stage

enter image description here

SecurityAllow帐户的Manage deploymentsedit release stage权限。

enter image description here

完成上述步骤后,当触发您的发布任务时,将首先执行第一阶段,脚本任务将调用更新发布环境rest api。然后,第二阶段将使用更新的服务连接名称触发