在 yml 步骤模板中,我使用 DownloadPipelineArtifact@2 下载从我的构建管道生成的特定工件。
由于工件相当大,并且根据情况,我不需要所有整个工件内容,因此我提供 itemPattern 属性作为我的步骤模板的输入参数,并按原样传递给下载PipelineArtifact@2任务来执行一些过滤操作并加快构建速度。
下面是我实现的步骤模板的简化版本,称为 filteredDownloadArtifact:
parameters:
artifactItemPattern: '**'
steps:
- task: DownloadPipelineArtifact@2
displayName: 'Download artifact'
inputs:
buildType: 'current'
artifactName: 'MyArtifact'
itemPattern: |
${{ parameters.artifactItemPattern}}
当我只提供一种模式时,它似乎工作正常,但当我提供多个要下载的项目模式时,我遇到了一些问题。
例如,在另一个 yml 步骤模板中,我有一个 pwsh 任务,用于确定应下载哪些文件夹
- powershell: |
$itemPattern= (("$(fileCollection)" -split ' ') | ForEach-Object {
$dllName = [System.IO.Path]::GetFileName($_)
$_.replace($dllName, '**')
}) -join "`r`n"
Write-Host "##vso[task.setvariable variable=_itemPattern]$itemPattern"
然后我以这种方式使用filteredDownloadArtifact:
- template: filteredDownloadArtifact.yml
parameters:
artifactItemPattern: |
$(_itemPattern)
但是好像没啥作用。我的步骤模板仅提供一种项目模式。
那么,在传递到 Azure DevOps 步骤模板时是否有不同的方式来使用多行参数?谢谢
我已经检查了您的 YAML 示例。以下是两个限制:
1.使用setvariablelogging命令创建变量时,仅支持一行字符串。如果需要使用多行字符串,则需要使用以下格式对变量进行硬编码:
variables:
- name: emails
value: |
file1
file2
2.setvariablelogging命令会在运行时设置变量,但是模板中的参数:
artifactItemPattern
会在编译时读取该值。在这种情况下,变量值无法成功传递给模板。
要使用参数传递多行字符串,可以使用以下格式:
parameters:
- name: artifactItemPattern
type: object
default: |
file1
file2
steps:
....
- task: DownloadPipelineArtifact@2
displayName: 'Download artifact'
inputs:
buildType: 'current'
artifactName: 'MyArtifact'
itemPattern: ${{ parameters.artifactItemPattern}}
根据您的描述,您需要使用PowerShell设置变量,并根据变量值下载文件。
为了满足这个要求,我建议你可以将Pipelines一分为二。一是用来设置files值并使用Rest API来触发Pipeline二。管道二用于收集输入值并下载工件。
这是一个例子:
管道一:
variables:
- name: fileCollection
value: value1 value2
steps:
- powershell: |
$itemPattern= (("$(fileCollection)" -split ' ') | ForEach-Object {
$dllName = [System.IO.Path]::GetFileName($_)
$_.replace($dllName, '**')
}) -join "\n "
echo $itemPattern
$token = "$(pat)"
$url="https://dev.azure.com/{organizationname}/{ProjectName}/_apis/pipelines/{PipelineID}/runs?api-version=5.1-preview"
$token = [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes(":$($token)"))
$JSON = "
{
`"resources`": {
`"repositories`": {
`"self`": {
`"ref`": `"refs/heads/main`"
}
}
},
`"templateParameters`": {
`"artifactItemPattern`":`"|\n $itemPattern`"
},
}"
$response = Invoke-RestMethod -Uri $url -Headers @{Authorization = "Basic $token"} -Method Post -Body $JSON -ContentType application/json
管道二
parameters:
- name: artifactItemPattern
type: object
steps:
....
- task: DownloadPipelineArtifact@2
displayName: 'Download artifact'
inputs:
buildType: 'current'
artifactName: 'MyArtifact'
itemPattern: ${{ parameters.artifactItemPattern}}
- script: |
cd $(pipeline.workspace)
ls
结果: