viernes 2 junio 2023 11:55 PM

¿Cómo usar Github Actions para hacer auto deploy?

#github#actions#nodejs#deploy#ci/cd
¿Cómo usar Github Actions  para hacer auto deploy?

Github Actions es una plataforma que nos ayudará a lidiar con procesos repetitivos en las fases de desarrollo de proyectos.

En esta ocasión veremos como automatizar el proceso de despliegue de una aplicación nodejs con el objetivo de reducir el tiempo y esfuerzo para ver nuestro código en un ambiente de producción.

REQUISITOS:

1. Tener un servidor con conexión SSH

Para poder llevar a cabo este tutorial necesitamos como primer requisito tener un servidor al que podamos acceder a través del protocolo de SSH, en este ejemplo estaré usando un droplet de digital ocean, pero puede ser una instancia de AWS, Google Platform o Azure, siempre y cuando tenga acceso SSH no importa el proveedor.

2. Tener un proyecto de nodejs*

Esto es relativo, ya que el proceso de deploy puede hacerse con cualquier lenguaje, php, python, ruby, etc. Pero en este ejemplo estaré usando un proyecto muy básico de nodejs y de la biblioteca express para crear el servidor.

3. Crear un repositorio de github

Es bastante obvio, pero debo mencionar que debemos tener nuestro proyecto en un repositorio de github, ya que es el lugar donde se llevará a cabo todo el proceso.

Lo primero que tenemos que hacer es hacer el deploy por primera vez de manera manual, para ello me conectaré al servidor mediante SSH usando el siguiente comando:

ssh root@ip-del-servidor

ssh

En mi caso la conexión se hace de manera automática con una llave pública pero también puedes usar tu contraseña para iniciar sesión. Una vez dentro del servidor clonaré el repositorio dentro la carpeta /var/www/html de esta manera tendré mi proyecto de nodejs en el siguiente directorio: /var/www/html/node-facilito

Para hacer deploy de mi proyecto ejecutaré el comando

npm install

Dentro de esta carpeta para instalar las bibliotecas necesarias. Una vez que haya hecho esto ejecutaré el siguiente comando para instalar pm2 de manera global, que es una herramienta que me ayudará a ejecutar mi proyecto de nodejs como un servicio en background.

npm install pm2 -g

Una vez instalado pm2 ya puedo utilizarlo para ejecutar mi instancia del servidor de la siguiente manera:

pm2 start index.js --name node-facilito

pm2

Una vez hecho esto, nuestro proyecto de nodejs estará completamente desplegado, podemos ir a la siguiente dirección y ver que nuestro proyecto ¡Está vivo!

http://ip-del-servidor

ex

Automatizar el proceso de deploy

Si hiciéramos un cambio al proyecto e hiciéramos un commit y push a nuestro branch de master tendríamos que hacer más o menos el mismo proceso todo el tiempo, es decir, tendríamos que:

- Entrar al servidor

- Ir a la carpeta

- Detener el servicio de pm2

- Hacer pull de los cambios

- Instalar las nuevas bibliotecas

- Hacer testing

- Iniciar el servicio de PM2 otra vez

Es una lista de cosas por hacer siempre que realicemos un cambio a nuestro código, pero usando github actions podemos hacerlo de manera automática de la siguiente forma: Crear un archivo YML en el siguiente directorio:

.github/workflows/autodeploy.yml

Dentro de este archivo agregaremos el siguiente código:

code

El código lo encuentras aquí

Como puedes ver estamos usando algunos parámetros llamados "secrets" que se encuentran en este formato:

${{secrets.SSH_HOST}}

${{secrets.SSH_USERNAME}}

${{secrets.SSH_KEY}}

Estos parámetros no deben ser visibles por temas de seguridad, pero entonces ¿Cómo los agregamos? Nos vamos a nuestro repositorio a la parte de Settings/Configuración después de eso nos dirigimos en la parte lateral izquierda a Secrets and variables/ Secretos y variables y finalmente pulsamos en el botón de New Secret/ Agregar Variable

test

Nos aparecerá el siguiente formulario donde debemos agregar el valor de cada uno, SSH_HOST es la ip de nuestro servidor SSH_USERNAME es el nombre de usuario y finalmente SSH_KEY es la llave que nos permitirá conectarnos.

78

Para que podamos usar nuestra llave tenemos que crearla y darle los permisos adecuados en el servidor, para ellos nos conectamos nuevamente al servidor y ejecutamos los siguientes comandos:

Crear la llave

ssh-keygen -t ed25519 -a 200 -C "tu@email.com"

Permitir conexión de la llave

id_ed25519.pub >> ~/.ssh/authorized_keys

Ver el contenido de la llave

cat id_ed25519

Ejecutar este comando nos mostrará el contenido de la llave en la consola, algo como:

-----BEGIN OPENSSH PRIVATE KEY----- some value of ssh-key -----END OPENSSH PRIVATE KEY-----

Finalmente deberemos copiar dicho contenido y pegarlo dentro de nuestros secrets en github para poder ejecutar la lista de comandos.

Una vez hecho esto hacemos commit y push del workflow a nuestro repo de github, podemos ir a la sección de actions para ver como este es ejecutado por github.

gh

Cada vez que hagamos commit y push a nuestro branch de master, el código se actualizará de manera automática en nuestro servidor de digital ocean sin que tengamos que hacer nada más.