⏱ Tiempo estimado: 20 minutos 🎯 Rama / Perfil: CI/CD en la nube, para desarrolladores que no quieren mantener un servidor Jenkins. 🧠 Conocimiento previo necesario: Clases 7, 9 y 10 del curso (qué hace CI, correr pruebas con Docker y publicar imágenes en Docker Hub). 💡 ¿Qué vas a lograr? Un workflow que prueba tu código en cada push y publica la imagen Docker en GitHub Container Registry.
🛠 Lo que necesitas antes de empezar
- Cuenta de GitHub → 🔗 https://github.com/signup
- Node.js 20+ → 🔗 https://nodejs.org/
- Docker Desktop (para probar la imagen al final) → 🔗 https://www.docker.com/products/docker-desktop/
- Git instalado → 🔗 https://git-scm.com/downloads
📋 Pasos
Paso 1: Crea un proyecto mínimo con pruebas
Crea un repositorio nuevo en GitHub (por ejemplo mi-pipeline) y clónalo. Dentro ejecuta:
bash
npm init -y
npm install --save-dev mocha
Crea sum.js:
js
module.exports = (a, b) => a + b;
Crea test/sum.test.js:
js
const assert = require('assert');
const sum = require('../sum');
describe('sum', () => {
it('suma dos números', () => assert.strictEqual(sum(2, 3), 5));
});
En package.json, cambia el script de prueba a "test": "mocha" y verifica con npm test.
Paso 2: Agrega un Dockerfile
Crea Dockerfile:
dockerfile
FROM node:20-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --omit=dev
COPY . .
CMD ["node", "-e", "console.log('Hola desde mi imagen:', require('./sum')(2,3))"]
Paso 3: Crea el workflow
Crea el archivo .github/workflows/ci.yml:
yaml
name: ci
on:
push:
branches: [main]
pull_request:
permissions:
contents: read
packages: write
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 20
cache: npm
- run: npm ci
- run: npm test
publish:
needs: test
if: github.ref == 'refs/heads/main'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: docker/setup-buildx-action@v3
- uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- id: meta
uses: docker/metadata-action@v5
with:
images: ghcr.io/${{ github.repository }}
tags: |
type=sha
type=raw,value=latest
- uses: docker/build-push-action@v6
with:
context: .
push: true
tags: ${{ steps.meta.outputs.tags }}
cache-from: type=gha
cache-to: type=gha,mode=max
Esto replica lo que hacías en Jenkins: el job test corre primero, y publish solo corre si las pruebas pasan (needs: test). La caché de npm y la de capas Docker (type=gha) hacen los siguientes builds mucho más rápidos. Las versiones de las acciones pueden haber avanzado, así que verifica las más recientes en 🔗 https://github.com/marketplace?type=actions
Paso 4: Haz push y observa
bash
git add . && git commit -m "ci: pipeline con GitHub Actions" && git push origin main
Ve a la pestaña Actions de tu repo y mira correr los dos jobs. Si falla algo, el log te dice en qué paso.
Paso 5: Descarga y ejecuta tu imagen
En tu repo, abre Packages para ver la imagen publicada. Luego:
bash
docker run --rm ghcr.io/TU_USUARIO/mi-pipeline:latest
Si el paquete es privado, primero haz docker login ghcr.io con un token personal con permiso read:packages.
🔗 Documentación oficial: https://docs.github.com/en/packages/working-with-a-github-packages-registry/working-with-the-container-registry
✅ Resultado esperado
Un repositorio con CI completo: cada push a main ejecuta las pruebas, construye la imagen y la publica en GHCR con dos tags (latest y el SHA del commit). En un pull request solo corren las pruebas.
🔥 Tu reto (siguiente acción)
Rompe una prueba a propósito en una rama nueva, abre un pull request y comprueba que el pipeline lo bloquea. Luego activa la protección de rama en Settings → Branches para que sea obligatorio pasar el check test antes de hacer merge.
📚 Recursos para ir más lejos
- Documentación de GitHub Actions: 🔗 https://docs.github.com/en/actions (referencia completa de sintaxis y triggers)
- Docker Build GitHub Actions: 🔗 https://docs.docker.com/build/ci/github-actions/ (patrones de build, caché y multi-plataforma)
Curso Profesional de DevOps
COMPARTE ESTE ARTÍCULO Y MUESTRA LO QUE APRENDISTE