我在Azure DevOps中有一个发布管道,其中有一个阶段。该阶段包含一个任务“ Kubectl”,用于登录AKS集群。它期望将服务连接作为参数。我的问题是我从上一个任务中获得了服务连接,该任务从“应用程序配置”中读取了值。我从“应用程序配置”中获得的值设置为环境变量,然后我以这种方式echo "##vso[task.setvariable variable=SC]$AKS_SERVICECONNECTION"
进行传递。因此,变量为SC
,我使用$(SC)
在“ Kubectl”登录中设置了服务连接。 $AKS_SERVICECONNECTION
的值正确,我将其打印出来以进行检查。
这不起作用。即使环境变量SC
现在具有正确的值,也不会设置该值。因此,我使用命名空间参数对其进行了测试,并且可以正常工作,但不适用于服务连接。我的问题和假设是服务连接必须在执行时设置,并且不能在下一个任务将使用的上一个任务中设置?
答案 0 :(得分:0)
似乎Kubectl任务的服务连接是在执行任务之前的编译时检索的。
我在发布管道“变量”部分创建了一个测试变量,并使用echo "##vso[task.setvariable..
在脚本任务中更改了测试变量的值。我在任务日志中看到总是选择测试变量的原始值。
看到类似的问题here。
但是,您可以使用rest api作为解决方法。请参阅以下步骤:
1,在发布管道中添加第二阶段。选择触发器为Manual Only
。在第二阶段(即下面的屏幕快照中的Kubetcl
阶段)移动Kubectl任务和相关任务
2,在ServiceCon
部分中定义变量Variables
。选择第二阶段的变量Scope
(即Kubetcl
)。选中Settable at release time
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
,请参见下面的屏幕截图。
5,您还需要对构建服务帐户拥有allow
和Manage deployments
的权限。请参见下面的屏幕截图。
在您的发布管道编辑页面中。单击右上角的3个点。然后选择edit release stage
。
Security
对Allow
帐户的Manage deployments
和edit release stage
权限。
完成上述步骤后,当触发您的发布任务时,将首先执行第一阶段,脚本任务将调用更新发布环境rest api。然后,第二阶段将使用更新的服务连接名称触发