Azure devops 任务组参数,类型不是字符串

Azure devops 任务组参数,类型不是字符串,azure-devops,azure-pipelines-release-pipeline,azure-task-groups,Azure Devops,Azure Pipelines Release Pipeline,Azure Task Groups,我有一个用例,我想在任务组中添加一个pickList-type参数。这似乎是可行的;UI呈现良好,使用任务组运行管道时,变量也正确。我理解您不能直接将参数配置为拾取列表,这必须通过JSON手动完成 然后我做了什么: 创建了一个包含“我的任务”和必要变量的任务组。一切正常,变量作为参数出现,$(someType)和$(someValue) 我希望$(someType)变量是选取列表——我导出了所述任务组,从JSON中删除了与原始任务组(id)的所有关系,将我的输入字段编辑为选取列表,并将必要的选

我有一个用例,我想在任务组中添加一个
pickList
-type参数。这似乎是可行的;UI呈现良好,使用任务组运行管道时,变量也正确。我理解您不能直接将参数配置为拾取列表,这必须通过JSON手动完成

然后我做了什么:

  • 创建了一个包含“我的任务”和必要变量的任务组。一切正常,变量作为参数出现,
    $(someType)
    $(someValue)
  • 我希望
    $(someType)
    变量是
    选取列表
    ——我导出了所述任务组,从JSON中删除了与原始任务组(id)的所有关系,将我的输入字段编辑为
    选取列表
    ,并将必要的选项添加到
    选项
    -数组中
  • 使用编辑的值导入所述任务组。很好。在发布管道中使用它。很好
  • 我在任务组中的一个脚本遇到问题,请转到编辑任务组。只要我按下save,它就会将所有参数转换为字符串,现在它显然已经坏了
我已经包含了一个任务组的最小工作JSON示例,其中包含了
多行
选取列表
类型参数

{
“任务”:[
{
“环境”:{
},
“displayName”:“PowerShell脚本”,
“alwaysRun”:错误,
“continueOnError”:false,
“条件”:“successed()”,
“启用”:正确,
“TimeOutingMinutes”:0,
“投入”:{
“targetType”:“内联”,
“文件路径”:“”,
“引数”:“引数”,
“脚本”:“写入主机\“$(picklisttype)\”\n写入主机\“$(mlvalue)\”,
“errorActionPreference”:“停止”,
“failOnStderr”:“false”,
“showWarnings”:“false”,
“ignoreLASTEXITCODE”:“false”,
“pwsh”:“假”,
“工作目录”:”
},
“任务”:{
“id”:“e213ff0f-5d5c-4791-802d-52ea3e7be1f1”,
“版本规范”:“2.*”,
“定义类型”:“任务”
}
}
],
“runsOn”:[
“代理人”,
“部署组”
],
“名称”:“我的任务组和选取列表”,
“版本”:{
"专业":一,,
“小调”:0,
“补丁”:0,
“isTest”:错误
},
“iconUrl”:https://my-own-custom-image.com/images/icon.png",
“friendlyName”:“我的任务组和挑选名单”,
“描述”:“此任务组包含一个选取列表。太棒了。”,
“类别”:“部署”,
“定义类型”:“元任务”,
“作者”:“我自己”,
“要求”:[
],
“团体”:[
],
“投入”:[
{
“别名”:[],
“选择”:{
“选项1”:“第一选项”,
“选项2”:“第二个选项(默认)”,
“选项3”:“第三选项”
},
“属性”:{},
“名称”:“picklisttype”,
“标签”:“选择类型”,
“默认值”:“选项2”,
“必需”:正确,
“类型”:“选择列表”,
“帮助标记”:“只需选择一种类型!”,
“组名”:”
},
{
“别名”:[],
“选项”:{},
“属性”:{},
“名称”:“mlvalue”,
“标签”:“写几行”,
“defaultValue”:“它包含\n多行文本。\n但是,它很小,\n无法改变\n它的外观…”,
“必需”:正确,
“类型”:“多行”,
“帮助标记”:“写一些很棒的文字。”,
“组名”:“,
“visibleRule”:“picklisttype!=选项3”
}
],
“满足”:[
],
“源定义”:[
],
“数据源绑定”:[
],
“instanceNameFormat”:“具有默认值$(picklisttype)的默认名称”,
“作业前执行”:{
},
“执行”:{
},
“作业后执行”:{
}
}
如果导入所述JSON,将任务组添加到发布管道并运行它,您将看到它正确地输出您从选择列表中选择的任何内容

如果随后继续编辑任务组,则在保存任务组后,它将被渲染为断开(将多行和拾取列表转换为字符串类型)


任何对此有经验的人,如果可以以任何方式实现(使用字符串类型以外的参数)?

请不要在UI中更新任务组任务,您应该通过REST API进行更新

通过获取任务组信息

然后通过此更新任务组信息

您可以尝试此power shell脚本来更新power shell打印信息

$url = "https://dev.azure.com/{org name}/{project name}/_apis/distributedtask/taskgroups/{task group ID}?api-version=6.0-preview.1"

$connectionToken="{pat}"

$base64AuthInfo= [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes(":$($connectionToken)"))

$taskGroups = Invoke-RestMethod -Uri $url -Headers @{authorization = "Basic $base64AuthInfo"} -Method Get

#Write-Host $taskGroups.value.tasks.inputs.script

$taskGroups.value.tasks.inputs.script = 'Write-Host "$(picklisttype)"
Write-Host "$(mlvalue)" 
Write-Host "$(picklisttype)"'

$json = $taskGroups.value | ConvertTo-Json -Depth 10

$response = Invoke-RestMethod -Uri $url -ContentType "application/json" -Body $json -Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)} -Method PUT

#Write-Host $taskGroups.value.tasks.inputs.script
结果:

任务组页面:

发布打印信息:


作为对@Vito Liu MSFT答案的扩展,我最终使用了一个简单的PS commandlet(我不是PS脚本专家,因此可能需要改进):

例如:

$tg = Get-TaskGroup -org $org -project $project -tgId $tgId -pat $pat -path $path
$tg = Put-TaskGroup -org $org -project $proj -tgId $tgId -pat $pat -path $path

谢谢,这很有效。我自己也添加了一个答案,扩展了您的脚本,使其更易于使用,因为API通常针对代码,而不是人类
$url = "https://dev.azure.com/{org name}/{project name}/_apis/distributedtask/taskgroups/{task group ID}?api-version=6.0-preview.1"

$connectionToken="{pat}"

$base64AuthInfo= [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes(":$($connectionToken)"))

$taskGroups = Invoke-RestMethod -Uri $url -Headers @{authorization = "Basic $base64AuthInfo"} -Method Get

#Write-Host $taskGroups.value.tasks.inputs.script

$taskGroups.value.tasks.inputs.script = 'Write-Host "$(picklisttype)"
Write-Host "$(mlvalue)" 
Write-Host "$(picklisttype)"'

$json = $taskGroups.value | ConvertTo-Json -Depth 10

$response = Invoke-RestMethod -Uri $url -ContentType "application/json" -Body $json -Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)} -Method PUT

#Write-Host $taskGroups.value.tasks.inputs.script
Function Get-TaskGroup {
    [CmdletBinding()]
        param (
        [Parameter(Mandatory=$true, HelpMessage="DevOps organization")][string]$org,
        [Parameter(Mandatory=$true, HelpMessage="Organization project")][string]$project,
        [Parameter(Mandatory=$true, HelpMessage="Task group ID")][string]$tgId,
        [Parameter(Mandatory=$true, HelpMessage="DevOps PAT")][string]$pat,
        [Parameter(Mandatory=$false, HelpMessage="DevOps PAT")][string]$path
    )
    
    $auth = [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes(":$pat"))
    $url = "https://dev.azure.com/$org/$project/_apis/distributedtask/taskgroups/$tgId`?api-version=6.0-preview.1"
    $tg = Invoke-RestMethod -Uri $url -Headers @{authorization = "Basic $auth"} -Method GET -ErrorAction Stop
    if ($tg -and $tg.value) {
        echo $tg.value
            
        if ($path) {
            echo "$($tg.value | ConvertTo-Json -Depth 10)" > $path
        }
    }
    else {
        throw "Failed to fetch task group with id $tgId"
    }
}

Function Put-TaskGroup {
    [CmdletBinding()]
        param (
        [Parameter(Mandatory=$true, HelpMessage="DevOps organization")][string]$org,
        [Parameter(Mandatory=$true, HelpMessage="Organization project")][string]$project,
        [Parameter(Mandatory=$true, HelpMessage="Task group ID")][string]$tgId,
        [Parameter(Mandatory=$true, HelpMessage="DevOps PAT")][string]$pat,
        [Parameter(Mandatory=$false, HelpMessage="Valid task group object as JSON.")][string]$json,
        [Parameter(Mandatory=$false, HelpMessage="Path to file containing valid task group object as JSON.")][string]$path
    )
    BEGIN {
        if (!$json -and !$path) {
            throw "Must provide either a valid JSON string using the -json parameter or a path to a file with a valid JSON object using the -path parameter."
        }
        ElseIf ($json -and $path) {
            echo "Both -json and -path supplied, using string provided with -json"
        }
        ElseIf (!$json -and $path -and ![System.IO.File]::Exists($path)) {
            throw "$path does not exist"
        }
    }
    PROCESS {
        $body = ""
        if ($json) {
            $body = $json
        }
        else {
            $body = Get-Content $path
        }
        
        $auth = [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes(":$pat"))
        $url = "https://dev.azure.com/$org/$project/_apis/distributedtask/taskgroups/$tgId`?api-version=6.0-preview.1"
        $tg = Invoke-RestMethod -Uri $url -ContentType "application/json" -Body $body -Headers @{authorization = "Basic $auth"} -Method PUT -ErrorAction Stop -TimeoutSec 10
        if ($tg) {
            echo $tg
        }
    }
}
$tg = Get-TaskGroup -org $org -project $project -tgId $tgId -pat $pat -path $path
$tg = Put-TaskGroup -org $org -project $proj -tgId $tgId -pat $pat -path $path