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

15

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

为此,我正在使用Azure DevOps上的构建管道,即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

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

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

2个回答

20

你可以使用每个函数(如果它在此时可用):

# 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


1
哇,太棒了!谢谢! - cdie
2
@cdie,参数.project定义在哪里?我没有看到任何“project”。 - pradeep
1
需要一个模板文件吗?您能否在一个yaml文件中完成所有工作? - Steve L.
1
@pradeep,我编辑了代码,包括缺失的“projects”节点,并且对我非常有效...到目前为止,我将其用于阶段,我们甚至可以使用条件逻辑来包含/排除这些列表中的项目...在管道语法中拥有通用数组结构非常强大,我相信它被称为msft的管道术语中的“序列”... msft github示例也是错误的...也许自这些示例创建以来规范已经改变。 - Beej
1
你能将一个对象传递给foreach吗?我需要多于1个参数。例如:x86+Release,x86+Debug,x64+Release,x86+Debug。 - kuga
显示剩余2条评论

13

对于上述代码,当我运行构建时遇到了以下异常:

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

我正在尝试类似的东西,但在触发作业时出现错误,任何帮助将不胜感激。

batch.yml

步骤:
  • 模板:template.yml 参数: repos:
    • 'a-b-c'
    • 'x-y-z'
- Devops-Learner

template.yml##

变量: brancName: $(Build.SourceBranchName)参数:
  • 名称:projects 类型:对象 默认值:{}
步骤:
  • ${{ each repo in parameters.repos }}:
    • 任务:TriggerPipeline@1 显示名称:'触发 Azure DevOps 管道:构建' 输入: serviceConnection:'Azure_DevOps_API_Connection' project:ABC Pipeline:'Build' buildDefinition:'${{ repo }}-build-k8s' buildRepo:'${{ repo }}' Branch:$(brancName)
    • 任务:Bash@3 输入: targetType:'inline' script:'sleep 120'
- Devops-Learner
@Devops-Learner,你能为这个问题创建一个单独的提问吗? - Krzysztof Madej
@Devops-Learner 你能为这个问题创建一个单独的提问吗? - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接