我正在尝试重构一个在大约 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
是的,这是可能的。你就快到了。您的模板中有一个小错误。
${{ 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 }}'