Introducción a Workflows
Qué es UrraWorkflow, cómo se estructura un workflow y cómo se ejecuta cada step.
UrraWorkflow es una plataforma independiente dedicada exclusivamente a crear y ejecutar workflows de automatización: pipelines de builds, pruebas, tareas programadas o integraciones propias. No aloja ni despliega ninguna aplicación de terceros; eso es responsabilidad de Web Hosting.
El modelo: jobs, steps y dependencias
Un workflow se organiza en jobs, y cada job en una secuencia de
steps. Cada step ejecuta una Action (por ejemplo, clonar un
repositorio o correr un comando) con sus propios parámetros (with:).
- Dentro de un job, los steps corren siempre en orden, uno tras otro.
- Los jobs sin dependencias entre sí corren en paralelo.
- Un job puede declarar
needs: [otro_job]para esperar a que otro job termine con éxito antes de empezar. Esto forma un DAG (grafo acíclico de dependencias): UrraWorkflow rechaza cualquier definición con dependencias circulares antes de guardarla. - Si un job falla o es cancelado, sus dependientes se marcan
SKIPPEDen cascada (la misma semántica que usan GitHub Actions o GitLab CI): nunca corren como si nada hubiera pasado.
Dos formas de definir un workflow
Puedes crear y editar un workflow de dos maneras, sincronizadas entre sí:
- YAML ("Workflow avanzado"): escribes la definición completa a mano, con control total sobre cada detalle.
- Editor visual ("Workflow sencillo"): arrastras, conectas y configuras bloques en un lienzo, al estilo de un editor de diagramas de flujo. Cada bloque es un step; conectar dos bloques define el orden de ejecución.
Puedes alternar entre ambos modos en cualquier momento sobre el mismo workflow: el editor visual compila automáticamente el diagrama a la definición YAML equivalente (y viceversa). Ver El editor visual para el detalle de cómo se traduce un diagrama a jobs y steps.
Ejecución: contenedores efímeros y endurecidos
UrraWorkflow separa el panel (lo que usas para definir y disparar workflows) del componente que realmente construye y corre contenedores:
flowchart TB
D[Dashboard Flask] -->|red interna 'control'| O[Orquestador]
O -->|Docker API acotada| P[docker-proxy-orchestrator]
O --> S1[Contenedor efímero<br/>step: shell.run / docker.run]
O --> S2[Contenedor efímero<br/>step: docker.build]
P -.acceso Docker.-> S1
P -.acceso Docker.-> S2
El dashboard nunca tiene acceso a Docker. Cada step de tipo shell.run,
docker.build o docker.run corre en su propio contenedor efímero
(se crea para ese step y se destruye al terminar), sin privilegios
(cap_drop: ALL, no-new-privileges), con límites de CPU/memoria y sin
red por defecto salvo que el step la solicite explícitamente.
Siguiente paso: Primeros pasos.