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: ๏ฟฝ Setup Node uses: actions/setup-node@v4 with: node-version: 20 cache: "pnpm" - name: ๏ฟฝ Install pnpm uses: pnpm/action-setup@v4 - 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 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: ๏ฟฝ Checkout uses: actions/checkout@v4 - name: ๏ฟฝ๐Ÿš€ Trigger Deployment on QNAP uses: appleboy/ssh-action@v1.2.0 with: host: ${{ secrets.HOST }} username: ${{ secrets.USERNAME }} password: ${{ secrets.PASSWORD }} port: ${{ secrets.PORT }} timeout: 1200s command_timeout: 900s script_stop: true debug: true script: | set -e export PATH="/share/CACHEDEV1_DATA/.qpkg/container-station/bin:/opt/bin:/usr/local/bin:/usr/bin:/bin:$PATH" echo "==========================================" echo "Starting QNAP Deployment Process" echo "==========================================" # Verify Docker is accessible if ! docker version > /dev/null 2>&1; then echo "โœ— Docker not accessible. Check Container Station." exit 1 fi echo "โœ“ Docker accessible" # Sync scripts first echo "๐Ÿ“‚ Syncing deployment scripts..." cd /share/np-dms/app/source/lcbp3 # Check if directory exists if [ ! -d ".git" ]; then echo "โœ— Git repository not found at expected path" exit 1 fi git fetch origin main git reset --hard origin/main echo "โœ“ Code synced" # Ensure scripts are executable chmod +x scripts/deploy.sh scripts/rollback.sh 2>/dev/null || true mkdir -p /share/np-dms/app/logs echo "๐Ÿš€ Executing deployment..." ./scripts/deploy.sh echo "โœ“ Deployment completed successfully"