name: CI / CD Pipeline on: push: branches: [main, develop] pull_request: workflow_dispatch: jobs: # ============================================================ # JOB 1 : CI & Quality Gate # ============================================================ build: runs-on: ubuntu-latest steps: - name: ๐Ÿ“ฅ Checkout uses: actions/checkout@v4 - name: ๐Ÿ“ฆ Install pnpm run: npm install -g pnpm@10.32.1 - name: ๐ŸŸข Setup Node uses: actions/setup-node@v4 with: node-version: 20 cache: 'npm' # Note: cache: 'pnpm' requires additional setup action, using npm cache for basic caching or skipping, but we can just use simple setup - name: ๐Ÿ“ฆ Install deps run: pnpm install --frozen-lockfile - name: ๐Ÿงน Lint run: pnpm lint - name: ๐Ÿ” Security & quality checks run: | # UUID misuse check (ADR-019) if grep -r --include="*.ts" --include="*.tsx" --exclude-dir={node_modules,.next,.agents,.git,scripts,test,__tests__} "parseInt(.*uuid" .; then echo "โŒ UUID misuse detected" exit 1 fi # console.log check (Clean Code) if grep -r --include="*.ts" --include="*.tsx" --exclude-dir={node_modules,.next,.agents,.git,scripts,test,__tests__} "console.log" .; then echo "โŒ console.log detected" exit 1 fi - name: ๐Ÿงช Run Tests & Coverage run: | cd backend && pnpm test --watchAll=false cd ../frontend && pnpm test run # ============================================================ # JOB 2 : Deploy โ€” Trigger Blue-Green on QNAP # ============================================================ deploy: needs: build if: github.ref == 'refs/heads/main' runs-on: ubuntu-latest steps: - name: ๐Ÿš€ Trigger Deployment on QNAP uses: appleboy/ssh-action@v1.0.3 with: host: ${{ secrets.HOST }} username: ${{ secrets.USERNAME }} password: ${{ secrets.PASSWORD }} port: ${{ secrets.PORT }} timeout: 1200s command_timeout: 900s script_stop_signal: true script: | set -e export PATH="/share/CACHEDEV1_DATA/.qpkg/container-station/bin:/opt/bin:/usr/local/bin:/usr/bin:/bin:$PATH" # Sync scripts first echo "๐Ÿ“‚ Syncing deployment scripts..." cd /share/np-dms/app/source/lcbp3 git fetch origin main git reset --hard origin/main # Ensure scripts are executable chmod +x scripts/deploy.sh scripts/rollback.sh echo "๐Ÿš€ Executing Blue-Green deployment..." # Pass registry credentials if needed by the pull command in deploy.sh export DB_PASSWORD="${{ secrets.DB_PASSWORD }}" ./scripts/deploy.sh