Parcourez des listes, des cartes ou des collections à l'aide de boucles.
Les boucles itèrent sur les collections définies par in, créant automatiquement les variables index et element pour chaque itération. Accédez-y avec l'expression JQ ${{ .steps.<loopStepName>.loop.element }} ou ${{ .steps.<loopStepName>.loop.index }}.
Ce que les boucles permettent :
- Itérer sur des collections, des listes ou des tableaux
- Traitez chaque élément avec
elementet suivez la position avec les variablesindex - Contrôler le flux de la boucle avec les instructions
breaketcontinue - Nider les boucles pour le traitement de données complexes
Paramètres
for(Obligatoire) : Signale le début de la bouclein(Obligatoire, expression de chaîne) : Expression évaluant à une collectionsteps(Obligatoire) : Étapes exécutées à chaque itération. Peut inclure n'importe quel type d'étape, y compris les boucles imbriquées
Boucle avec les entrées de workflow
name: myWorkflow steps: - name: loopStep type: loop for: in: '${{ .workflowInputs.list }}' steps: - name: step1 type: action action: internal.example.sayHello version: '1' inputs: name: 'Element: ${{ .steps.loopStep.loop.element }}, Index: ${{ .steps.loopStep.loop.index }}'Notes importantes
for: requis. Élément de niveau supérieur indiquant le début de la bouclein: requis. La collection d'entrée doit pouvoir être convertie en tableau Javasteps: requis. Les étapes s'exécutent à chaque itérationelementetindexautomatiquement attribué par itération de boucleindexest basé sur zéroelementpeut être de type complexe pour les collections complexes- Variables de boucle et sorties d'étape accessibles uniquement dans la boucle
- Variables effacées à la sortie de la boucle et null si elles sont consultées à l'extérieur
- Les boucles peuvent accéder aux variables définies en dehors de la boucle
Boucle simple sur les entiers
name: myWorkflow steps: - name: loopStep type: loop for: in: ${{ [range(1; 6)] }} steps: - name: step1 type: action action: internal.example.sayHello version: '1' inputs: name: 'Element: ${{ .steps.loopStep.loop.element }}, Index: ${{ .steps.loopStep.loop.index }}'Boucle simple pour la carte
name: myWorkflow steps: - name: loopStep type: loop for: in: '${{ [ { "key1": "val1" }, { "key2": "val2"} ] }}' steps: - name: step1 type: action action: internal.example.sayHello version: '1' inputs: name: 'Element: ${{ .steps.loopStep.loop.element }}, Index: ${{ .steps.loopStep.loop.index }}'Sauter à l'intérieur d'une boucle
Ne sautez qu'entre les étapes nommées dans la même boucle. Sauter dans/hors des boucles, vers des boucles internes/externes ou entre différentes boucles n'est pas autorisé.
name: myWorkflow steps: - name: firstStep type: action action: internal.example.sayHello version: '1' - name: loopStep type: loop for: in: '${{ .workflowInputs.list }}' steps: - name: step1 type: action action: internal.example.sayHello version: '1' inputs: name: '${{ .steps.loopStep.loop.element }}' next: step3 # Okay within the loop - name: step2 type: action action: internal.example.sayHello version: '1' inputs: name: '${{ .steps.step1.outputs.greeting }}' - name: step3 type: action action: internal.example.sayHello version: '1' next: firstStep # Not okay, first step is not in the loop contextUtilisez break/continue dans une boucle
Modifier le flux de la boucle avec next: break ou next: continue. Ce sont des cibles de saut réservées implicitement définies dans les boucles. En dehors des boucles, elles sautent à la fin du workflow.
end se comporte comme break à l'intérieur des boucles. next fonctionne dans les étapes de commutation ou tout autre type d'étape.
name: myWorkflow steps: - name: loopStep type: loop for: in: '${{ [range(1; 6)] }}' steps: - name: insideLoopStep1 type: action action: internal.example.sayHello version: '1' inputs: name: '${{ .steps.loopStep.loop.element }}' next: continue - name: insideLoopStep2 type: action action: internal.example.sayHello version: '1' inputs: name: '${{ .steps.loopStep.loop.element }}' - name: loopStepAgain type: loop for: in: '${{ .workflowInputs.list }}' steps: - name: switchStep type: switch switch: - condition: '${{ .steps.loopStepAgain.loop.index >= 0 }}' next: break - name: insideLoopStepAgain type: action action: internal.example.sayHello version: '1' inputs: name: '${{ .steps.loopStepAgain.loop.element }}'Et ensuite ?
- Logique conditionnelle: Utilisez des instructions switch pour la prise de décision
- Sondage de l'API REST: Voyez les boucles en action avec de vraies API