Cambio de Enfoque para CI/CD. Se intenta uso de Drone.

This commit is contained in:
2025-06-15 22:18:23 -03:00
parent b3e70a3988
commit bb79ccf64c
3 changed files with 99 additions and 223 deletions

99
.drone.yml Normal file
View File

@@ -0,0 +1,99 @@
# .drone.yml
kind: pipeline
type: docker
name: Build y Deploy
# --- DISPARADOR (TRIGGER) ---
# Este pipeline se ejecutará solo cuando hagas push a la rama 'main'
trigger:
branch:
- main
event:
- push
# --- PASOS DEL PIPELINE ---
steps:
# --- PASO 1: CONSTRUIR LA IMAGEN DEL BACKEND ---
- name: build-and-publish-backend
image: plugins/docker
settings:
# --- Configuración del Registro ---
# Usamos el registro de Gitea. El valor viene de los secretos de Drone.
registry:
from_secret: REGISTRY_URL
# Drone inyecta automáticamente un secreto para autenticarse en el registro.
# Usaremos un PAT (Token de Acceso Personal) de Gitea.
username:
from_secret: GITEA_USER
password:
from_secret: ACTIONS_PAT
# --- Configuración de la Imagen ---
# El nombre de la imagen en el registro.
repo: ${{DRONE_REPO_OWNER}}/${{DRONE_REPO_NAME}}-backend
# El Dockerfile a usar.
dockerfile: Backend/GestionIntegral.Api/Dockerfile
# Las etiquetas que le pondremos a la imagen.
tags:
- latest
- ${{DRONE_COMMIT_SHA:0:8}} # Etiqueta con el hash corto del commit
# --- PASO 2: CONSTRUIR LA IMAGEN DEL FRONTEND ---
- name: build-and-publish-frontend
image: plugins/docker
settings:
# La configuración del registro es la misma
registry:
from_secret: REGISTRY_URL
username:
from_secret: GITEA_USER
password:
from_secret: ACTIONS_PAT
# --- Configuración de la Imagen ---
repo: ${{DRONE_REPO_OWNER}}/${{DRONE_REPO_NAME}}-frontend
dockerfile: Frontend/Dockerfile
# Las etiquetas para la imagen del frontend.
tags:
- latest
- ${{DRONE_COMMIT_SHA:0:8}}
# Este paso depende del anterior para no ejecutarse en paralelo
depends_on:
- build-and-publish-backend
# --- PASO 3: DESPLEGAR LA APLICACIÓN ---
- name: deploy-to-production
image: appleboy/drone-ssh
settings:
host:
from_secret: PROD_SERVER_HOST
username:
from_secret: PROD_SERVER_USER
key:
from_secret: PROD_SERVER_SSH_KEY
# --- Comandos a ejecutar en el servidor de producción ---
script:
# Navegamos a la carpeta donde está el docker-compose.yml de la aplicación
- cd /opt/gestion-integral
# Exportamos los secretos que necesita el docker-compose.yml
- export DB_SA_PASSWORD=$${DB_SA_PASSWORD_SECRET} # Nota los $$ para escapar
- export JWT_KEY=$${JWT_KEY_SECRET}
# Login al registro de Gitea DENTRO del servidor de producción
- docker login $${REGISTRY_URL_SECRET} -u $${GITEA_USER_SECRET} -p $${ACTIONS_PAT_SECRET}
# Descargamos las nuevas versiones de las imágenes
- docker compose pull
# Levantamos el stack con los cambios
- docker compose up -d
# Limpiamos imágenes viejas que ya no se usan
- docker image prune -af
# Este paso depende de que las dos imágenes se hayan construido
depends_on:
- build-and-publish-frontend

View File

@@ -1,59 +0,0 @@
name: Build y Deploy a Producción
on:
push:
branches: [main]
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout del código
uses: actions/checkout@v4
- name: Login al Registro de Gitea
uses: docker/login-action@v3
with:
registry: ${{ secrets.REGISTRY_URL }}
username: ${{ gitea.actor }}
password: ${{ secrets.ACTIONS_PAT }}
- name: Construir y Subir API Backend
uses: docker/build-push-action@v5
with:
context: .
file: ./Backend/GestionIntegral.Api/Dockerfile
push: true
tags: ${{ secrets.REGISTRY_URL }}/${{ gitea.repository }}/api:latest
- name: Construir y Subir Frontend
uses: docker/build-push-action@v5
with:
context: ./Frontend
file: ./Frontend/Dockerfile
push: true
tags: ${{ secrets.REGISTRY_URL }}/${{ gitea.repository }}/frontend:latest
deploy:
name: Desplegar a Producción
runs-on: ubuntu-latest
needs: build
steps:
- name: Desplegar con Docker Compose
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.PROD_SERVER_HOST }}
username: ${{ secrets.PROD_SERVER_USER }}
key: ${{ secrets.PROD_SERVER_SSH_KEY }}
script: |
cd /opt/gestion-integral
export DB_SA_PASSWORD='${{ secrets.DB_SA_PASSWORD }}'
export JWT_KEY='${{ secrets.JWT_SECRET_KEY }}'
# Login con la IP pública (desde el servidor de prod)
docker login ${{ secrets.REGISTRY_URL }} -u ${{ gitea.actor }} -p ${{ secrets.ACTIONS_PAT }}
docker compose pull
docker compose up -d
docker image prune -af

View File

@@ -1,164 +0,0 @@
name: Build y Deploy a Producción
on:
push:
branches:
- main # Se activa solo con push a la rama 'main'
# Definimos las variables de entorno para todo el workflow
# Esto hace más fácil cambiar los valores en un solo lugar
env:
# --- VALORES A REEMPLAZAR ---
GITEA_URL: "http://192.168.4.128:3000/" # URL base de tu Gitea
GITEA_REGISTRY_URL: "192.168.4.128:5000" # URL del registro Docker de Gitea (asegúrate de que esté activo)
GITEA_USER: "dmolinari" # Usuario que tiene acceso al repo
PROD_HOST: "192.168.4.128" # IP donde corre Docker
PROD_USER: "root" # ej: 'root' o un usuario del grupo 'docker'
DEPLOY_PATH: "/opt/GestionIntegralWeb" # Ruta en el servidor Debian donde se guardará el docker-compose.yml
DB_SA_PASSWORD: "@gestiones713550@"
JWT_KEY: "badb1a38d221c9e23bcf70958840ca7f5a5dc54f2047dadf7ce45b578b5bc3e2"
# --- FIN DE VALORES A REEMPLAZAR ---
jobs:
build-and-push:
name: Construir y Subir Imágenes Docker
runs-on: ubuntu-latest
steps:
- name: Checkout del código
uses: actions/checkout@v4
- name: Obtener SHA del commit
id: vars
run: echo "sha_short=$(git rev-parse --short HEAD)" >> $GITHUB_OUTPUT
- name: Login al Registro de Gitea
uses: docker/login-action@v3
with:
registry: ${{ env.GITEA_REGISTRY_URL }}
username: ${{ env.GITEA_USER }}
# Para el password, necesitas un token de Gitea.
# Lo pondremos aquí, pero idealmente sería un secreto.
password: "OuOCQzb6QV42z9vL9m5rgX2t4xdnZCkXblev0u5O" # Genera un token en Gitea -> Configuración -> Aplicaciones
- name: Construir y Subir Imagen del Backend
uses: docker/build-push-action@v5
with:
context: .
file: ./Backend/GestionIntegral.Api/Dockerfile
push: true
tags: |
${{ env.GITEA_REGISTRY_URL }}/${{ gitea.repository }}/api:latest
${{ env.GITEA_REGISTRY_URL }}/${{ gitea.repository }}/api:${{ steps.vars.outputs.sha_short }}
- name: Construir y Subir Imagen del Frontend
uses: docker/build-push-action@v5
with:
context: .
file: ./Frontend/Dockerfile
push: true
tags: |
${{ env.GITEA_REGISTRY_URL }}/${{ gitea.repository }}/frontend:latest
${{ env.GITEA_REGISTRY_URL }}/${{ gitea.repository }}/frontend:${{ steps.vars.outputs.sha_short }}
deploy:
name: Desplegar a Producción
runs-on: ubuntu-latest
needs: build-and-push
steps:
- name: Checkout del código
uses: actions/checkout@v4
- name: Obtener SHA del commit
id: vars
run: echo "sha_short=$(git rev-parse --short HEAD)" >> $GITHUB_OUTPUT
- name: Desplegar con Docker Compose
uses: appleboy/ssh-action@master
with:
host: ${{ env.PROD_HOST }}
username: ${{ env.PROD_USER }}
# La clave SSH privada se pega directamente aquí.
# Es muy importante el formato con la sangría correcta.
key: |
-----BEGIN OPENSSH PRIVATE KEY-----
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
-----END OPENSSH PRIVATE KEY-----
script: |
# Nos aseguramos de que el directorio de despliegue exista
mkdir -p ${{ env.DEPLOY_PATH }}
cd ${{ env.DEPLOY_PATH }}
# Copiamos el archivo docker-compose.yml del repositorio al servidor
# Usamos 'cat' para escribir el contenido en el servidor remoto
# Esto evita tener que hacer checkout del repo en el servidor
cat << 'EOF' > docker-compose.yml
${{ toJSON(fromJSON(readFile('docker-compose.yml'))) }}
EOF
# Exportamos las variables para que docker-compose las use
# Estas variables son leídas desde el docker-compose.yml (${VARIABLE})
export GITEA_REGISTRY=${{ env.GITEA_REGISTRY_URL }}
export GITEA_SHA=${{ steps.vars.outputs.sha_short }}
export DB_SA_PASSWORD=${{ env.DB_SA_PASSWORD }}
export JWT_KEY=${{ env.JWT_KEY }}
# Autenticamos Docker en el host de producción contra el registro de Gitea
# Esto es necesario para que `docker-compose pull` funcione
docker login ${{ env.GITEA_REGISTRY_URL }} -u ${{ env.GITEA_USER }} -p <PEGA_AQUÍ_TU_TOKEN_DE_GITEA>
echo "Descargando imágenes nuevas..."
docker-compose -f docker-compose.yml pull
echo "Levantando la aplicación..."
docker-compose -f docker-compose.yml up -d --remove-orphans
echo "Limpiando imágenes antiguas sin usar..."
docker image prune -f