我有一个多步azure管道,用于根据azure devops工作项中的关键字触发某个作业的执行。 执行的第一步是一个 powershell 脚本,它将逗号分隔的字符串列表存储到“validTags”变量中:
Write-Host "##vso[task.setvariable variable=validTags]$csTags"
完成此步骤后,我正确地看到了按预期格式化的列表:
string1,string2,string3
“validTags”变量然后作为参数传递到另一个管道,我应该在其中拆分此列表并触发单独的作业:
- template: run.yml
parameters:
tags: $(validTags)
directory: 'path\to\tests'
platforms: 'platform1,platform2'
在“运行”管道中,我定义了这个“标签”参数:
parameters:
- name: tags
type: string
default: 'someDefaultValue'
我尝试拆分参数:
- ${{each t in split(parameters.tags, ',')}}:
- script: |
echo 'starting job for ${{t}}'
但是当我执行管道时,“t”中的完整字符串(string1,string2,string3)仍然没有分割。
我注意到,如果我尝试对与“标签”一起传递到 run.yml 管道的“平台”参数执行拆分,它会起作用,所以看来问题与我是有关的事实尝试拆分存储在外部变量中的字符串?
有人有类似问题吗?非常感谢对此的任何帮助。
谢谢
对于那些对这个问题的结果感兴趣的人:
我测试了几种可能的替代解决方案,包括使用全局变量和组变量,但没有成功。
我向 MSFT 工程支持提交了请求,以获取对此的一些见解,他们的回复是:
管道不支持将运行时变量拆分为 目前模板语法 ${{ }} ,我们找不到其他的 满足您的要求的解决方法。带来不便敬请谅解。希望 你可以理解。
因此,为了克服这个问题,我按照最初计划删除了管道级别的拆分,而是将逗号分隔值的字符串传递到模板,并在 Powershell 中添加了必要的处理。
另一种选择是从第一个 PowerShell 脚本步骤中执行所有操作:
您可以使用 powershell 步骤,并在用“包围字符串时要小心” 请参阅Azure Devops Split String函数,下面我正在读取xml文件并解析提取的“20.0.0.0”版本:
- powershell: |
"Build.BuildId = $(Build.BuildId); Build.BuildNumber = $(Build.BuildNumber)"
$packageVersion = "$((Select-Xml -Path '$(models)' -XPath '//PackageVersion').Node.InnerText)"
$packageVersion
$parts = "$packageVersion".Split(".")
$parts
$packageVersion += "-$(Build.BuildNumber)"
"packageVersion $packageVersion"
结果:
Build.BuildId = 261; Build.BuildNumber = 20240612.21;
20.0.0.0
20
0
0
0
packageVersion 20.0.0.0-20240612.21