diff --git a/.gitea/workflows/deploy.yaml b/.gitea/workflows/deploy.yaml new file mode 100644 index 0000000..d1a3c87 --- /dev/null +++ b/.gitea/workflows/deploy.yaml @@ -0,0 +1,85 @@ +name: Despliegue Automatizado Universal + +on: + push: + branches: + - develop + - master + +jobs: + get-context: + runs-on: host + outputs: + node_version: ${{ steps.setup.outputs.version }} + target_app: ${{ steps.setup.outputs.app }} + steps: + - name: Resolver Aplicación desde apps.conf + id: setup + run: | + # 1. Obtener el nombre del repositorio actual en Gitea (ej: front-Censo) + REPO_NAME="${{ github.event.repository.name }}" + + # 2. Determinar si buscamos un entorno -dev (develop) o producción (master) + if [ "${{ github.ref_name }}" = "develop" ]; then + SUFFIX="-dev" + else + SUFFIX="" + fi + + echo "Buscando qué sección de apps.conf tiene REPO=$REPO_NAME y termina en '$SUFFIX'..." + + # 3. Buscar en /etc/apps.conf el bloque que contenga REPO=nombre_del_repo + TARGET_APP=$(awk -v repo="REPO=$REPO_NAME" -v suf="$SUFFIX" ' + /^\[/ { gsub(/[\[\]]/, "", $0); current_box=$0; next } + $0 == repo { + if ((suf == "-dev" && current_box ~ /-dev$/) || (suf == "" && current_box !~ /-dev$/)) { + print current_box; + exit + } + } + ' /etc/apps.conf) + + if [ -z "$TARGET_APP" ]; then + echo "ERROR: No se encontró ninguna sección en /etc/apps.conf para el repositorio $REPO_NAME con el sufijo correcto." + exit 1 + fi + + # 4. Leer la versión de Node del bloque encontrado + VERSION=$(awk -v app="$TARGET_APP" ' + $0=="["app"]" { found=1; next } + /^\[/ && found { exit } + found && /^NODE=/ { split($0, a, "="); print a[2]; exit } + ' /etc/apps.conf) + + MAJOR_VERSION=$(echo "$VERSION" | tr -d '[:space:]' | grep -oE '[0-9]+' | head -n1) + + echo "-> ID de Aplicación encontrado: $TARGET_APP" + echo "-> Versión Mayor de Node resuelta: $MAJOR_VERSION" + + echo "app=${TARGET_APP}" >> $GITHUB_OUTPUT + echo "version=${MAJOR_VERSION}" >> $GITHUB_OUTPUT + + build: + needs: get-context + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Configurar Node.js dinámicamente + uses: actions/setup-node@v4 + with: + node-version: ${{ needs.get-context.outputs.node_version }} + + - run: npm ci + - run: npm run build + + deploy: + needs: [get-context, build] + runs-on: host + steps: + - name: Ejecutar Despliegue en Servidor Físico + run: | + TARGET_APP="${{ needs.get-context.outputs.target_app }}" + BRANCH_NAME="${{ github.ref_name }}" + + sudo -u deploy /home/deploy/scripts/deploy-front.sh "$TARGET_APP" "$BRANCH_NAME" diff --git a/package-lock.json b/package-lock.json index ec9d446..71e0bfb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1290,7 +1290,6 @@ "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", "license": "MIT", - "peer": true, "funding": { "type": "opencollective", "url": "https://opencollective.com/popperjs" @@ -1717,7 +1716,6 @@ "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.2.tgz", "integrity": "sha512-6mDvHUFSjyT2B2yeNx2nUgMxh9LtOWvkhIU3uePn2I2oyNymUAX1NIsdgviM4CH+JSrp2D2hsMvJOkxY+0wNRA==", "license": "MIT", - "peer": true, "dependencies": { "csstype": "^3.0.2" } @@ -1793,7 +1791,6 @@ "integrity": "sha512-n1H6IcDhmmUEG7TNVSspGmiHHutt7iVKtZwRppD7e04wha5MrkV1h3pti9xQLcCMt6YWsncpoT0HMjkH1FNwWQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "8.46.0", "@typescript-eslint/types": "8.46.0", @@ -2311,7 +2308,6 @@ "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "dev": true, "license": "MIT", - "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -3252,7 +3248,6 @@ "integrity": "sha512-XyLmROnACWqSxiGYArdef1fItQd47weqB7iwtfr9JHwRrqIXZdcFMvvEcL9xHCmL0SNsOvF0c42lWyM1U5dgig==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", @@ -3427,7 +3422,6 @@ "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@rtsao/scc": "^1.1.0", "array-includes": "^3.1.9", @@ -5636,7 +5630,6 @@ "resolved": "https://registry.npmjs.org/react/-/react-19.1.0.tgz", "integrity": "sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==", "license": "MIT", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -5677,7 +5670,6 @@ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.1.0.tgz", "integrity": "sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==", "license": "MIT", - "peer": true, "dependencies": { "scheduler": "^0.26.0" }, @@ -5906,7 +5898,6 @@ "resolved": "https://registry.npmjs.org/sass/-/sass-1.93.2.tgz", "integrity": "sha512-t+YPtOQHpGW1QWsh1CHQ5cPIr9lbbGZLZnbihP/D/qZj/yuV68m8qarcV17nvkOX81BCrvzAlq2klCQFZghyTg==", "license": "MIT", - "peer": true, "dependencies": { "chokidar": "^4.0.0", "immutable": "^5.0.2", @@ -6436,7 +6427,6 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -6586,7 +6576,6 @@ "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "dev": true, "license": "Apache-2.0", - "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver"