Itere a través de listas, mapas o colecciones usando bucles.
Los bucles iteran sobre colecciones definidas por in, creando automáticamente las variables index y element para cada iteración. Acceda a estos con la expresión JQ ${{ .steps.<loopStepName>.loop.element }} o ${{ .steps.<loopStepName>.loop.index }}.
Qué habilitan los bucles:
- Itere sobre colecciones, listas o arrays
- Procesar cada elemento con
elementy rastrear la posición con las variablesindex - Controle el flujo del bucle con las sentencias
breakycontinue - Anidar bucles para el procesamiento de datos complejos
Parámetros
for(Obligatorio): Señala el inicio del buclein(Requerido, expresión de cadena): Expresión que evalúa una colecciónsteps(Requerido): Pasos ejecutados en cada iteración. Puede incluir cualquier tipo de paso, incluidos los bucles anidados
Bucle con entradas de flujo de trabajo
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 }}'Notas importantes
for: requerido. Elemento de nivel superior que indica el inicio del buclein: requerido. La colección de entrada debe poder convertirse en una matriz de Javasteps: requerido. Los pasos se ejecutan en cada iteraciónelementyindexasignado automáticamente por cada iteración del bucleindexestá basado en ceroelementpuede ser de tipo complejo para colecciones complejas- Las variables de bucle y las salidas de pasos solo son accesibles dentro del bucle
- Variables borradas al salir del bucle y nulas si se accede a ellas fuera
- Los bucles pueden acceder a variables definidas fuera del bucle.
Bucle simple en enteros
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 }}'Bucle simple para el mapa
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 }}'Saltar dentro de un bucle
Solo salte entre pasos nombrados dentro del mismo bucle. No se permite saltar dentro/fuera de bucles, a bucles internos/externos o entre diferentes bucles.
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 contextEmplee break/continue en un bucle
Cambie el flujo del bucle con next: break o next: continue. Estos son destinos de salto reservados implícitamente definidos dentro de los bucles. Fuera de los bucles, saltan al final del flujo de trabajo.
end se comporta como break dentro de los bucles. next funciona en pasos de conmutación o cualquier tipo de paso.
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 }}'Que sigue
- Lógica condicional: Usar declaraciones de cambio para la toma de decisiones
- Encuesta de API REST: Vea los bucles en acción con API reales