Can';t更改Azure DevOps发布管道任务中的服务连接

Can';t更改Azure DevOps发布管道任务中的服务连接,azure,azure-devops,azure-pipelines-release-pipeline,serviceconnection,Azure,Azure Devops,Azure Pipelines Release Pipeline,Serviceconnection,我在Azure DevOps中有一个发布管道,只有一个阶段。该阶段包含登录AKS集群的任务“Kubectl”。它需要一个服务连接作为参数。我的问题是,我从上一个任务获取服务连接,该任务从“应用程序配置”读取值。我从应用程序配置中获得的值被设置为一个环境变量,然后通过这种方式传递echo“##vso[task.setvariable=SC]$AKS\u SERVICECONNECTION”。所以变量是SC,我在“Kubectl”中设置了服务连接-使用$(SC)登录$AKS_SERVICECONNE

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


这不管用。即使环境变量
SC
现在具有正确的值,也不会设置该值。因此,我使用namespace参数对其进行了测试,这是可行的,但不适用于服务连接。我的问题和假设是,必须在执行时设置服务连接,而不能在后续任务将使用的上一个任务中设置服务连接?

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

看看这个类似的问题

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

1,在发布管道中添加第二个阶段。选择触发器作为
仅手动
。将Kubectl任务和相关任务移动到第二个阶段(即下面屏幕截图中的
Kubetcl
阶段)

2、在
变量
部分定义变量
ServiceCon
。选择变量
范围
,进入第二阶段(即
Kubetcl
)。检查
在发布时可设置

3、添加脚本任务以在第一阶段(即
SetServiceCon
stage)调用更新。请参见下面的内联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)
,您需要转到第一阶段的编辑页面,并选中选项
允许脚本访问OAuth令牌
,请参见下面的屏幕截图

5,您还需要
允许
管理部署
编辑发布阶段
对生成服务帐户的权限。请参见下面的屏幕截图

在发布管道编辑页面中。单击右上角的3个点。然后选择
安全性

允许
管理部署
编辑发布阶段
(ProjectName)生成服务(OrgName)
帐户的权限


完成上述步骤后,当您的发行版被触发时,第一阶段将首先执行,脚本任务将调用更新发行版环境rest api。然后,第二阶段将使用更新的服务连接名称触发
SC
它是服务名称或id?
$(SC)
是我在服务连接字段中设置的变量的名称。这意味着我在应用程序配置任务之后的Bash任务中,在使用服务连接名称的
kubectl
-登录任务之前,为其分配了一个变量
SC
,该任务使用$(SC).这我理解,但这个变量的值是什么?服务连接名称还是服务连接id?啊,对不起,值是服务连接的名称如果可以,尝试将idI在经典编辑器上测试您的解决方案,它正在工作,谢谢!您知道是否可以在YAML管道上执行此操作吗?我找不到用于更新管道的rest api:/