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

Juan Montoya
Juan Montoya
01 de junio de 2025
CI/CD con GitHub Actions: Despliegue Automático a EC2
Aprende a configurar un pipeline de CI/CD utilizando GitHub Actions para desplegar automáticamente tu aplicación en una instancia EC2 de AWS. Una guía práctica y completa para automatizar tus despliegues.

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

RequisitoDescripción
Repositorio GitHubCon tu aplicación (Node.js, Python, Next.js, etc.)
Instancia EC2En funcionamiento (Ubuntu o Amazon Linux)
Acceso SSHCon tu clave privada (.pem) o similar
Usuario despliegueCon permisos limitados, diferente a root
PM2 o DockerOpcional, para ejecutar tu aplicación
ConocimientosBá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

  1. Abre tu repositorio en GitHub
  2. Ve a Settings > Secrets and variables > Actions
  3. Agrega estos secretos:
  • EC2_HOST: IP pública de tu instancia EC2
  • EC2_USER: Usuario con permisos
  • EC2_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.

Referencias

Built with Next.js, Tailwind and deploy on Vercel