1

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

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

4

1 回答 1

1

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

在这里看到这个类似的问题。

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

1,在您的发布管道中添加第二个阶段。选择触发器为Manual Only。在第二阶段移动 Kubectl 任务和相关任务(即下图的Kubetcl阶段) 在此处输入图像描述

ServiceCon2、在Variablessection中定义一个变量。选择变量Scope到第二阶段(即。Kubetcl)。查看Settable at release time

在此处输入图像描述

3、在第一阶段(即stage)添加脚本任务调用更新发布环境rest api 。SetServiceCon请参见下面的内联 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 tokenSee below screenshot。

在此处输入图像描述

5,您还需要构建服务帐户allowManage deploymentsedit release stage权限。请参见下面的屏幕截图。

在您的发布管道编辑页面中。单击右上角的 3 个点。并选择Security

在此处输入图像描述

Allow该帐户的Manage deploymentsedit release stage权限。(ProjectName)build service (OrgName)

在此处输入图像描述

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

于 2020-09-07T07:05:04.510 回答