Skip to content

Commit 67d3e1e

Browse files
ci/coverage: Store coverage from main
So we can use it for posting comments on PRs
1 parent e2535c9 commit 67d3e1e

1 file changed

Lines changed: 131 additions & 0 deletions

File tree

.github/workflows/coverage.yml

Lines changed: 131 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ permissions:
99
contents: read
1010
pages: write
1111
id-token: write
12+
pull-requests: write
1213

1314
concurrency:
1415
group: coverage-${{ github.ref }}
@@ -78,6 +79,32 @@ jobs:
7879
--output-dir coverage-raw
7980
mv coverage-raw/lcov.info coverage-raw/openssl-async-std.info
8081
82+
- name: Generate coverage summary for PR comparison
83+
if: github.event_name == 'pull_request'
84+
run: |
85+
# Merge LCOV files for summary
86+
cat coverage-raw/*.info > coverage-raw/pr-combined.info
87+
88+
# Generate JSON summary for comparison
89+
cargo tarpaulin \
90+
--package oo7 \
91+
--lib \
92+
--no-default-features \
93+
--features "tracing,tokio,native_crypto" \
94+
--ignore-panics \
95+
--out Json \
96+
--output-dir coverage-raw \
97+
--skip-clean
98+
99+
# Extract coverage percentage
100+
python3 -c "
101+
import json
102+
with open('coverage-raw/tarpaulin-report.json', 'r') as f:
103+
data = json.load(f)
104+
coverage = data['files'][''] # This might need adjustment based on actual structure
105+
print(f'PR_COVERAGE={coverage:.2f}')
106+
" >> $GITHUB_ENV || echo "PR_COVERAGE=0.00" >> $GITHUB_ENV
107+
81108
- name: Install grcov for merging coverage
82109
uses: taiki-e/install-action@v2
83110
with:
@@ -102,6 +129,110 @@ jobs:
102129
--ignore "**/examples/*" \
103130
--ignore "**/target/*"
104131
132+
- name: Store coverage percentage for main branch
133+
if: github.ref == 'refs/heads/main' && github.event_name == 'push'
134+
run: |
135+
# Extract and store coverage percentage for future PR comparisons
136+
CURRENT_COVERAGE=$(python3 -c "
137+
import json
138+
try:
139+
with open('coverage-raw/tarpaulin-report.json', 'r') as f:
140+
data = json.load(f)
141+
covered = data.get('covered', 0)
142+
coverable = data.get('coverable', 1)
143+
coverage = (covered / coverable * 100) if coverable > 0 else 0
144+
print(f'{coverage:.2f}')
145+
except Exception as e:
146+
print('0.00')
147+
" 2>/dev/null || echo "0.00")
148+
149+
echo "Main branch coverage: $CURRENT_COVERAGE%"
150+
151+
# Store in a simple text file artifact for PR comparisons
152+
mkdir -p coverage-baseline
153+
echo "$CURRENT_COVERAGE" > coverage-baseline/main-coverage.txt
154+
155+
- name: Upload baseline coverage
156+
if: github.ref == 'refs/heads/main' && github.event_name == 'push'
157+
uses: actions/upload-artifact@v4
158+
with:
159+
name: coverage-baseline
160+
path: coverage-baseline/main-coverage.txt
161+
retention-days: 90
162+
163+
- name: Get main branch coverage for comparison
164+
if: github.event_name == 'pull_request'
165+
uses: actions/download-artifact@v4
166+
with:
167+
name: coverage-baseline
168+
path: coverage-baseline/
169+
continue-on-error: true
170+
171+
- name: Set main coverage for comparison
172+
if: github.event_name == 'pull_request'
173+
run: |
174+
if [ -f coverage-baseline/main-coverage.txt ]; then
175+
MAIN_COVERAGE=$(cat coverage-baseline/main-coverage.txt)
176+
echo "MAIN_COVERAGE=$MAIN_COVERAGE" >> $GITHUB_ENV
177+
echo "Using stored main branch coverage: $MAIN_COVERAGE%"
178+
else
179+
echo "MAIN_COVERAGE=0.00" >> $GITHUB_ENV
180+
echo "No baseline coverage found, using 0.00%"
181+
fi
182+
183+
- name: Post coverage comment on PR
184+
if: github.event_name == 'pull_request'
185+
uses: actions/github-script@v7
186+
with:
187+
script: |
188+
const prCoverage = parseFloat(process.env.PR_COVERAGE || '0.00');
189+
const mainCoverage = parseFloat(process.env.MAIN_COVERAGE || '0.00');
190+
const diff = prCoverage - mainCoverage;
191+
const diffText = diff > 0 ? `+${diff.toFixed(2)}%` : `${diff.toFixed(2)}%`;
192+
const emoji = diff > 0 ? '📈' : diff < 0 ? '📉' : '➡️';
193+
194+
const body = `## 📊 Code Coverage Report
195+
196+
| Metric | Value |
197+
|--------|-------|
198+
| **Current PR Coverage** | ${prCoverage.toFixed(2)}% |
199+
| **Main Branch Coverage** | ${mainCoverage.toFixed(2)}% |
200+
| **Coverage Change** | ${emoji} ${diffText} |
201+
202+
${diff < -1 ? '⚠️ **Warning**: Coverage decreased by more than 1%' : ''}
203+
${diff > 1 ? '🎉 **Great**: Coverage increased by more than 1%!' : ''}
204+
205+
*Coverage report generated by [cargo-tarpaulin](https://github.com/xd009642/tarpaulin)*`;
206+
207+
// Find existing coverage comment
208+
const { data: comments } = await github.rest.issues.listComments({
209+
owner: context.repo.owner,
210+
repo: context.repo.repo,
211+
issue_number: context.issue.number,
212+
});
213+
214+
const existingComment = comments.find(comment =>
215+
comment.body.includes('## 📊 Code Coverage Report')
216+
);
217+
218+
if (existingComment) {
219+
// Update existing comment
220+
await github.rest.issues.updateComment({
221+
owner: context.repo.owner,
222+
repo: context.repo.repo,
223+
comment_id: existingComment.id,
224+
body: body
225+
});
226+
} else {
227+
// Create new comment
228+
await github.rest.issues.createComment({
229+
owner: context.repo.owner,
230+
repo: context.repo.repo,
231+
issue_number: context.issue.number,
232+
body: body
233+
});
234+
}
235+
105236
- name: Upload coverage artifacts
106237
uses: actions/upload-artifact@v4
107238
with:

0 commit comments

Comments
 (0)