Skip to content

Commit 6ca8a2c

Browse files
committed
Add GitHub Actions job summary for docs validation
Shows a summary table in the PR with: - Pass/fail status per language - Total code blocks validated - Details of any failures
1 parent 8830b9d commit 6ca8a2c

File tree

1 file changed

+49
-4
lines changed

1 file changed

+49
-4
lines changed

scripts/docs-validation/validate.ts

Lines changed: 49 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -354,13 +354,13 @@ async function validateCSharp(): Promise<ValidationResult[]> {
354354
return results;
355355
}
356356

357-
function printResults(results: ValidationResult[], language: string): number {
357+
function printResults(results: ValidationResult[], language: string): { failed: number; passed: number; failures: ValidationResult[] } {
358358
const failed = results.filter((r) => !r.success);
359359
const passed = results.filter((r) => r.success);
360360

361361
if (failed.length === 0) {
362362
console.log(` ✅ ${passed.length} files passed`);
363-
return 0;
363+
return { failed: 0, passed: passed.length, failures: [] };
364364
}
365365

366366
console.log(` ❌ ${failed.length} failed, ${passed.length} passed\n`);
@@ -377,7 +377,46 @@ function printResults(results: ValidationResult[], language: string): number {
377377
console.log(` └─`);
378378
}
379379

380-
return failed.length;
380+
return { failed: failed.length, passed: passed.length, failures: failed };
381+
}
382+
383+
function writeGitHubSummary(summaryData: { language: string; passed: number; failed: number; failures: ValidationResult[] }[]) {
384+
const summaryFile = process.env.GITHUB_STEP_SUMMARY;
385+
if (!summaryFile) return;
386+
387+
const totalPassed = summaryData.reduce((sum, d) => sum + d.passed, 0);
388+
const totalFailed = summaryData.reduce((sum, d) => sum + d.failed, 0);
389+
const allPassed = totalFailed === 0;
390+
391+
let summary = `## 📖 Documentation Validation Results\n\n`;
392+
393+
if (allPassed) {
394+
summary += `✅ **All ${totalPassed} code blocks passed validation**\n\n`;
395+
} else {
396+
summary += `❌ **${totalFailed} failures** out of ${totalPassed + totalFailed} code blocks\n\n`;
397+
}
398+
399+
summary += `| Language | Status | Passed | Failed |\n`;
400+
summary += `|----------|--------|--------|--------|\n`;
401+
402+
for (const { language, passed, failed } of summaryData) {
403+
const status = failed === 0 ? "✅" : "❌";
404+
summary += `| ${language} | ${status} | ${passed} | ${failed} |\n`;
405+
}
406+
407+
if (totalFailed > 0) {
408+
summary += `\n### Failures\n\n`;
409+
for (const { language, failures } of summaryData) {
410+
if (failures.length === 0) continue;
411+
summary += `#### ${language}\n\n`;
412+
for (const f of failures) {
413+
summary += `- **${f.sourceFile}:${f.sourceLine}**\n`;
414+
summary += ` \`\`\`\n ${f.errors.slice(0, 3).join("\n ")}\n \`\`\`\n`;
415+
}
416+
}
417+
}
418+
419+
fs.appendFileSync(summaryFile, summary);
381420
}
382421

383422
async function main() {
@@ -394,6 +433,7 @@ async function main() {
394433
}
395434

396435
let totalFailed = 0;
436+
const summaryData: { language: string; passed: number; failed: number; failures: ValidationResult[] }[] = [];
397437

398438
const validators: [string, () => Promise<ValidationResult[]>][] = [
399439
["TypeScript", validateTypeScript],
@@ -408,9 +448,14 @@ async function main() {
408448

409449
console.log(`\n${name}:`);
410450
const results = await validator();
411-
totalFailed += printResults(results, name);
451+
const { failed, passed, failures } = printResults(results, name);
452+
totalFailed += failed;
453+
summaryData.push({ language: name, passed, failed, failures });
412454
}
413455

456+
// Write GitHub Actions summary
457+
writeGitHubSummary(summaryData);
458+
414459
console.log("\n" + "─".repeat(40));
415460

416461
if (totalFailed > 0) {

0 commit comments

Comments
 (0)