Azure Pipeline:Powershell 任务动态变量询问任务组参数

Azure Pipeline: Powershell task dynamic variable ask in task group parameters

我正在尝试获取最新的测试结果 ID 以在 azure devops 中附加我的屏幕截图。我添加了一个powershell脚本任务,

脚本中的一些变量使用是动态的,天蓝色让我把它们放在任务组参数中,

我刚刚添加了 123 作为默认值,但是这个任务因此失败了。

脚本:

$AzureDevOpsPAT = "123"
$AzureDevOpsAuthenicationHeader = @{Authorization = 'Basic ' + [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(":$($AzureDevOpsPAT)")) }
$UriOrga = "https://dev.azure.com/{org}/{proj}/" 
$uriAccount = $UriOrga + "_apis/test/runs?api-version=6.0"

$response = Invoke-RestMethod -Uri $uriAccount -Headers $AzureDevOpsAuthenicationHeader -Method Get
$testRunsIdSorted = $response.value | sort-object id -Descending
$result = Invoke-RestMethod -Uri https://dev.azure.com/{org}/{proj}/_apis/test/runs/$($testRunsIdSorted[0].id)?api-version=6.0 -Headers $AzureDevOpsAuthenicationHeader -Method Get
Write-Host "results = $($result | ConvertTo-Json -Depth 100)"
Write-Host "##vso[task.setvariable variable=runId]$($result.id | ConvertTo-Json -Depth 100)"

我执行后得到的任务报错;

如何在 powershell 中定义变量?

看起来您正在将 Powershell $ 变量访问器添加到任务组参数。您还在 $() 中包装了一些脚本,这将告诉管道您正在尝试访问任务组变量。那是不正确的。 $() 管道语法用于访问管道变量,但不是本地 powershell 变量。

例如,这是正确的语法:

Write-Host "$(AzureDevOpsPAT)"

您需要更新参数以使用命名变量而不是 Powershell 变量名称。

我已经更新了您的脚本并更正了变量使用:

    $AzureDevOpsAuthenicationHeader = @{Authorization = 'Basic ' + [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(":$(AzureDevOpsPAT)")) }
    $UriOrga = "https://dev.azure.com/{org}/{proj}/" 
    $uriAccount = $UriOrga + "_apis/test/runs?api-version=6.0"

    $response = Invoke-RestMethod -Uri $uriAccount -Headers $AzureDevOpsAuthenicationHeader -Method Get
    $testRunsIdSorted = $response.value | sort-object id -Descending
    $result = Invoke-RestMethod -Uri https://dev.azure.com/{org}/{proj}/_apis/test/runs/$testRunsIdSorted[0].id?api-version=6.0 -Headers $AzureDevOpsAuthenicationHeader -Method Get
    
    $results = $result | ConvertTo-Json -Depth 100
    Write-Host "results = $results"
    Write-Host "##vso[task.setvariable variable=runId]$result.id"

请注意,用此替换当前内容后,您需要返回任务组属性并重置 PAT 的默认值。之后,您需要更新管道以在使用此任务时设置 AzureDevOpsPAT 参数。

这个问题的原因是任务组中定义的变量是环境变量,所以在PowerShell中需要按照环境变量的方式来使用。

例如,您脚本中的 $AzureDevOpsPAT 应该是 $env:AZUREDEVOPSPAT

解决这个问题的一种方法是将参数设为可选。

步骤如下:

  1. 转到您的任务组并单击“导出”。然后会下载任务组的json文件

  2. 编辑 json 文件以将 tasks.inputs.requiredtrue 设置为 false

  3. 创建一个新的任务组并上传编辑好的josn文件。你会发现在使用任务组时不需要输入参数