Azure Devops 变量组中的 PUT 方法不起作用

问题描述 投票:0回答:1

我正在尝试使用以下方法更新变量组

PUT https://dev.azure.com/{organization}/_apis/distributedtask/variablegroups/{groupId}?api-version=7.2-preview.2

但是它在 powershell 中对我不起作用,有人可以帮我解决这个问题吗

脚本

# Parameters
$organization = "nprod"
$project = "APM"
$pat = "shgksdghiddsfgdertwetrweghdhfgkhsd"  # Your PAT token
$variableGroupName = "Test-Variable-group"
$outputValue = "DaaS"
# Headers for API requests
$headers = @{
    "Content-Type"  = "application/json"
    "Authorization" = "Basic " + [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(":$($pat)"))
}
# Get the list of variable groups to find the ID
$uri = "https://dev.azure.com/$organization/$project/_apis/distributedtask/variablegroups?api-version=6.0-preview.2"
$response = Invoke-RestMethod -Uri $uri -Method Get -Headers $headers
$variableGroup = $response.value | Where-Object { $_.name -eq $variableGroupName }
if ($null -eq $variableGroup) {
    Write-Error "Variable group '$variableGroupName' not found."
    exit 1
}
$variableGroupId = $variableGroup.id
# Construct the body for the update
# First, get the existing variables to avoid overwriting the
$existingVariables = @{}
$variableGroup.variables | ForEach-Object {
    if ($_.Key -ne $null -and $_.Value -ne $null) {
        $existingVariables[$_.Key] = $_.Value
    } else {
        Write-Warning "Skipping variable with null key or value."
    }
}
# Add or update the specific variable
$existingVariables["stoppedCjobs"] = @{
    value = $outputValue
}
$body = @{
    id = $variableGroupId
    name = $variableGroupName
    type = "Vsts"
    variables = $existingVariables
} | ConvertTo-Json -Depth 10
# Update the variable group
#PUT https://dev.azure.com/{organization}/_apis/distributedtask/variablegroups/{groupId}?api-version=7.2-preview.2
$uri = "https://dev.azure.com/$organization/$project/_apis/distributedtask/variablegroups/$variableGroupId"+"?api-version=7.2-preview.2"
$response = Invoke-RestMethod -Uri $uri -Method Put -Headers $headers -Body $body
if ($response -ne $null) {
    Write-Output "Variable group updated successfully."
} else {
    Write-Error "Failed to update the variable group."
}

并出现类似错误


WARNING: Skipping variable with null key or value.
Invoke-RestMethod : {"$id":"1","innerException":null,"message":"Project information name is not valid for variable group.","typeName":"System.ArgumentException, 
mscorlib","typeKey":"ArgumentException","errorCode":0,"eventId":0}
At line:44 char:13
+ $response = Invoke-RestMethod -Uri $uri -Method Put -Headers $headers ...
+             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-RestMethod], WebException
    + FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeRestMethodCommand

想解决这个问题

powershell variables azure-devops azure-pipelines ado
1个回答
0
投票

要正确迭代变量,您需要使用

PSObject.Properties

此外,要更新变量,您必须在 PUT 调用的主体中包含

variableGroupProjectReferences
属性。

参考这个:

# Parameters
$organization = "nprod"
$project = "APM"
$pat = "shgksdghiddsfgdertwetrweghdhfgkhsd"  # Your PAT token
$variableGroupName = "Test-Variable-group"
$outputValue = "DaaS"
# Headers for API requests
$headers = @{
    "Content-Type"  = "application/json"
    "Authorization" = "Basic " + [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(":$($pat)"))
}
# Get the list of variable groups to find the ID
$uri = "https://dev.azure.com/$organization/$project/_apis/distributedtask/variablegroups?api-version=6.0-preview.2"
$response = Invoke-RestMethod -Uri $uri -Method Get -Headers $headers
$variableGroup = $response.value | Where-Object { $_.name -eq $variableGroupName }
if ($null -eq $variableGroup) {
    Write-Error "Variable group '$variableGroupName' not found."
    exit 1
}
$variableGroupId = $variableGroup.id
# Construct the body for the update
# First, get the existing variables to avoid overwriting the
$existingVariables = @{}
$variableGroup.variables.PSObject.Properties | ForEach-Object {
    if ($_.Name -ne $null -and $_.Value -ne $null) {
        $existingVariables[$_.Name] = $_.Value
    } else {
        Write-Warning "Skipping variable with null key or value."
    }
}
# Add or update the specific variable
$existingVariables["stoppedCjobs"] = @{
    value = $outputValue
}
$body = @{
    id = $variableGroupId
    name = $variableGroupName
    variables = $existingVariables
    variableGroupProjectReferences = @(
        @{
            projectReference = @{
                name = $project
            }
            name = $variableGroup.name
        }
    )
} | ConvertTo-Json -Depth 10
# Update the variable group
#PUT https://dev.azure.com/{organization}/_apis/distributedtask/variablegroups/{groupId}?api-version=7.2-preview.2
$uri = "https://dev.azure.com/$organization/_apis/distributedtask/variablegroups/$variableGroupId"+"?api-version=7.2-preview.2"
$response = Invoke-RestMethod -Uri $uri -Method Put -Headers $headers -Body $body
if ($response -ne $null) {
    Write-Output "Variable group updated successfully."
} else {
    Write-Error "Failed to update the variable group."
}
© www.soinside.com 2019 - 2024. All rights reserved.