De mi PC a Producción en 5 Minutos: CI/CD con GitHub Actions y Docker
Inicia sesión para descargarEn este tutorial dockerizamos una app mínima, subimos su imagen a un registro y automatizamos el despliegue a un VPS con GitHub Actions y SSH. Verás el flujo completo: build → push …
El ciclo es arcaico: codificas, haces `git push`, y luego te conviertes en un operador manual de SSH. Ese ritual es un lastre. Hoy no lo mejoraremos, lo aniquilaremos. Vamos a forjar un autómata de software que vigilará tu repositorio. Al detectar tu señal (`push`), despertará y ejecutará su directiva: construir, publicar y desplegar tu obra en la nube. Tu única misión será crear.
El Plano de Ensamblaje
Este es el mapa completo de nuestro autómata. Cada archivo es un componente con una misión específica.
automaton-app/ ├─ .github/ │ └─ workflows/ │ └─ <strong>deploy.yml</strong> # El Cerebro Lógico (La pipeline) ├─ <strong>.dockerignore</strong> # El Protocolo de Pureza ├─ <strong>Dockerfile</strong> # El Esquema de la Armadura ├─ <strong>index.js</strong> # El Corazón Operativo (El servidor) ├─ <strong>package.json</strong> # El Manifiesto de Identidad └─ README.md # (Opcional)
Fase 1: El Núcleo (La Aplicación Node.js)
Todo autómata necesita un propósito. El nuestro será desplegar una aplicación. Empezamos forjando su núcleo con dos archivos esenciales.
Archivo a crear: package.json
El manifiesto de identidad. Define qué es, qué necesita y cómo cobra vida.
{
"name": "automaton-app",
"version": "1.0.0",
"description": "Aplicación para el Autómata de Despliegue",
"main": "index.js",
"scripts": {
"start": "node index.js"
},
"dependencies": {
"express": "^4.19.2"
}
}
Archivo a crear: index.js
El corazón operativo. Un servidor web diseñado para prosperar dentro de una armadura de contenedores.
'0.0.0.0' es crucial. Ordena al núcleo aceptar conexiones desde cualquier interfaz, permitiendo que la armadura (Docker) le redirija el tráfico del mundo exterior.const express = require('express');
const app = express();
// El puerto es adaptable, una necesidad para operar en entornos controlados.
const PORT = process.env.PORT || 3000;
app.get('/', (_req, res) => {
res.send('Diagnóstico del Núcleo: OPERATIVO. Esperando directivas.');
});
// Protocolo de escucha abierto para comunicación externa.
app.listen(PORT, '0.0.0.0', () => {
console.log(`Núcleo escuchando en puerto local: ${PORT}`);
});
Verifiquemos la integridad del núcleo antes de construir la armadura. Ejecuta en tu terminal:
# 1. Instala los componentes necesarios
npm install
# 2. Activa el núcleo
npm start
# 3. Abre http://localhost:3000 en tu navegador. ¿Recibes el diagnóstico? Excelente.
Fase 2: La Armadura (Contenedor Docker)
El núcleo es vulnerable. Necesita una armadura que lo haga portable, seguro y consistente en cualquier campo de batalla (desarrollo, producción, etc.). Docker es nuestro taller de forja.
Archivo a crear: Dockerfile
El esquema de ensamblaje. Instrucciones precisas para forjar una armadura de producción optimizada, multicapa y segura.
Archivo a crear: .dockerignore
El protocolo de pureza. Una lista de materiales y herramientas de desarrollo que deben quedar fuera de la armadura final para mantenerla ligera y ágil.
# Dockerfile
# Etapa 1: La Forja - Prepara el entorno base
FROM node:18-alpine AS base
WORKDIR /app
COPY package*.json ./
# Etapa 2: Ensamblaje de Dependencias
FROM base AS dependencies
RUN npm install --omit=dev
# Etapa 3: Integración del Código Fuente
FROM base AS build
COPY . .
COPY --from=dependencies /app/node_modules ./node_modules
# Etapa 4: Armadura Final - Optimizada y Segura
FROM node:18-alpine AS final
ENV NODE_ENV=production
WORKDIR /app
COPY --from=build /app .
EXPOSE 3000
# Protocolo de seguridad: No operar como root
USER node
CMD ["npm", "start"]
# .dockerignore
# Materiales de desarrollo local
node_modules
npm-debug.log
# Planos de Git y CI/CD
.git
.gitignore
.github
# Archivos de ensamblaje
Dockerfile
README.md
Comentarios y valoraciones
No hay comentarios aún. ¡Sé el primero en opinar!