YAML azure 管道和模板 - 迭代从主管道传递的字符串中分割的每个值,或使用 bash 将数组作为输出传递

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

我有点坚持这个成就,我希望在我的构建管道中可用。

主要目标是当我已经处于模板表单中时,迭代函数

{{split ',' parameters.PARAMETER_PASSED}}
提取的每个值。

它应该是什么样子:

  1. 构建根据一个脚本而变化的传递字符串
    value1,value2,value3,...,valueX
  2. 模板启动
  3. 对于每个
    valueN
    ,启动具有特定显示名称的脚本(在这种情况下
    ${{ value}}
    就可以了)

您可以在下面找到我迄今为止所取得的成就:

azure-pipelines.yaml

- stage: AutomateScriptContent
    displayName: 'Some new trick'
    jobs:
      - job: CheckFileChanges
        displayName: Prepare list
        steps:
          - checkout: self
            persistCredentials: true
          - bash: |
                #....Something..Something
                echo "##vso[task.setvariable variable=VALUE_LIST;isOutput=true;]value1,value2,value3"
              fi
            displayName: "Check"
            name: check
      - job: TestTemplate
        variables:
          LISTVAL: $[ dependencies.CheckFileChanges.outputs['check.VALUE_LIST'] ]
        displayName: "Do something with values passed from env variable"
        dependsOn: CheckFileChanges
        steps:
        - template: __templates__/test.template.yml
          parameters:
            MY_LIST: $(LISTVAL)

test.template.yml

parameters:
  MY_LIST: ""

steps:
  - variables:
    website: {{split ',' parameters.MY_LIST}}
  # - script: echo "${{ parameters.MY_LIST }}"
  - ${{ each value in var.MY_LIST }}:
    - script: 'echo ${{ value }}'
      displayName: '${{ value }}'

我知道 test.template.yml 不正确,但我不明白如何使其工作!

有什么建议吗?不确定是否可以使用 `echo "##vso[task.setvariable variable=VALUE_LIST;isOutput=true;]$MY_ARRAY"

从 bash/powershell 传递一个新数组

另外一种可接受的解决方案可以将数组的每个值添加为新参数,输出它,然后传递所有参数(不提供如下所示的名称),但我不确定是否可以在不提供每个参数的情况下传递参数每个参数的名称(下面的示例)。

variables:
          LISTVAL: $[ dependencies.CheckFileChanges.outputs['check(GET_ALL_PARAMETERS)'] ]

提前谢谢您。

bash yaml azure-pipelines
1个回答
2
投票

你这里有一些问题。 在你的 test.template.yml 中

  1. steps 序列不能有
    variables
    部分
  2. each
    关键字只能在类型对象的参数上使用。
  3. 没有“分割”功能。

此外,管道“WEBSITE_LIST”中的参数名称与模板“MY_LIST”中定义的名称不匹配

如果你的第一份工作的产出列表是有限的,你可以做如下的事情,但如果列表增长,这将是不可持续的。

管道:

stages:
  - stage: AutomateScriptContent
    displayName: 'Some new trick'
    jobs:
      - job: CheckFileChanges
        displayName: Prepare list
        steps:
          - checkout: self
            persistCredentials: true
          - bash: |
                #....Something..Something
                echo "##vso[task.setvariable variable=value1;isOutput=true;]foo"
                echo "##vso[task.setvariable variable=value2;isOutput=true;]bar"
                echo "##vso[task.setvariable variable=value3;isOutput=true;]lorem"
                echo "##vso[task.setvariable variable=value4;isOutput=true;]ipsum"
            displayName: "Check"
            name: check
            
      - job: TestTemplate
        variables:
          v1: $[ dependencies.CheckFileChanges.outputs['check.value1'] ]
          v2: $[ dependencies.CheckFileChanges.outputs['check.value2'] ]
          v3: $[ dependencies.CheckFileChanges.outputs['check.value3'] ]
          v4: $[ dependencies.CheckFileChanges.outputs['check.value4'] ]
        displayName: "Do something with values passed from env variable"
        dependsOn: CheckFileChanges
        steps:
        - template: __templates__/test.template.yml
          parameters:
            MY_LIST: [$(v1), $(v2), $(v3), $(v4)]

模板

parameters:
  - name: MY_LIST
    type: object

steps:
  - ${{ each value in parameters.MY_LIST }}:
    - script: 'echo ${{ value }}'
      displayName: '${{value}}'

编辑:正如您解释的那样,您不知道第一份工作的输出值数量,这似乎不可能实现。 变量始终是字符串,虽然您可以从第一个作业输出 csv 字符串变量,但没有可用的函数可以将其拆分为数组以用作第二个作业的参数。

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