Integración continua con Github Actions workflow para este Proyecto
Cada proyecto es un mundo y sus prioridades también, pero todos tienen algo en común: hay que probarlos y desplegarlos. Puedes hacerlo a mano, pero acaba siendo repetitivo y tedioso — que es justo lo que la integración y el despliegue continuos existen para quitar.
Aquí uso las Github Actions para automatizar el despliegue de este proyecto en Vercel, más las verificaciones previas: testing, linting, type-checking y generación de documentación.
Diseño
La parte que más se piensa es el propio pipeline: qué tareas corren y en qué orden. Dibujé el flujo en Excalidraw y fui iterando hasta que una forma me convenció. A partir de ahí es mecánico: creas una carpeta .github/workflows/ y sueltas tus ficheros .yml. Yo tengo dos, pre-deploy.yml y post-deploy.yml, y en vez de explicar la sintaxis del YAML voy a explicar qué hace cada job.
El pre-deploy corre cuatro jobs en paralelo — cancelar runs redundantes, linting, testing y docs — y solo si todos pasan versiona y despliega en pre-producción. Luego pruebo la feature o el bugfix a mano contra esa preview. Si aguanta, desplegar a producción es solo un pull request de dev a master. Pero el pipeline no acaba en el merge: una vez en vivo, el post-deploy corre un pase de Lighthouse y publica un informe de rendimiento página a página. Separarlo así mantiene las verificaciones rápidas bloqueando (nada se despliega roto) y las lentas contra el sitio en vivo fuera del camino crítico.
Aquí de forma más gráfica:
Este es un fragmento de cómo se ve el workflow de pre-deploy (Node 22, npm — ajusta las versiones a tu proyecto, esto es de lo que se queda desactualizado):
Workflow completo en mi github
Cinco cosas que merece la pena hacer desde el día uno
- Cachea la instalación.
actions/setup-nodeconcache: npmrestaura las descargas entre runs y recorta minutos de cada job. Apúntalo a tu lockfile real. - Cancela runs redundantes con
concurrency:, no con una action. Hacer push tres veces seguidas no debería lanzar tres pipelines enteros. Aquí había un paso destyfle/cancel-workflow-action, y lo quité de mi propio pipeline por dos motivos. Estaba fijado con un tag mutable, que es justo lo que la guía de hardening de GitHub te dice que no hagas con actions de terceros — un tag se puede reapuntar a código nuevo, que es exactamente como el compromiso detj-actions/changed-filesllegó a miles de repositorios en marzo de 2025. Y necesitabaaccess_token, así que en cada push le entregaba a un tercero un PAT con permisos de escritura sobre otros cinco repositorios. La clave nativaconcurrency:hace lo mismo sin token y sin código ajeno. - Define
permissions:explícitamente. Sin ella, elGITHUB_TOKENse lleva el valor por defecto del repositorio, que es más amplio de lo que un job de linting necesita.contents: readarriba del fichero, y subirlo por job donde algo tenga que escribir de verdad, es todo el cambio. - Mantén al día los majors de las actions.
actions/checkout@v4ysetup-node@v4siguen funcionando, pero declaran el runtime de Node 20, que GitHub lleva tiempo retirando de los runners. El major actual de ambas es@v7, y corre sobre Node 24. - Guarda los secretos en secrets. El token del registro sale de
${{ secrets.NPM_TOKEN }}, nunca del fichero. Si un token llega a un.npmrcsubido, rótalo — el runner lo lee del entorno, no del repo.
Resultados
Cada informe tiene su propio repositorio en GitHub, y ahí es donde se publica la salida de cada run:
- Informe de tests unitarios
- Informe de tests end to end
- Informe de rendimiento
- Documentación
- Librería de componentes
Conclusiones
Cada vez que añado un componente en React o una página en Next.js, una batería de tests comprueba que no he roto el trabajo que ya estaba — lo cual solo funciona porque eres tú quien tiene que escribir los tests de las partes delicadas y críticas. El pipeline no inventa cobertura; hace cumplir la que decidiste tener.
Puedes encontrar todo este código en mi repositorio de github, y si te ha gustado puedes ayudarme con una ⭐️. ¡Gracias!
