# Gitea CI/CD for alrahma_web_client (React + Vite + TypeScript) # # Triggers: # - Push to any branch # - Pull requests # - Tags # # Stages: lint → build → deploy (manual) name: Web Client CI/CD on: push: branches: [main, master, develop, 'feature/**', 'fix/**'] pull_request: branches: [main, master, develop] push: tags: ['v*'] env: CI: true jobs: # ────────────────────────────────────────────── # LINT: ESLint with TypeScript # ────────────────────────────────────────────── lint: name: Lint (ESLint + TypeScript) runs-on: ubuntu-latest container: image: node:22-alpine steps: - name: Checkout repository uses: actions/checkout@v4 - name: Cache npm dependencies uses: actions/cache@v4 with: path: node_modules/ key: ${{ runner.os }}-npm-${{ hashFiles('package-lock.json') }} restore-keys: | ${{ runner.os }}-npm- - name: Install dependencies run: npm ci --no-audit --no-fund - name: Run ESLint run: npm run lint # ────────────────────────────────────────────── # BUILD: TypeScript + Vite # ────────────────────────────────────────────── build: name: Build (tsc + Vite) runs-on: ubuntu-latest container: image: node:22-alpine steps: - name: Checkout repository uses: actions/checkout@v4 - name: Cache npm dependencies uses: actions/cache@v4 with: path: node_modules/ key: ${{ runner.os }}-npm-${{ hashFiles('package-lock.json') }} restore-keys: | ${{ runner.os }}-npm- - name: Install dependencies run: npm ci --no-audit --no-fund - name: Build project run: npm run build env: VITE_API_ORIGIN: ${{ vars.VITE_API_ORIGIN || '' }} - name: Upload build artifacts uses: actions/upload-artifact@v4 with: name: dist path: dist/ retention-days: 7 # ────────────────────────────────────────────── # DEPLOY (manual): to shared hosting via SSH # ────────────────────────────────────────────── deploy: name: Deploy to production runs-on: ubuntu-latest if: github.ref == 'refs/heads/develop' needs: [lint, build] environment: name: production url: ${{ vars.PRODUCTION_URL }} steps: - name: Checkout repository uses: actions/checkout@v4 - name: Download build artifacts uses: actions/download-artifact@v4 with: name: dist path: dist/ - name: Install SSH client run: | apk add --no-cache openssh-client sshpass rsync - name: Deploy via rsync run: | sshpass -p "${{ secrets.SSH_PASSWORD }}" rsync -avz --delete \ -e "ssh -p ${{ vars.SSH_PORT || 22 }} -o StrictHostKeyChecking=no" \ --exclude='.htaccess' \ ./dist/ \ ${{ secrets.SSH_USER }}@${{ secrets.SSH_HOST }}:${{ vars.SSH_TARGET_DIR }}/