Workflow
Hasta ahora controlamos los jobs de los pipelines usando las rules en cada job, pero es posible definir cuándo el pipeline entero debe ejecutarse a través del workflow.
Se ubica en la parte superior del .gitlab-ci.yml y es útil para evitar que GitLab gaste recursos ejecutando pipelines innecesarios.
Ejemplo básico.
workflow:
rules:
- if: '$CI_COMMIT_BRANCH == "main"'
when: always
- when: never
Este ejemplo dice: solo ejecuta el pipeline si la branch es main, de lo contrario no hace nada. No confundir con rules: de los jobs. workflow.rules controla el pipeline entero, mientras que rules: en los jobs controla los jobs individuales.
Las rules del workflow tienen preferencia sobre las rules de los jobs.
Si el workflow bloquea el pipeline, ningún job se ejecutará, incluso si las rules del job le permiten ejecutarse.
En GitLab, la ejecución del pipeline sigue dos capas de decisión:
-
Workflow (workflow.rules):
- Decide si el pipeline entero debe ser creado.
- Si ninguna regla se satisface → el pipeline ni siquiera nace.
-
Jobs (rules, only, except):
- Una vez que el pipeline fue creado, estas reglas definen qué jobs se ejecutarán dentro de él.
Es decir, si fuéramos a hacer un workflow para nuestro proyecto de forma que no interfiera con las rules de nuestros jobs necesitaríamos abarcar todo.
Si tenemos esto en nuestro .gitlab-ci.yml
workflow:
rules:
- if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
when: always # Permitido para cualquier merge request
- if: '$CI_COMMIT_BRANCH == "main" || $CI_COMMIT_BRANCH == "develop"' # Permitido para commit en estas branches
when: always
- when: never
La primera regla permite el pipeline en merge requests, pero los jobs de los stages de pre-check y check no se dispararán, pues a pesar de ser un evento de merge, una de las reglas de los jobs garantiza que solo debe tener como destino las branches develop o main.
.rules-only-mr-main-develop:
rules:
- if: '$CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "main"'
when: always
- if: '$CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "develop"'
when: always
El uso del workflow ayuda:
- Evitar pipelines innecesarios. Olvidar poner una rule en un job haría que se dispare por cualquier motivo.
- Definir la intención del pipeline. Con solo echar un vistazo ya sabes que es para merge requests y branches específicas y no para tags, o viceversa.