Azure DevOpsパイプラインテンプレートで、パラメーターを配列/シーケンスとして宣言しています
_parameters:
mySubscription: ''
myArray: []
steps:
- AzureCLI@2
inputs:
azureSubscription: ${{ parameters.mySubscription }}
scriptType: pscore
scriptPath: $(Build.SourcesDirectory)/script.ps1
arguments: '-MyYAMLArgument ${{ parameters.myArray }}'
_
次に、パラメーターの値がパイプライン定義から次のように渡されます。
_steps:
- template: myTemplate.yml
parameters:
mySubscription: 'Azure-connection'
myArray:
- field1: 'a'
field2: 'b'
- field1: 'aa'
field2: 'bb'
_
私の問題は、テンプレートでPowerShellからその配列を使用および処理できるように、YAML構文(ToString()
の種類)でその配列をそのまま渡すことができないことです。このパイプラインを実行しようとすると、次のエラーが発生します:/myTemplate.yml (Line: X, Col: X): Unable to convert from Array to String. Value: Array
。エラーメッセージで参照されている行/列は、テンプレートの_arguments: '-MyYAMLArgument ${{ parameters.myArray }}'
_に対応しています。
また、スクリプトの環境としてパラメーターをマップしようとしました
_- AzureCLI@2
inputs:
azureSubscription: ${{ parameters.mySubscription }}
scriptType: pscore
scriptPath: $(Build.SourcesDirectory)/script.ps1
arguments: '-MyYAMLArgument $Env:MY_ENV_VAR'
env:
MY_ENV_VAR: ${{ parameters.myArray }}
_
これも機能しません:/myTemplate.yml (Line: X, Col: Y): A sequence was not expected
。そのタイムライン/列は_MY_ENV_VAR: ${{ parameters.myArray }}
_を参照しています。
誰かが、パイプライン定義からPowerShellスクリプトに定義された複雑な型(ここではオブジェクトの配列/シーケンス)を渡すという同様の要件に直面したことがありますか?もしそうなら、どのようにそれを達成しましたか?
複雑なDevOpsパイプラインテンプレートパラメーターをスクリプトに渡す方法
複雑なDevOpsパイプラインテンプレートパラメーターをPowerShellスクリプトに渡すことができなかったと思います。
現在、Azure devopsのタスクは1次元配列の転送のみをサポートしています。 2次元配列を受け入れて転送することはできません。 2次元配列のパラメーターを定義できますが、次のようなスクリプトを使用して、テンプレートからパラメーターを拡張する必要があります。
- ${{ each field in parameters.myArray}}:
次のように使用できます。
- ${{ each step in parameters.buildSteps }}:
#- ${{ each pair in step }}:
- task: PowerShell@2
inputs:
targetType : inline
script: |
Write-Host 'Hello World'
しかし、2次元配列を[field1: 'a', field2: 'b']
のようなタスクに直接渡すことはできませんでした。エラーUnable to convert from Array to String
が発生したのはそのためです。
詳細については、ドキュメント テンプレートから拡張 を確認してください。
お役に立てれば。
@ Leo Liu MSFT回答で言及 のように、これは実際には現在サポートされていませんが、誰かがすでにサポートしています この改善のために問題をオープンしました 。
この問題には、代わりに環境変数を使用するための適切な回避策も含まれています。このソリューションの欠点は、適切にマッピングするためにデータ構造を認識する必要があることです。
parameters:
mylist:[]
#where mylist is a sequence of object matching the mapping:
#- name: 'the name 1'
# value: 'the value of 1'
# index: 0
#- name: 'the name 2'
# value: 'the value of 2'
# index: 1
env:
${{ each item in parameters.mylist }}:
${{ format('SCRIPT_PARAM_{0}_KEY', item.index) }}: ${{ item.name }}
${{ format('SCRIPT_PARAM_{0}_VAL', item.index) }}: ${{ item.value }}