Update Deterministic hardhat via viatrix PR #39
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: Coverage Check | |
| on: | |
| pull_request: | |
| branches: [main, master] | |
| jobs: | |
| coverage: | |
| runs-on: ubuntu-22.04 | |
| steps: | |
| - name: Checkout code | |
| uses: actions/checkout@v4 | |
| - name: Setup Node.js | |
| uses: actions/setup-node@v4 | |
| with: | |
| node-version: 22 | |
| cache: 'npm' | |
| - name: Install dependencies | |
| run: npm ci | |
| - name: Print environment versions | |
| run: | | |
| echo "Node.js: $(node -v)" | |
| echo "NPM: $(npm -v)" | |
| npx hardhat --version | |
| npx solcjs --version 2>/dev/null || echo "(will be downloaded by Hardhat if needed)" | |
| - name: Setup environment variables | |
| run: | | |
| cp .env.example .env | |
| echo "✅ Environment configured" | |
| - name: Fetch main branch baseline | |
| run: | | |
| echo "📥 Fetching coverage baseline from main branch..." | |
| git fetch origin main:refs/remotes/origin/main | |
| git show origin/main:coverage-baseline.json > coverage-baseline-main.json 2>/dev/null || echo "{}" | |
| - name: Run coverage | |
| run: | | |
| set -e | |
| echo "" | |
| echo "📊 Running test coverage analysis in CI..." | |
| echo "This generates fresh coverage from your PR code" | |
| npm run coverage | |
| - name: Display coverage comparison | |
| run: | | |
| set -e | |
| echo "" | |
| echo "==================================================" | |
| echo " COVERAGE VALIDATION" | |
| echo "==================================================" | |
| echo "" | |
| # Extract coverage from CI run (actual) | |
| CI_COV=$(node -e " | |
| const fs = require('fs'); | |
| const content = fs.readFileSync('coverage/lcov.info', 'utf8').replace(/\r\n/g, '\n'); | |
| let linesFound = 0, linesHit = 0; | |
| content.split('\n').forEach(line => { | |
| if (line.startsWith('LF:')) linesFound += parseInt(line.substring(3)); | |
| if (line.startsWith('LH:')) linesHit += parseInt(line.substring(3)); | |
| }); | |
| console.log(linesFound > 0 ? ((linesHit / linesFound) * 100).toFixed(2) : '0'); | |
| ") | |
| # Extract PR baseline (what developer committed) | |
| PR_BASELINE=$(node -e " | |
| try { | |
| const data = require('./coverage-baseline.json'); | |
| console.log(data.lines || '0'); | |
| } catch(e) { | |
| console.log('0'); | |
| } | |
| ") | |
| # Extract main baseline (production baseline) | |
| MAIN_BASELINE=$(node -e " | |
| try { | |
| const data = require('./coverage-baseline-main.json'); | |
| console.log(data.lines || '0'); | |
| } catch(e) { | |
| console.log('0'); | |
| } | |
| ") | |
| echo "📊 Coverage Results (Lines):" | |
| echo " CI (actual): ${CI_COV}% ← Fresh coverage from this PR" | |
| echo " PR baseline: ${PR_BASELINE}% ← Baseline you committed" | |
| echo " Main baseline: ${MAIN_BASELINE}% ← Baseline from main branch" | |
| echo "" | |
| echo "✓ Check 1: CI coverage should match PR baseline" | |
| echo " (proves you ran coverage locally)" | |
| echo "✓ Check 2: CI coverage should be >= Main baseline - 0.2%" | |
| echo " (proves coverage didn't decrease beyond tolerance)" | |
| echo "" | |
| echo "💡 Allowed tolerance: ±0.2%" | |
| echo "" | |
| echo "==================================================" | |
| echo "" | |
| - name: Verify coverage | |
| run: | | |
| set -e | |
| echo "🔍 Running coverage validation..." | |
| npx ts-node --files scripts/check-coverage.ts --main-baseline=coverage-baseline-main.json | |
| - name: Upload coverage report (optional) | |
| if: always() | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: coverage-report | |
| path: coverage/ |