Integración y Despliegue Continuos (CI/CD)
La implementación de CI/CD (Integración Continua/Despliegue Continuo) nos permite automatizar el proceso de actualización del Wiki, asegurando que cualquier cambio aprobado en el repositorio se despliegue automáticamente en el servidor.
Esquema de trabajo
El flujo de trabajo implementado sigue el siguiente esquema:
- Los desarrolladores trabajan en la rama
dev - Cuando los cambios están listos, se crea un Pull Request hacia
main - El COO (Gerardo Alpuche) revisa y aprueba los cambios
- Al fusionar los cambios en
main, se activa automáticamente el despliegue - GitHub Actions ejecuta el workflow de despliegue
- Los cambios se aplican en el servidor de producción
Script de despliegue en el servidor
Primero, creamos un script de despliegue en el servidor:
mkdir -p /root/scriptsnano /root/scripts/deploy.shContenido:
#!/bin/bash
cd ~/GitHub/repositories/neodigital-wikigit pull origin maindocker build -t neodigital-wiki:latest .docker stop wiki || truedocker rm wiki || truedocker run -d -p 3000:80 --name wiki --restart always neodigital-wiki:latestecho "Despliegue completado: $(date)" >> /var/log/deployments.logHacemos el script ejecutable:
chmod +x /root/scripts/deploy.shConfiguración de clave SSH para GitHub Actions
Para permitir que GitHub Actions se conecte al servidor, generamos una clave SSH específica:
ssh-keygen -t ed25519 -f ~/.ssh/github-actions-key -N ""cat ~/.ssh/github-actions-key.pub >> ~/.ssh/authorized_keyscat ~/.ssh/github-actions-keyLa salida de este último comando debe copiarse para usarla como secret en GitHub.
Configuración del workflow en GitHub Actions
Creamos el archivo .github/workflows/deploy.yml en el repositorio:
name: Deploy to Digital Ocean Droplet
on: push: branches: - main pull_request: types: - closed branches: - main
jobs: build_and_deploy: if: github.event_name == 'push' || (github.event_name == 'pull_request' && github.event.pull_request.merged == true) runs-on: ubuntu-latest
steps: - name: Checkout repository uses: actions/checkout@v4
- name: Set up Node.js uses: actions/setup-node@v4 with: node-version: '20' cache: 'npm'
- name: Install dependencies run: npm ci
- name: Lint run: npm run lint
- name: Build application run: npm run build
- name: Deploy to server via SSH uses: appleboy/ssh-action@master with: host: ${{ secrets.SSH_HOST }} username: ${{ secrets.SSH_USERNAME }} key: ${{ secrets.SSH_PRIVATE_KEY }} script: | cd ~/GitHub/repositories/neodigital-wiki git pull origin main docker build -t neodigital-wiki:latest . docker stop wiki || true docker rm wiki || true docker run -d -p 3000:80 --name wiki --restart always neodigital-wiki:latest echo "Despliegue completado: $(date)" >> /var/log/deployments.logEste workflow:
- Se activa con un push directo a
maino cuando se fusiona un Pull Request amain - Clona el repositorio
- Configura Node.js y las dependencias
- Verifica el código con lint
- Construye la aplicación localmente para asegurar que no hay errores
- Se conecta al servidor vía SSH usando los secretos configurados
- Ejecuta los comandos de despliegue (similar al script deploy.sh)
Configuración de secretos en GitHub
Para que el workflow funcione, necesitamos configurar secretos en GitHub:
- En el repositorio de GitHub, vamos a Settings > Secrets and variables > Actions
- Añadimos los siguientes secrets:
SSH_HOST: IP del servidor (164.92.117.29)SSH_USERNAME: usuario (root)SSH_PRIVATE_KEY: clave SSH privada generada anteriormente
Protección de la rama main
Para asegurar que todos los cambios pasen por el proceso de revisión:
- En el repositorio de GitHub, vamos a Settings > Branches
- En “Branch protection rules”, hacemos clic en “Add rule”
- En “Branch name pattern” escribimos
main - Marcamos las siguientes opciones:
- “Require pull request reviews before merging”
- “Require review from Code Owners”
- “Include administrators”
- Hacemos clic en “Create”
Verificación del CI/CD
Para verificar que el CI/CD funciona correctamente:
-
Creamos una rama de prueba:
Ventana de terminal git checkout -b test-ci-cd -
Realizamos un cambio pequeño, por ejemplo en README.md:
Ventana de terminal echo "# Test CI/CD" >> README.md -
Enviamos los cambios:
Ventana de terminal git add README.mdgit commit -m "Test: verificar CI/CD"git push origin test-ci-cd -
Creamos un Pull Request en GitHub desde
test-ci-cdhaciamain -
Asignamos a Gerardo Alpuche como revisor
-
Una vez aprobado y fusionado, verificamos en la pestaña “Actions” que el workflow se ejecute correctamente
-
Verificamos en el servidor que los cambios estén aplicados
Monitoreo de despliegues
Para monitorear los despliegues en el servidor:
# Ver el log de desplieguestail -f /var/log/deployments.log
# Ver el estado del contenedordocker psdocker logs -f wikiSiguientes pasos
Con el CI/CD configurado, establecemos los procedimientos para el mantenimiento continuo del sistema.