在 Azure DevOps 任务模板中使用多行字符串作为参数

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

在 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 azure-pipelines
1个回答
0
投票

我已经检查了您的 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

结果:

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.