web-dev-qa-db-fra.com

Comment transmettre un paramètre de modèle de pipeline DevOps complexe à un script

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?

3
GGirard

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.

0
Leo Liu-MSFT

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 }}
0
GGirard