From 0aeeaafca04347cf50b55c004681f6bc7747a0d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Chu=20V=C4=83n=20H=E1=BA=A3i?= Date: Sun, 7 Dec 2025 00:03:32 +0700 Subject: [PATCH] up --- .gitea/workflows/deploy.yml | 98 +++++++++++++++++++++++++++++++++++-- 1 file changed, 94 insertions(+), 4 deletions(-) diff --git a/.gitea/workflows/deploy.yml b/.gitea/workflows/deploy.yml index cbcf3a0..8e17f0a 100644 --- a/.gitea/workflows/deploy.yml +++ b/.gitea/workflows/deploy.yml @@ -79,10 +79,99 @@ on: jobs: # ============================================================================ - # JOB 1: BUILD AND PUSH DOCKER IMAGE + # JOB 1: PREPARE - AUTO-DETECT FRAMEWORK AND SETTINGS + # ============================================================================ + prepare: + runs-on: alpine-latest + outputs: + node_version: ${{ steps.detect.outputs.NODE_VERSION }} + framework: ${{ steps.detect.outputs.FRAMEWORK }} + package_manager: ${{ steps.detect.outputs.PACKAGE_MANAGER }} + container_port: ${{ steps.detect.outputs.CONTAINER_PORT }} + build_command: ${{ steps.detect.outputs.BUILD_COMMAND }} + start_command: ${{ steps.detect.outputs.START_COMMAND }} + steps: + - name: Checkout Code + uses: actions/checkout@v4 + + - name: Auto-detect settings + id: detect + run: | + echo "🔍 Starting auto-detection process..." + NODE_VERSION="18" # Default Node.js version + if [ -f ".nvmrc" ]; then + NODE_VERSION=$(cat .nvmrc | tr -d 'v' | tr -d '\n' | head -1) + elif [ -f "package.json" ] && grep -q '.engines.node' package.json; then + RAW_VERSION=$(grep '.engines.node' package.json | sed -E 's/.*"node": "([^"]+)".*/\1/') + NODE_VERSION=$(echo "$RAW_VERSION" | grep -oE '[0-9]+' | head -n 1) + fi + echo "✓ Detected Node.js version: ${NODE_VERSION}" + echo "NODE_VERSION=${NODE_VERSION}" >> $GITEA_OUTPUT + + FRAMEWORK="nodejs" + CONTAINER_PORT="3000" + if [ -f "package.json" ]; then + if grep -q '"@nestjs/core"' package.json; then FRAMEWORK="nestjs"; + elif grep -q '"next"' package.json; then FRAMEWORK="nextjs"; + elif grep -q '"react-scripts"' package.json; then FRAMEWORK="reactjs"; + elif grep -q '"vite"' package.json && grep -q '"react"' package.json; then FRAMEWORK="reactjs-vite"; + elif grep -q '"express"' package.json; then FRAMEWORK="expressjs"; + fi + fi + echo "✓ Detected framework: ${FRAMEWORK}" + echo "FRAMEWORK=${FRAMEWORK}" >> $GITEA_OUTPUT + echo "CONTAINER_PORT=${CONTAINER_PORT}" >> $GITEA_OUTPUT + + PACKAGE_MANAGER="npm" + if [ -f "pnpm-lock.yaml" ]; then PACKAGE_MANAGER="pnpm"; + elif [ -f "yarn.lock" ]; then PACKAGE_MANAGER="yarn"; + fi + echo "✓ Detected package manager: ${PACKAGE_MANAGER}" + echo "PACKAGE_MANAGER=${PACKAGE_MANAGER}" >> $GITEA_OUTPUT + + BUILD_CMD="" + START_CMD="" + if [ -f "package.json" ]; then + BUILD_CMD=$(grep -o '"build": "[^"]*"' package.json | sed 's/"build": "\(.*\)"/\1/' || echo "") + START_CMD=$(grep -o '"start": "[^"]*"' package.json | sed 's/"start": "\(.*\)"/\1/' || echo "") + fi + echo "✓ Detected build command: ${BUILD_CMD}" + echo "✓ Detected start command: ${START_CMD}" + echo "BUILD_COMMAND=${BUILD_CMD}" >> $GITEA_OUTPUT + echo "START_COMMAND=${START_CMD}" >> $GITEA_OUTPUT + + # ============================================================================ + # JOB 2: GENERATE DOCKERFILE + # ============================================================================ + generate-dockerfile: + runs-on: alpine-latest + needs: prepare + outputs: + dockerfile_path: steps.generate.outputs.dockerfile_path + steps: + - name: Checkout Ansible Repo for templates + uses: actions/checkout@v4 + with: + repository: ${{ github.repository_owner }}/ansible-gitea + path: .ansible + + - name: Generate Dockerfile + id: generate + run: | + echo "🔧 Generating Dockerfile for ${{ needs.prepare.outputs.framework }} framework..." + # In a real scenario, you would have a script here to generate the Dockerfile + # from a template based on the framework. + # For this example, we'll just point to a placeholder. + # cp .ansible/templates/dockerfiles/${{ needs.prepare.outputs.framework }}.j2 Dockerfile + # For now, we assume a Dockerfile exists in the calling repo. + echo "dockerfile_path=./Dockerfile" >> $GITEA_OUTPUT + + # ============================================================================ + # JOB 3: BUILD AND PUSH DOCKER IMAGE # ============================================================================ build: runs-on: alpine-latest + needs: [prepare, generate-dockerfile] # Grant permissions for the workflow to request an OIDC token. permissions: id-token: write @@ -128,7 +217,7 @@ jobs: uses: docker/build-push-action@v5 with: context: . - file: ./Dockerfile + file: ${{ needs.generate-dockerfile.outputs.dockerfile_path }} push: true tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }} @@ -136,11 +225,11 @@ jobs: env=${{ steps.vault.outputs.DOTENV_CONTENTS }} # ============================================================================ - # JOB 2: DEPLOY WITH ANSIBLE + # JOB 4: DEPLOY WITH ANSIBLE # ============================================================================ deploy: runs-on: alpine-latest - needs: build # This job runs only after the 'build' job succeeds. + needs: [prepare, build] # This job runs only after 'prepare' and 'build' jobs succeed. steps: - name: Checkout Application Code uses: actions/checkout@v4 @@ -197,6 +286,7 @@ jobs: server_port=${{ inputs.server_port }} \ server_host=$SERVER_HOST \ git_repo=${{ github.server_url }}/${{ github.repository }} \ + framework=${{ needs.prepare.outputs.framework }} \ docker_image_tag=${{ needs.build.outputs.image_tag }} \ docker_image_name=${{ needs.build.outputs.image_name }} \ docker_image_full=${{ needs.build.outputs.image_name }}:${{ needs.build.outputs.image_tag }} \