name: PR Checks
on:
pull_request:
types: [opened, synchronize, reopened]
permissions:
contents: read
pull-requests: write
issues: write
checks: write
jobs:
pr-validation:
name: PR Validation
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 0 # Fetch full history for better diff analysis
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20.x'
cache: 'npm'
- name: Install dependencies
run: npm ci
- name: Check PR title format
uses: amannn/action-semantic-pull-request@v5
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
types: |
feat
fix
docs
style
refactor
perf
test
chore
requireScope: false
- name: Run quality checks
run: npm run quality
- name: Comment PR with test results
uses: actions/github-script@v7
with:
script: |
const fs = require('fs');
// Read benchmark results if available
let benchmarkResults = '';
try {
benchmarkResults = fs.readFileSync('benchmark-results.txt', 'utf8');
} catch (error) {
benchmarkResults = 'Benchmark results not available';
}
const comment = `
## 🤖 Automated PR Checks Results
✅ **Quality Checks**: Passed
✅ **Build**: Successful
### Next Steps:
- All automated checks have passed
- Ready for human review
`;
github.rest.issues.createComment({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
body: comment
});
code-quality:
name: Code Quality Analysis
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20.x'
cache: 'npm'
- name: Install dependencies
run: npm ci
- name: Run ESLint with annotations
run: |
npx eslint src/**/*.ts --format=@microsoft/eslint-formatter-sarif --output-file=eslint-results.sarif || true
- name: Upload ESLint results to GitHub
uses: github/codeql-action/upload-sarif@v3
if: always()
with:
sarif_file: eslint-results.sarif
wait-for-processing: true
- name: Check test coverage
run: npm run test:coverage
env:
GOOGLE_MAPS_API_KEY: ${{ secrets.GOOGLE_MAPS_API_KEY_TEST }}
- name: Coverage comment
uses: romeovs/lcov-reporter-action@v0.3.1
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
lcov-file: ./coverage/lcov.info
delete-old-comments: true