paint-brush
Cómo crear una canalización de CI/CD utilizando GitHub y AWS EC2por@wesleybaxterhuber
774 lecturas
774 lecturas

Cómo crear una canalización de CI/CD utilizando GitHub y AWS EC2

por Wes Huber6m2024/04/30
Read on Terminal Reader

Demasiado Largo; Para Leer

Básicamente, esta técnica permite que su servidor EC2 responda a los cambios enviados a su repositorio de Github.
featured image - Cómo crear una canalización de CI/CD utilizando GitHub y AWS EC2
Wes Huber HackerNoon profile picture

Hola a todos, hoy quiero hacer un tutorial sobre una de mis formas favoritas de implementar una API REST rápida, usando NodeJS/Express, en un servidor Amazon EC2. Básicamente, esta técnica permite que su servidor EC2 responda a los cambios enviados a su repositorio de GitHub.

Lo primero es lo primero, "Hola mundo"

Cree un nuevo directorio en su máquina para que viva una aplicación NodeJS/Express. Estoy llamando a mi rekognition


Abra una terminal y ejecute este comando para inicializar un paquete.json npm init -y


Instalar express.js npm i express


Cree un servidor express básico con un 'hola mundo' en la ruta predeterminada

 const express = require('express'); const app = express(); const port = 3000; app.get('/', (req, res) => { res.send('Hello World!'); }); app.listen(port, () => { console.log(`Example app listening at http://localhost:${port}`); });

Pruebe para asegurarse de que está viendo '¡Hola mundo!' en http://localhost:3000/


¡Buen trabajo, paso uno completo! 💪

A continuación, envíemos nuestro código a GitHub

Inicialice un repositorio de Git en su directorio y realice su primera confirmación:

 git init git add . git commit -m "First commit"


Crea un repositorio remoto en tu cuenta de GitHub

Agregue el nuevo repositorio como origen y envíe su rama.

 git remote add origin <REMOTE_REPOSITORY_URL> git push -u origin master


Reemplace <REMOTE_REPOSITORY_URL> con el enlace al repositorio remoto que acaba de crear.


Es posible que necesites cambiar la configuración de tu repositorio para usar 'master' como rama predeterminada en lugar de 'main'.

Después de hacer esto, puede eliminar la rama 'principal'.


Paso 2: ¡completa! Estamos cocinando con gas ⛽️

Vayamos a la nube: configure el servidor Ec2

Estos son los pasos para iniciar su instancia EC2:



  • Navegue hasta el panel de EC2 e inicie una nueva instancia.

  • Elija una AMI (imagen de máquina de Amazon) adecuada; Estoy usando Amazon Linux 2.


  • Seleccione un tipo de instancia (por ejemplo, t2.micro si se encuentra en el nivel gratuito).


  • Configure los detalles de la instancia, agregue almacenamiento y agregue etiquetas según sea necesario.


  • Configure un grupo de seguridad para permitir el tráfico entrante en los puertos que necesitará (al menos el puerto TCP 22 para SSH y el puerto de su aplicación, y luego 3000 para el tráfico web).


  • Revisar y lanzar la instancia; asegúrese de guardar el par de claves utilizado para el acceso SSH.


Ahora, probemos el inicio de sesión en su servidor a través de SSH en una terminal:

ssh ec2-user@<YOUR_SERVER_IP> -i <YOUR_PRIVATE_KEY>.pem


Reemplace las variables allí con los valores que definió para su instancia EC2.

Si ves esto, te has conectado a tu servidor, ¡felicidades! 👏

Sin embargo, todavía no hemos terminado: apenas estamos comenzando 😏

Instalemos NodeJS en nuestro servidor:
sudo yum install -y nodejs


Instale pm2 globalmente en nuestro servidor a través de npm

sudo npm i -g pm2


Instale git en el servidor y configure sus credenciales:

sudo yum install git -y

 git config --global user.name "Your Name" git config --global user.email "[email protected]"


Bien, ahora vamos a crear una carpeta var/www/ si aún no existe:

sudo mkdir -p /var/www


Luego agregue propiedad a nuestro usuario ec2:

sudo chown -R ec2-user:ec2-user /var/www


Navegue al directorio desde la raíz de su servidor , no a la carpeta /home people 👌 cd ~/var/www


Ahora, desde aquí, clonaremos nuestro repositorio git: git clone https://github.com/USERNAME/REPO_NAME.git YOUR_PROJECT_DIRECTORY

Reemplace [NOMBRE DE USUARIO] [NOMBRE_REPO] y [DIRECTORIO_PROJECTO] con sus propios valores.


A continuación, cambiamos el directorio a nuestro repositorio, para que cd YOUR_PROJECT_DIRECTORY pueda crear el archivo ecosystem.config.js para nuestra configuración pm2:

nano ecosystem.config.js


Se parece a esto:

 module.exports = { apps : [{ name: "my-app", // A name for your application script: "app.js", // The script file to launch the app instances: "max", // This can be set to the number of CPU cores to use, or "max" to use all available autorestart: true, // Automatically restart app if it crashes watch: false, // Enable/disable watching file changes for automatic restart max_memory_restart: '1G', // Optional: Restart app if it reaches a memory limit env: { NODE_ENV: "development", }, env_production: { NODE_ENV: "production", } }] };

Genial, está bien. Una vez creado y guardado, iniciemos la aplicación con pm2:

pm2 start ecosystem.config.js


Ahora podemos comprobar que tenemos un mensaje '¡Hola mundo!' desde nuestro servidor en el puerto 3000:

Para hacer que pm2 se inicie automáticamente al reiniciar el servidor, ejecutemos:

 pm2 save pm2 startup

Para verificar que su servidor esté funcionando, puede verificar pm2 status ; Puedes leer los documentos en pm2 aquí.


Si has llegado hasta aquí, eres una superestrella ⭐️

Integración con acciones de GitHub

Este es el último paso de nuestro proceso. Vamos a crear un archivo .yml para que las acciones de Github actualicen nuestro servidor cada vez que se envíe un cambio a nuestra rama maestra.

En su repositorio, vaya a la pestaña "Acciones" y cree un nuevo flujo de trabajo personalizado. Estoy llamando al mío nodejs.yml


Aquí está el archivo .yml para actualizar el repositorio y reiniciar pm2:

 name: Node.js CI/CD on Amazon Linux on: push: branches: [ master ] jobs: deploy: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - name: Install dependencies run: npm install - name: Deploy to AWS EC2 uses: appleboy/scp-action@master with: host: ${{ secrets.REMOTE_HOST }} username: ${{ secrets.REMOTE_USER }} key: ${{ secrets.SSH_PRIVATE_KEY }} source: "./" # This now correctly points to the current directory target: "/var/www/your_project_directory" - name: Restart PM2 application uses: appleboy/ssh-action@master with: host: ${{ secrets.REMOTE_HOST }} username: ${{ secrets.REMOTE_USER }} key: ${{ secrets.SSH_PRIVATE_KEY }} script: | cd /var/www/your_project_directory pm2 reload all # This command restarts your application

Asegúrese de actualizar 'your_project_directory'


Por último, deberá agregar estos secretos ambientales. REMOTE_HOST esta es la dirección IP de su servidor; REMOTE_USER este es ec2-user para la AMI de Amazon Linux 2 y luego pegue el contenido de su archivo .pem como SSH_PRIVATE_KEY


Puedes hacer todo esto en la configuración del repositorio:

¡Eso es todo! Ya terminamos jaja 😁


Puedes probar todo esto cambiando el mensaje 'Hola mundo' y enviando ese cambio a tu rama maestra; entonces deberías ver la actualización en http://your.ip.address:3000


Es un proceso un poco complicado de configurar, pero cuando estás desarrollando, es realmente bueno tener una canalización de CI/CD sencilla que implemente automáticamente los cambios en tu servidor API REST. De esa manera, puede implementar rápidamente los cambios en vivo y verlos en la interfaz de su aplicación web/móvil.


¡Déjame saber si esto fue útil en los comentarios y gracias por leer!


Tranquilízate,

— Wes