Dans un modèle de pipeline Azure DevOps, je déclare un paramètre en tant que tableau/séquence
parameters:
mySubscription: ''
myArray: []
steps:
- AzureCLI@2
inputs:
azureSubscription: ${{ parameters.mySubscription }}
scriptType: pscore
scriptPath: $(Build.SourcesDirectory)/script.ps1
arguments: '-MyYAMLArgument ${{ parameters.myArray }}'
La valeur du paramètre est ensuite transmise à partir de la définition du pipeline sous la forme
steps:
- template: myTemplate.yml
parameters:
mySubscription: 'Azure-connection'
myArray:
- field1: 'a'
field2: 'b'
- field1: 'aa'
field2: 'bb'
Mon problème est que je ne peux pas transmettre ce tableau tel quel dans la syntaxe YAML (sorte de ToString()
) pour pouvoir consommer et traiter ce tableau de PowerShell dans mon modèle. En essayant d'exécuter ce pipeline, j'obtiens l'erreur suivante: /myTemplate.yml (Line: X, Col: X): Unable to convert from Array to String. Value: Array
. La ligne/colonne référencée dans le message d'erreur correspond à arguments: '-MyYAMLArgument ${{ parameters.myArray }}'
De mon modèle.
J'ai également essayé de mapper le paramètre comme environnement pour mon script
- 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 }}
Cela ne fonctionne pas non plus: /myTemplate.yml (Line: X, Col: Y): A sequence was not expected
. Cette ligne/colonne de temps fait référence à MY_ENV_VAR: ${{ parameters.myArray }}
.
Quelqu'un a-t-il déjà été confronté à une exigence similaire pour transmettre des types complexes (ici un tableau/une séquence d'objets) définis à partir de la définition du pipeline vers un script PowerShell? Si oui, comment y êtes-vous parvenu?
Comment transmettre un paramètre de modèle de pipeline DevOps complexe à un script
Je crains que nous ne puissions pas transmettre des paramètres de modèle de pipeline DevOps complexes à un script PowerShell.
Actuellement, la tâche Azure devops ne prend en charge que le transfert de tableaux unidimensionnels. Il ne peut pas accepter et transférer des tableaux bidimensionnels. Bien que nous puissions définir les paramètres d'un tableau à deux dimensions, nous devons étendre les paramètres d'un modèle par les scripts comme:
- ${{ each field in parameters.myArray}}:
Nous pourrions l'utiliser comme:
- ${{ each step in parameters.buildSteps }}:
#- ${{ each pair in step }}:
- task: PowerShell@2
inputs:
targetType : inline
script: |
Write-Host 'Hello World'
Mais nous ne pouvions pas passer les tableaux à deux dimensions directement à la tâche comme: [field1: 'a', field2: 'b']
. C'est la raison pour laquelle vous avez obtenu l'erreur Unable to convert from Array to String
.
Vous pouvez vérifier le document Extend à partir d'un modèle pour plus de détails.
J'espère que cela t'aides.
Comme @ Leo Liu MSFTmentionné dans sa réponse , cela n'est en effet pas pris en charge pour le moment mais quelqu'un déjà a ouvert un problème pour cette amélioration .
Ce problème contient également une bonne solution de contournement pour l'instant pour utiliser des variables d'environnement à la place. Inconvénient de cette solution est que vous devez être conscient de la structure des données afin de la mapper correctement.
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 }}