Code Quality #54
Workflow file for this run
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: Code Quality | |
| on: | |
| schedule: | |
| # Run code quality checks daily at 0500 UTC on Sundays | |
| - cron: '0 5 * * 0' | |
| workflow_dispatch: | |
| push: | |
| branches: [main] | |
| paths: | |
| - '**/src/**' | |
| - '**/package.json' | |
| - '**/tsconfig.json' | |
| - '**/tsconfig.node.json' | |
| - '.github/workflows/**' | |
| jobs: | |
| code-quality: | |
| name: Code Quality Analysis | |
| runs-on: ubuntu-latest | |
| timeout-minutes: 10 | |
| steps: | |
| # --- Setup --- | |
| - name: Checkout repository | |
| uses: actions/checkout@v6 | |
| with: | |
| fetch-depth: 0 # Full history for better analysis | |
| - name: Setup Node.js | |
| uses: actions/setup-node@v6 | |
| with: | |
| node-version-file: .nvmrc | |
| cache: 'npm' | |
| - name: Install dependencies | |
| run: npm ci | |
| - name: 'Create web .env file' | |
| working-directory: ./packages/web | |
| run: | | |
| echo "${{ vars.ENV_CI }}" > .env | |
| - name: Create infrastructure .env file | |
| working-directory: ./packages/infra | |
| run: | | |
| echo "${{ vars.CDK_ENV_DEV }}" > .env | |
| # --- Project Checks --- | |
| - name: Run ESLint with detailed output | |
| run: | | |
| echo "## ESLint Analysis" >> $GITHUB_STEP_SUMMARY | |
| echo "" >> $GITHUB_STEP_SUMMARY | |
| npm run lint -- --output-file lint-output.txt || true | |
| if [ -s lint-output.txt ]; then | |
| echo "### Issues Found:" >> $GITHUB_STEP_SUMMARY | |
| echo '```' >> $GITHUB_STEP_SUMMARY | |
| cat lint-output.txt >> $GITHUB_STEP_SUMMARY | |
| echo '```' >> $GITHUB_STEP_SUMMARY | |
| else | |
| echo "✅ No ESLint issues found" >> $GITHUB_STEP_SUMMARY | |
| fi | |
| - name: Check code formatting | |
| run: | | |
| echo "" >> $GITHUB_STEP_SUMMARY | |
| echo "## Prettier Analysis" >> $GITHUB_STEP_SUMMARY | |
| echo "" >> $GITHUB_STEP_SUMMARY | |
| npm run format:check > format-output.txt 2>&1 || true | |
| if [ $? -eq 0 ]; then | |
| echo "✅ All files are properly formatted" >> $GITHUB_STEP_SUMMARY | |
| else | |
| echo "❌ Some files need formatting:" >> $GITHUB_STEP_SUMMARY | |
| echo '```' >> $GITHUB_STEP_SUMMARY | |
| cat format-output.txt >> $GITHUB_STEP_SUMMARY | |
| echo '```' >> $GITHUB_STEP_SUMMARY | |
| fi | |
| - name: Build check | |
| run: | | |
| echo "" >> $GITHUB_STEP_SUMMARY | |
| echo "## Build" >> $GITHUB_STEP_SUMMARY | |
| echo "" >> $GITHUB_STEP_SUMMARY | |
| npm run build > build-output.txt 2>&1 | |
| if [ $? -eq 0 ]; then | |
| echo "✅ Build successful" >> $GITHUB_STEP_SUMMARY | |
| else | |
| echo "❌ Build failed:" >> $GITHUB_STEP_SUMMARY | |
| echo '```' >> $GITHUB_STEP_SUMMARY | |
| cat build-output.txt >> $GITHUB_STEP_SUMMARY | |
| echo '```' >> $GITHUB_STEP_SUMMARY | |
| fi | |
| - name: Security audit | |
| run: | | |
| echo "" >> $GITHUB_STEP_SUMMARY | |
| echo "## Security Audit" >> $GITHUB_STEP_SUMMARY | |
| echo "" >> $GITHUB_STEP_SUMMARY | |
| npm audit --audit-level=moderate --omit=dev > security-output.txt 2>&1 || true | |
| if grep -q "found 0 vulnerabilities" security-output.txt; then | |
| echo "✅ No security vulnerabilities found" >> $GITHUB_STEP_SUMMARY | |
| else | |
| echo "⚠️ Security vulnerabilities detected:" >> $GITHUB_STEP_SUMMARY | |
| echo '```' >> $GITHUB_STEP_SUMMARY | |
| cat security-output.txt >> $GITHUB_STEP_SUMMARY | |
| echo '```' >> $GITHUB_STEP_SUMMARY | |
| fi | |
| - name: Package analysis | |
| run: | | |
| echo "" >> $GITHUB_STEP_SUMMARY | |
| echo "## Package Analysis" >> $GITHUB_STEP_SUMMARY | |
| echo "" >> $GITHUB_STEP_SUMMARY | |
| # Check for outdated packages | |
| echo "### Outdated Packages:" >> $GITHUB_STEP_SUMMARY | |
| npm outdated > package-output.txt 2>&1 || true | |
| if [ -s package-output.txt ]; then | |
| echo '```' >> $GITHUB_STEP_SUMMARY | |
| cat package-output.txt >> $GITHUB_STEP_SUMMARY | |
| echo '```' >> $GITHUB_STEP_SUMMARY | |
| else | |
| echo "✅ All packages are up to date" >> $GITHUB_STEP_SUMMARY | |
| fi | |
| # -- Web Package Checks --- | |
| - name: Run web tests with detailed coverage | |
| run: | | |
| echo "" >> $GITHUB_STEP_SUMMARY | |
| echo "## Test Coverage Analysis" >> $GITHUB_STEP_SUMMARY | |
| echo "" >> $GITHUB_STEP_SUMMARY | |
| npm run test:coverage -w packages/web | |
| # Extract coverage summary | |
| if [ -f packages/web/coverage/coverage-summary.json ]; then | |
| echo "### Web Coverage Summary:" >> $GITHUB_STEP_SUMMARY | |
| echo "" >> $GITHUB_STEP_SUMMARY | |
| # Use Node.js to parse JSON and create a table | |
| node -e " | |
| const fs = require('fs'); | |
| const coverage = JSON.parse(fs.readFileSync('packages/web/coverage/coverage-summary.json', 'utf8')); | |
| const total = coverage.total; | |
| console.log('| Metric | Percentage | Covered/Total |'); | |
| console.log('|--------|------------|---------------|'); | |
| console.log(\`| Lines | \${total.lines.pct}% | \${total.lines.covered}/\${total.lines.total} |\`); | |
| console.log(\`| Functions | \${total.functions.pct}% | \${total.functions.covered}/\${total.functions.total} |\`); | |
| console.log(\`| Branches | \${total.branches.pct}% | \${total.branches.covered}/\${total.branches.total} |\`); | |
| console.log(\`| Statements | \${total.statements.pct}% | \${total.statements.covered}/\${total.statements.total} |\`); | |
| " >> $GITHUB_STEP_SUMMARY | |
| fi | |
| # --- Infrastructure Package Checks --- | |
| - name: Run infrastructure tests with detailed coverage | |
| run: | | |
| echo "" >> $GITHUB_STEP_SUMMARY | |
| echo "## Infrastructure Test Coverage Analysis" >> $GITHUB_STEP_SUMMARY | |
| echo "" >> $GITHUB_STEP_SUMMARY | |
| npm run test:coverage -w packages/infrastructure | |
| # Extract coverage summary | |
| if [ -f packages/infra/coverage/coverage-summary.json ]; then | |
| echo "### Infrastructure Coverage Summary:" >> $GITHUB_STEP_SUMMARY | |
| echo "" >> $GITHUB_STEP_SUMMARY | |
| # Use Node.js to parse JSON and create a table | |
| node -e " | |
| const fs = require('fs'); | |
| const coverage = JSON.parse(fs.readFileSync('packages/infra/coverage/coverage-summary.json', 'utf8')); | |
| const total = coverage.total; | |
| console.log('| Metric | Percentage | Covered/Total |'); | |
| console.log('|--------|------------|---------------|'); | |
| console.log(\`| Lines | \${total.lines.pct}% | \${total.lines.covered}/\${total.lines.total} |\`); | |
| console.log(\`| Functions | \${total.functions.pct}% | \${total.functions.covered}/\${total.functions.total} |\`); | |
| console.log(\`| Branches | \${total.branches.pct}% | \${total.branches.covered}/\${total.branches.total} |\`); | |
| console.log(\`| Statements | \${total.statements.pct}% | \${total.statements.covered}/\${total.statements.total} |\`); | |
| " >> $GITHUB_STEP_SUMMARY | |
| fi | |
| - name: Archive test results | |
| if: always() | |
| uses: actions/upload-artifact@v7 | |
| with: | |
| name: test-results | |
| path: | | |
| lint-output.txt | |
| format-output.txt | |
| build-output.txt | |
| security-output.txt | |
| package-output.txt | |
| retention-days: 7 |