CI/CD con GitHub Actions: Despliegue Automático a EC2

Introducción
Automatizar el despliegue de una aplicación puede parecer un reto al principio, pero con las herramientas adecuadas, el proceso se vuelve eficiente, seguro y mucho más ágil. En este artículo, te muestro cómo configurar un pipeline de Integración Continua y Despliegue Continuo (CI/CD) utilizando GitHub Actions y una instancia EC2 de AWS, para que puedas actualizar tu aplicación automáticamente con cada push a la rama principal.
La idea es clara: que el servidor se actualice solo, sin que tengas que conectarte por SSH cada vez que haces un cambio. Vamos a construir un flujo de trabajo robusto, mantenible y listo para producción.
Objetivo del pipeline
Al final de este tutorial, vas a tener una solución funcional que realiza lo siguiente cada vez que actualices tu repositorio:
- Descarga automática del código en tu instancia EC2
- Ejecución de comandos para actualizar la app
- Reinicio del servicio para aplicar cambios
Todo sin necesidad de tocar el servidor manualmente. Más productividad, menos errores humanos.
Requisitos previos
| Requisito | Descripción |
|---|---|
| Repositorio GitHub | Con tu aplicación (Node.js, Python, Next.js, etc.) |
| Instancia EC2 | En funcionamiento (Ubuntu o Amazon Linux) |
| Acceso SSH | Con tu clave privada (.pem) o similar |
| Usuario despliegue | Con permisos limitados, diferente a root |
| PM2 o Docker | Opcional, para ejecutar tu aplicación |
| Conocimientos | Básicos de terminal y Git |
Preparar tu instancia EC2
Primero, conéctate por SSH:
ssh -i "tu_clave.pem" ubuntu@<IP_de_tu_EC2>
Una vez dentro, instala lo necesario y clona tu repositorio:
# Actualiza paquetes e instala Git
sudo apt update && sudo apt install git -y
# Clona tu aplicación
git clone https://github.com/tu_usuario/tu_repo.git
# Instala Node.js
curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -
sudo apt install -y nodejs
# Instala PM2 globalmente
sudo npm install -g pm2
# Entra al proyecto e instala dependencias
cd tu_repo
npm install
# Inicia la app con PM2
pm2 start app.js --name="mi_app"
Configurar GitHub Actions
El núcleo del CI/CD es la automatización. En este caso, vamos a usar GitHub Actions para que, cada vez que hagas un push a la rama main, se despliegue automáticamente tu aplicación en una instancia EC2. Así reduces fricción, errores humanos y aseguras que tu código más reciente esté en producción sin pasos manuales.
Paso a paso
1. Crear el archivo de workflow
Primero, asegúrate de tener la carpeta .github/workflows/ dentro de tu repositorio. Si no existe, créala. Dentro de esta carpeta, añade un archivo llamado deploy.yml. Este archivo define el flujo de despliegue automatizado.
name: Despliegue a EC2
on:
push:
branches:
- main
Este bloque indica que el workflow se ejecutará automáticamente cada vez que se haga un push a la rama main, es decir, a tu rama de producción.
2. Definir el job de despliegue
jobs:
deploy:
name: Despliegue en producción
runs-on: ubuntu-latest
Aquí defines un job llamado deploy que se ejecutará en una máquina virtual proporcionada por GitHub, con Ubuntu como sistema operativo.
3. Agregar los pasos del job
steps:
- name: Checkout del código
uses: actions/checkout@v3
Este primer paso descarga el código fuente del repositorio dentro del entorno de GitHub Actions. Es esencial para que el workflow tenga acceso a los archivos que acabas de subir.
4. Conexión por SSH y ejecución remota en EC2
- name: Conectar por SSH y desplegar
uses: appleboy/ssh-action@v1.0.0
with:
host: ${{ secrets.EC2_HOST }}
username: ${{ secrets.EC2_USER }}
key: ${{ secrets.EC2_KEY }}
script: |
cd /home/ubuntu/tu_repo
git pull origin main
npm install
pm2 restart mi_app
En este paso se usa la acción appleboy/ssh-action, que permite conectarse a tu instancia EC2 vía SSH. Las credenciales (host, usuario y clave privada) se almacenan como secrets en la configuración del repositorio. Una vez conectado al servidor, el script navega al directorio de tu proyecto, actualiza el código con git pull, instala las dependencias con npm install y reinicia tu app usando pm2.
Configurar los secretos en GitHub
- Abre tu repositorio en GitHub
- Ve a Settings > Secrets and variables > Actions
- Agrega estos secretos:
EC2_HOST: IP pública de tu instancia EC2EC2_USER: Usuario con permisosEC2_KEY: Contenido completo de tu archivo .pem
🔐 Tip de seguridad: Es recomendable crear un usuario dedicado solo para el despliegue, con permisos limitados, y sin acceso root.
Probar el pipeline
Haz un cambio simple en tu proyecto y súbelo a la rama main:
git add .
git commit -m "Test de despliegue CI/CD"
git push origin main
Para verificar en EC2 (si estás usando PM2):
pm2 list
pm2 logs mi_app
Tener un pipeline CI/CD en GitHub Actions que despliegue automáticamente a EC2 es una forma poderosa de mejorar la eficiencia, reducir errores y acelerar la entrega de valor. Este tipo de automatización no solo te ahorra tiempo, sino que también mejora la calidad de tus despliegues y fortalece las buenas prácticas de desarrollo.