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,它就会将所有参数转换为字符串,现在它显然已经坏了
多行
和选取列表
类型参数
{
“任务”:[
{
“环境”:{
},
“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