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.