
GitLab CI: formatear y validar tu .gitlab-ci.yml en línea
Stages, includes, `rules:`: valida la estructura de un .gitlab-ci.yml antes del pipeline — no es un runner de GitLab ni el CI Lint oficial.
¿Por qué revisar un .gitlab-ci.yml antes de que corra el pipeline?
Un .gitlab-ci.yml que no parsea, un stages que no es un array, o un job sin script ni trigger, suele verse demasiado tarde: badge rojo, Pipeline Editor, merge bloqueado. FastMinify no incluye el CI Lint oficial de GitLab y no ejecuta ningún runner. El validador GitLab CI hace controles estructurales en el navegador — mapping raíz, stages, jobs con script o trigger, include, jobs ocultos . — y el formateador GitLab CI reindenta el YAML (2 o 4 espacios). El cluster completo está en el hub de herramientas CI/CD. Para minificar JS/CSS en el mismo pipeline, consulta la guía de minificación CI/CD.
GitLab vs GitHub Actions: dos YAML, tres capas
GitHub Actions vive en .github/workflows/*.yml (varios archivos, trigger on, jobs con steps). GitLab CI vive casi siempre en un solo .gitlab-ci.yml en la raíz: stages, jobs con nombre, include. Las herramientas FastMinify siguen esa frontera — no pegues un workflow de Actions en el validador de GitLab.
jobs anidado + on obligatorio — ver la guía de GitHub ActionsFastMinify expone dos herramientas. Ninguna es GitLab CI Lint. Mezclar las tres produce un archivo «válido» aquí que igual falla en Pipeline Editor.
js-yaml, indentación 2 o 4 espacios (por defecto 2) — ver format-gitlab-ciinclude, evaluación de rules: — UI Pipeline Editor, API o glab ci lintrules: seleccione el jobEl validador no habla con el runner de GitLab, no llama a la API CI Lint y no expande includes remotos. Las menciones de rules: son un tema real de GitLab — no una función del navegador.
script, sin imagen Docker, sin caché del runnerinclude: remote / include: project — solo se lee el YAML pegadorules:, only/except ni workflow:rulespages son jobs como los demás: necesitan script o triggerAnatomía de un .gitlab-ci.yml: lo que FastMinify comprueba
La raíz debe ser un mapping YAML, no un escalar ni una lista. Un solo documento: los --- repetidos se rechazan. Si stages está presente, debe ser un array de nombres no vacíos. Cada clave que no esté reservada y no empiece por . es un job: necesita script (cadena o lista no vacía) o trigger.
stages, variables, include, workflow, default, image, services, cache, before_script, after_script, spec.hidden: sin requisito de scriptextends: aviso — el padre debe aportar script o triggerinclude de primer nivel: aviso, no siempre un bloqueoEl formateador hace pretty-print con js-yaml. No es un reescritor semántico: el orden de las claves puede cambiar, los comentarios # desaparecen, la indentación pasa a 2 o 4 espacios.
Antes
Después
Un include de primer nivel basta para evitar el aviso «ningún job». FastMinify no descarga los archivos incluidos. Por encima de 512 KiB UTF-8, la entrada se rechaza — como el resto de herramientas DevOps del sitio.
include: un escalar cuenta 1; un array cuenta su longitudrules: del YAML pegado no se interpretanglab ci lint en localValidar y luego formatear: un flujo concreto
Abre el validador GitLab CI, pega un solo .gitlab-ci.yml (máx. 512 KiB) y espera el debounce (~300 ms). El panel muestra un veredicto, los issues (error de parse con pista de línea) y contadores de jobs / stages / includes.
El formateador GitLab CI hace pretty-print con js-yaml. Pegar, subir o sample: formato automático; tras una edición manual, usa el botón Formatear. Este paso no prueba que la estructura esté completa.
Un compañero añadió compile: solo con stage: build. GitLab rechaza el pipeline, a menudo con un mensaje poco legible en el overlay del MR.
Paso 1: pegar el archivo en validate-gitlab-ci
Abre validate-gitlab-ci. Un veredicto inválido del tipo «Job … needs script or trigger» apunta al job vacío.
Paso 2: añadir script o trigger
Añade script: [npm run build] o un trigger: real. Vuelve a pegar hasta que el panel muestre una estructura válida (los avisos de extends pueden quedar).
Paso 3: formatear y abrir el MR
Pasa el YAML corregido por format-gitlab-ci, copia, haz commit. Los reviewers leen jobs indentados, no un blob.
Un ejemplo copiado de la doc de GitLab o un snippet llega con espacios mezclados. Ya no ves dónde termina un job.
Paso 1: formatear primero si el archivo es ilegible
Pega en format-gitlab-ci. Este paso no prueba que la config esté estructuralmente completa.
Paso 2: validar el documento indentado
Copia la salida al validador. Revisa stages, cada job, y que las plantillas . no oculten un job visible roto.
Paso 3: dejar CI Lint para includes y rules
Cuando la forma esté OK, el filtro esquema / includes remotos / rules: sigue en GitLab — FastMinify no lo sustituye.
Mantener GitLab CI Lint (y minify) en la cadena
El navegador es el bucle rápido: YAML + estructura. GitLab ya rechaza crear un pipeline si el esquema oficial es inválido — por eso casi nunca se embebe un job «lint CI» en el mismo archivo. En local, glab ci lint (CLI oficial, autenticada en el proyecto) llama a CI Lint: includes fusionados, simulación opcional con --dry-run. Fija la versión de glab; FastMinify no sustituye esa llamada. Para minificar JS/CSS en el pipeline, consulta la guía de minificación CI/CD.
Ejemplo básico
Si el repo está en GitHub, los equivalentes son format-github-actions y validate-github-actions — la misma idea (YAML + estructura, no actionlint). Dockerfile y Compose siguen en el hub DevOps. Un bundle JS minificado de un job se lee con unminify-js o la guía unminify — eso no es YAML de CI.
Conclusión
Pega el .gitlab-ci.yml, corrige la estructura (mapping, stages, jobs con script/trigger), reindenta y haz push. FastMinify hace ese bucle en local y no envía el YAML. No es GitLab CI Lint: includes remotos, rules: y el esquema oficial siguen en la UI, la API o glab ci lint. Para YAML genérico, quédate en beautify-yaml; para GitHub Actions, en el mismo hub CI/CD.
Artículos relacionados

YAML roto, `on` o `jobs` ausentes, steps vacíos: valida la estructura de tus workflows antes del push — y deja actionlint para la CI.

Errores de sintaxis SDL, review de esquema y formateo antes del merge — complemento al beautify GraphQL existente.

Reduce la factura OpenAI/Anthropic/Gemini: estima input/output, activa batch y caching en tus cálculos — tarifas verificadas, 100 % local.