From bb79ccf64c035fbde8b81d66abf4770d1f2eb088 Mon Sep 17 00:00:00 2001 From: dmolinari Date: Sun, 15 Jun 2025 22:18:23 -0300 Subject: [PATCH] Cambio de Enfoque para CI/CD. Se intenta uso de Drone. --- .drone.yml | 99 ++++++++++++++++++++++ .gitea/workflows/deploy.yml | 59 ------------- docker-compose.yml | 164 ------------------------------------ 3 files changed, 99 insertions(+), 223 deletions(-) create mode 100644 .drone.yml delete mode 100644 .gitea/workflows/deploy.yml delete mode 100644 docker-compose.yml diff --git a/.drone.yml b/.drone.yml new file mode 100644 index 0000000..1c90ab0 --- /dev/null +++ b/.drone.yml @@ -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 \ No newline at end of file diff --git a/.gitea/workflows/deploy.yml b/.gitea/workflows/deploy.yml deleted file mode 100644 index 8407f13..0000000 --- a/.gitea/workflows/deploy.yml +++ /dev/null @@ -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 \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml deleted file mode 100644 index 5d43c3d..0000000 --- a/docker-compose.yml +++ /dev/null @@ -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 - - 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 \ No newline at end of file