将数组作为输入传递给 Azure DevOps YAML 任务

Posted

技术标签:

【中文标题】将数组作为输入传递给 Azure DevOps YAML 任务【英文标题】:Pass array as inputs to Azure DevOps YAML task 【发布时间】:2019-06-29 16:42:58 【问题描述】:

我正在尝试配置一个 CI,它将在 Azure DevOps 上生成 NuGet 包作为工件(稍后将推送到我的 NuGet 服务器)。

为此,我在 Azure DevOps 上使用 Builds Pipelines,YAML 版本。

我有 3 个项目应该构建包。我正在使用NuGetCommand@2 来完成这项任务:

- task: NuGetCommand@2
  inputs:
    command: pack
    packagesToPack: $(Build.SourcesDirectory)/src/HTS_MessageEngine.Communication/HTS_MessageEngine.Communication.csproj
    majorVersion: $(majorVersion)
    minorVersion: $(minorVersion)
    patchVersion: $(patchVersion)
    versioningScheme: byPrereleaseNumber

但是,对于每个项目,我必须将此块复制 3 次。有没有办法在 packagesToPack 参数中指定一组项目?到目前为止,每个包的版本都是一样的,所以我不需要三个不同的块...

注意:这3个项目都是3个NetStandard,包构建的属性直接存储在csproj中

【问题讨论】:

【参考方案1】:

您可以使用每个功能(如果此时它完全可用):

# my-template.yml
parameters:
steps:
- $ each project in parameters.projects :
  - task: PublishBuildArtifacts@1
    displayName: Publish $ project 
    inputs:
      PathtoPublish: '$(Build.ArtifactStagingDirectory)/$ project .zip'
# ci.yml
steps:
- template: my-template.yml
  parameters:
    projects:
    - test1
    - test2

此功能的 Github PR:https://github.com/Microsoft/azure-pipelines-yaml/pull/2#issuecomment-452748467

【讨论】:

哇,太棒了!谢谢! @cdie parameters.project 在哪里定义?我没有看到任何“项目” 是否需要有模板文件?你能在一个 yaml 文件中完成所有操作吗? 从未尝试过,模板的重点是有一个单独的模板来重用它,但如果你扫描 azure devops yaml 文档,你可能会在一个文件中找到这样的示例,我想跨度> @pradeep,我编辑了代码以包含缺少的“项目”节点,并且对我来说工作得非常好......到目前为止我将它用于阶段,我们甚至可以做条件逻辑在这些列表中包含/排除项目......非常强大,可以在管道语法中为我们提供一个通用数组构造,我相信它在 msft 的管道白话中被称为“序列”......这是从中提取的 msft github 示例也是错误的......也许自从这些例子被创建后这个规范发生了变化【参考方案2】:

对于上面的代码,我在运行构建时遇到了这个异常:

my-template.yml (Line: 1, Col: 12): Unexpected value ''

但这对我有用:

# my-template.yml
parameters:
- name: projects
  type: object
  default: 
steps:
- $ each project in parameters.projects :
  - task: PublishBuildArtifacts@1
    displayName: 'Publish $ project 
    inputs:
      PathtoPublish: '$(Build.ArtifactStagingDirectory)/$ project .zip'

然后:

# ci.yml
steps:
- template: my-template.yml
  parameters:
    projects:
    - test1
    - test2

【讨论】:

以上是关于将数组作为输入传递给 Azure DevOps YAML 任务的主要内容,如果未能解决你的问题,请参考以下文章

使用 ACR(天蓝色容器注册表)作为 Azure Devops json 管道的输入

如何将复选框输入添加到 Azure DevOps 任务组?

将单行二维数组作为输入传递给verilog中的模块

在 azure 后端存储中使用状态文件将 terraform 的输出传递到 Azure Devops Pipeline

Azure DevOps YAML 管道从传递的变量中删除引号和双反斜杠

如何将 TFVC 项目从 Azure DevOps 服务器迁移到新的 Azure DevOps 帐户作为 Git 存储库