将对象传递到 Azure DevOps 管道中的模板

时间:2021-02-26 19:18:18

标签: azure-devops

我正在尝试重构在大约 100 个帐户上运行的 Azure DevOps 作业,目前这些是管道中几乎相同的单个任务。他们碰巧在 AWS 中调用了一些 Cloud Formation,但这并不重要。

我想在管道中有一个模板参数,例如:-

parameters:
- name: stackparams
  type: object
  default:
    - displayname: AWS Test User Account
      awscredentials: TESTAWS-appaccounttest1-AzureDevOps
      templatefile: ./Test/TestApp/SwitchRolesGroupsPolicies.yml
      templateparametersfile: ./Test/LZTestApp/demoparams.json
    - displayname: Second Account
      awscredentials: TESTAWS-appaccounttest2-AzureDevOps
      templatefile: ./Test/Something/SwitchRolesGroupsPolicies.yml
      templateparametersfile: ./Test/Something/demoparams.json

在模板中类似:-

parameters:
- name: stackparams
  type: object

steps:
- ${{ each stackparam in parameters.stackparams }}:
  - checkout: self
  - task: AWSShellScript@1
    inputs:
      awsCredentials: ${{ stackparams.awscredentials }}
      regionName: 'eu-west-1' 
      scriptType: 'inline'
      inlineScript: |
        echo "\$STACKPARAMS_DISPLAYNAME: $STACKPARAMS_DISPLAYNAME"
    displayName: 'This is a test - ${{ stackparams.displayname }}'

但是,我不知道这是否可行,而且关于这样做的文档很少。我暂时只用 AWSShellScript 替换了 Cloud Formation,只是为了进行概念验证。我目前遇到的错误是:-

> /Templates/CfnUpdateStack/CfnUpdateStack.yml (Line: 25, Col: 23):
> Unrecognized value: 'stackparams'. Located at position 1 within
> expression: stackparams.awscredentials. For more help, refer to
> https://go.microsoft.com/fwlink/?linkid=842996
> /Templates/CfnUpdateStack/CfnUpdateStack.yml (Line: 33, Col: 18):
> Unrecognized value: 'stackparams'. Located at position 48 within
> expression: format('Collect Cost Optimisation Data - {0}',
> stackparams.displayname). For more help, refer to
> https://go.microsoft.com/fwlink/?linkid=842996
> /Templates/CfnUpdateStack/CfnUpdateStack.yml (Line: 25, Col: 23):
> Unrecognized value: 'stackparams'. Located at position 1 within
> expression: stackparams.awscredentials. For more help, refer to
> https://go.microsoft.com/fwlink/?linkid=842996
> /Templates/CfnUpdateStack/CfnUpdateStack.yml (Line: 33, Col: 18):
> Unrecognized value: 'stackparams'. Located at position 48 within
> expression: format('Collect Cost Optimisation Data - {0}',
> stackparams.displayname). For more help, refer to
> https://go.microsoft.com/fwlink/?linkid=842996

1 个答案:

答案 0 :(得分:1)

是的,这是可能的。你快到了。您的模板中有一个小错误。 ${{ stackparams.awscredentials }} 应该是 ${{ stackparam.awscredentials }}

如果您使用相同的源代码库,则无需在循环中包含 - checkout: self。因为任务在同一个作业中运行。源代码库只能结帐一次。请参阅以下完整示例:

#azure-pipeline.yaml

parameters:
- name: stackparams
  type: object
  default:
    - displayname: AWS Test User Account
      awscredentials: TESTAWS-appaccounttest1-AzureDevOps
      templatefile: ./Test/TestApp/SwitchRolesGroupsPolicies.yml
      templateparametersfile: ./Test/LZTestApp/demoparams.json
    - displayname: Second Account
      awscredentials: TESTAWS-appaccounttest2-AzureDevOps
      templatefile: ./Test/Something/SwitchRolesGroupsPolicies.yml
      templateparametersfile: ./Test/Something/demoparams.json

trigger: none
pool: 
  vmImage: windows-latest

steps:
- template: stepsTemplate.yml
  parameters:
    stackparams: ${{parameters.stackparams}}  #pass the parameters to template parameters

--

#stepsTemplate.yml

parameters:
- name: stackparams
  type: object

steps:
- ${{ each stackparam in parameters.stackparams }}:
  
  - task: AWSShellScript@1
    inputs:
      awsCredentials: ${{ stackparam.awscredentials }}
      regionName: 'eu-west-1' 
      scriptType: 'inline'
      inlineScript: |
        echo "\$STACKPARAMS_DISPLAYNAME: $STACKPARAMS_DISPLAYNAME"
    displayName: 'This is a test - ${{ stackparam.displayname }}'