name: CI Pipeline on: push: branches: - main - master - develop pull_request: branches: - main - master jobs: lint: name: Code Linting runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v4 - name: Setup Node.js uses: actions/setup-node@v4 with: node-version: '18' cache: 'npm' - name: Install dependencies run: npm ci - name: Run ESLint run: npm run lint continue-on-error: false test: name: Run Tests runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v4 - name: Setup Node.js uses: actions/setup-node@v4 with: node-version: '18' cache: 'npm' - name: Install dependencies run: npm ci - name: Run tests with coverage run: npm run test:coverage - name: Check coverage threshold run: | echo "Checking test coverage meets minimum threshold of 70%..." COVERAGE=$(cat coverage/coverage-summary.json | grep -o '"lines":{"total":[0-9]*,"covered":[0-9]*,"skipped":[0-9]*,"pct":[0-9.]*' | grep -o 'pct":[0-9.]*' | cut -d':' -f2) echo "Current coverage: ${COVERAGE}%" if (( $(echo "$COVERAGE < 70" | bc -l) )); then echo "❌ Coverage ${COVERAGE}% is below minimum threshold of 70%" exit 1 else echo "✅ Coverage ${COVERAGE}% meets threshold" fi - name: Archive test results if: always() uses: actions/upload-artifact@v3 with: name: test-results path: coverage/ retention-days: 30 build-verification: name: Build Verification runs-on: ubuntu-latest needs: [lint, test] steps: - name: Checkout code uses: actions/checkout@v4 - name: Setup Node.js uses: actions/setup-node@v4 with: node-version: '18' cache: 'npm' - name: Install dependencies run: npm ci - name: Verify package.json run: | echo "Verifying package.json structure..." node -e "const pkg = require('./package.json'); console.log('✅ Package name:', pkg.name); console.log('✅ Version:', pkg.version);" - name: Check for JavaScript syntax errors run: | echo "Checking JavaScript files for syntax errors..." find js -name "*.js" -type f -exec node --check {} \; echo "✅ All JavaScript files are valid" - name: Verify critical files exist run: | echo "Verifying critical project files..." test -f index.html || { echo "❌ index.html not found"; exit 1; } test -d js || { echo "❌ js directory not found"; exit 1; } test -f js/main.js || { echo "❌ js/main.js not found"; exit 1; } echo "✅ All critical files present" quality-report: name: Generate Quality Report runs-on: ubuntu-latest needs: [lint, test, build-verification] if: always() steps: - name: Checkout code uses: actions/checkout@v4 - name: Setup Node.js uses: actions/setup-node@v4 with: node-version: '18' cache: 'npm' - name: Install dependencies run: npm ci - name: Generate full coverage report run: npm run test:coverage continue-on-error: true - name: Generate quality summary run: | echo "# Quality Report" > quality-report.md echo "" >> quality-report.md echo "## Test Results" >> quality-report.md if [ -f coverage/coverage-summary.json ]; then echo "- Lines: $(cat coverage/coverage-summary.json | grep -o '"lines":{"total":[0-9]*,"covered":[0-9]*,"skipped":[0-9]*,"pct":[0-9.]*' | grep -o 'pct":[0-9.]*' | cut -d':' -f2)%" >> quality-report.md echo "- Statements: $(cat coverage/coverage-summary.json | grep -o '"statements":{"total":[0-9]*,"covered":[0-9]*,"skipped":[0-9]*,"pct":[0-9.]*' | grep -o 'pct":[0-9.]*' | cut -d':' -f2)%" >> quality-report.md echo "- Functions: $(cat coverage/coverage-summary.json | grep -o '"functions":{"total":[0-9]*,"covered":[0-9]*,"skipped":[0-9]*,"pct":[0-9.]*' | grep -o 'pct":[0-9.]*' | cut -d':' -f2)%" >> quality-report.md echo "- Branches: $(cat coverage/coverage-summary.json | grep -o '"branches":{"total":[0-9]*,"covered":[0-9]*,"skipped":[0-9]*,"pct":[0-9.]*' | grep -o 'pct":[0-9.]*' | cut -d':' -f2)%" >> quality-report.md fi echo "" >> quality-report.md echo "## Build Info" >> quality-report.md echo "- Node Version: $(node --version)" >> quality-report.md echo "- NPM Version: $(npm --version)" >> quality-report.md echo "- Commit: ${{ github.sha }}" >> quality-report.md echo "- Branch: ${{ github.ref_name }}" >> quality-report.md cat quality-report.md - name: Upload quality report uses: actions/upload-artifact@v3 with: name: quality-report path: quality-report.md retention-days: 90