-
Notifications
You must be signed in to change notification settings - Fork 0
136 lines (113 loc) · 4.39 KB
/
ci.yml
File metadata and controls
136 lines (113 loc) · 4.39 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
name: Tests & Coverage
on:
pull_request:
branches: [ master, main, develop ]
jobs:
tests:
name: Run Tests & Coverage
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up Go
uses: actions/setup-go@v4
with:
go-version: '1.25'
- name: Set up Node.js
uses: actions/setup-node@v4
with:
node-version: '24'
cache: 'npm'
cache-dependency-path: frontend/package-lock.json
- name: Install dependencies
run: |
go mod download
cd frontend && npm ci
- name: Run Go tests with coverage
run: go test ./... -v -coverprofile=coverage.out -covermode=atomic
- name: Run frontend tests with coverage
working-directory: ./frontend
run: |
export NODE_OPTIONS="--max-old-space-size=4096 --no-warnings"
npm run test:coverage
env:
NODE_ENV: test
VITEST_MAX_THREADS: 1
VITEST_MIN_THREADS: 1
CI: true
- name: Upload Go coverage to Codecov
uses: codecov/codecov-action@v5
with:
token: ${{ secrets.CODECOV_TOKEN }}
files: ./coverage.out
flags: backend
fail_ci_if_error: false
verbose: true
- name: Upload frontend coverage to Codecov
uses: codecov/codecov-action@v5
with:
token: ${{ secrets.CODECOV_TOKEN }}
directory: ./frontend/coverage
flags: frontend
fail_ci_if_error: false
verbose: true
- name: Coverage Report Comment
uses: actions/github-script@v7
if: github.event_name == 'pull_request'
with:
script: |
const fs = require('fs');
// Read Go coverage
let goCoverageText = 'Not available';
try {
const coverageOutput = await exec.exec('go', ['tool', 'cover', '-func=coverage.out'], {
silent: true,
listeners: {
stdout: (data) => { goCoverageText = data.toString(); }
}
});
} catch (e) {
console.log('Go coverage parsing failed:', e);
}
// Extract Go coverage percentage
const goMatch = goCoverageText.match(/total:\s+\(statements\)\s+([\d.]+)%/);
const goCoverage = goMatch ? goMatch[1] + '%' : 'Parse failed';
// Read Frontend coverage
let frontendCoverage = 'Not available';
try {
if (fs.existsSync('./frontend/coverage/coverage-summary.json')) {
const summary = JSON.parse(fs.readFileSync('./frontend/coverage/coverage-summary.json', 'utf8'));
frontendCoverage = summary.total.statements.pct + '%';
}
} catch (e) {
console.log('Frontend coverage parsing failed:', e);
}
const comment = `## 📊 Test Coverage Report
| Component | Coverage |
|-----------|----------|
| 🔧 Go Backend | ${goCoverage} |
| ⚛️ Frontend | ${frontendCoverage} |
Coverage reports are also uploaded to [Codecov](https://codecov.io/gh/daniel-sullivan/babel-bridge/pull/${context.issue.number}) for detailed analysis.
---
*Coverage generated by GitHub Actions*`;
// Find and update existing comment or create new one
const comments = await github.rest.issues.listComments({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: context.issue.number,
});
const existingComment = comments.data.find(c => c.body.includes('📊 Test Coverage Report'));
if (existingComment) {
await github.rest.issues.updateComment({
owner: context.repo.owner,
repo: context.repo.repo,
comment_id: existingComment.id,
body: comment
});
} else {
await github.rest.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: context.issue.number,
body: comment
});
}