Files
davidson-ci/scripts/report.sh
T
pauljd 424a3b8398
pauljd/davidson-ci: Davidson CI / ai-review (push) Successful in 45s
pauljd/davidson-ci: Davidson CI / quality (push) Successful in 1m19s
Polish Davidson CI dashboard reporting
2026-09-12 20:54:20 +01:00

233 lines
6.5 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/bin/bash
set -u
SUMMARY_FILE="${GITEA_STEP_SUMMARY:-${GITHUB_STEP_SUMMARY:-}}"
LIGHTHOUSE_REPORT=".davidson-reports/davidson-lighthouse.json"
if [ -z "$SUMMARY_FILE" ]; then
echo "No Actions summary file available"
exit 0
fi
PHP_COUNT="${DAVIDSON_PHP_COUNT:-0}"
JS_COUNT="${DAVIDSON_JS_COUNT:-0}"
TS_COUNT="${DAVIDSON_TS_COUNT:-0}"
CSS_COUNT="${DAVIDSON_CSS_COUNT:-0}"
PHP_STATUS="${DAVIDSON_PHP_STATUS:-UNKNOWN}"
JS_STATUS="${DAVIDSON_JS_STATUS:-UNKNOWN}"
CSS_STATUS="${DAVIDSON_CSS_STATUS:-UNKNOWN}"
LIGHTHOUSE_STATUS="${DAVIDSON_LIGHTHOUSE_STATUS:-UNKNOWN}"
COMPOSER_AUDIT="${DAVIDSON_COMPOSER_AUDIT:-UNKNOWN}"
NPM_AUDIT="${DAVIDSON_NPM_AUDIT:-UNKNOWN}"
SEMGREP="${DAVIDSON_SEMGREP:-UNKNOWN}"
TRIVY_VULN="${DAVIDSON_TRIVY_VULN:-UNKNOWN}"
TRIVY_SECRET="${DAVIDSON_TRIVY_SECRET:-UNKNOWN}"
SECURITY_STATUS="${DAVIDSON_SECURITY_STATUS:-UNKNOWN}"
status_icon() {
case "$1" in
PASS)
echo "✅ PASS"
;;
FAIL)
echo "❌ FAIL"
;;
SKIP)
echo "➖ SKIP"
;;
*)
echo "⚪ UNKNOWN"
;;
esac
}
lighthouse_icon() {
local score="$1"
if [ "$score" -ge 90 ]; then
echo "🟢"
elif [ "$score" -ge 50 ]; then
echo "🟡"
else
echo "🔴"
fi
}
lighthouse_label() {
local score="$1"
if [ "$score" -ge 90 ]; then
echo "Good"
elif [ "$score" -ge 50 ]; then
echo "Fix"
else
echo "Issue"
fi
}
OVERALL="PASS"
for status in \
"$PHP_STATUS" \
"$JS_STATUS" \
"$CSS_STATUS" \
"$LIGHTHOUSE_STATUS" \
"$SECURITY_STATUS"
do
if [ "$status" = "FAIL" ]; then
OVERALL="FAIL"
fi
done
{
echo "# 🛡️ Davidson CI"
echo
if [ "$OVERALL" = "PASS" ]; then
echo "## ✅ Overall: Passed"
echo
echo "No blocking issues were detected."
else
echo "## ❌ Overall: Failed"
echo
echo "One or more checks require attention."
fi
echo
echo "---"
echo
echo "## Lighthouse"
echo
if [ "$LIGHTHOUSE_STATUS" = "SKIP" ]; then
echo "➖ Lighthouse was not run for this project."
echo
elif [ "$LIGHTHOUSE_STATUS" = "FAIL" ]; then
echo "❌ Lighthouse failed to complete."
echo
elif [ ! -f "$LIGHTHOUSE_REPORT" ]; then
echo "⚪ Lighthouse report unavailable."
echo
else
PERFORMANCE_SCORE="$(php -r '
$data = json_decode(file_get_contents($argv[1]), true);
echo $data["scores"]["performance"]["score"] ?? 0;
' "$LIGHTHOUSE_REPORT")"
ACCESSIBILITY_SCORE="$(php -r '
$data = json_decode(file_get_contents($argv[1]), true);
echo $data["scores"]["accessibility"]["score"] ?? 0;
' "$LIGHTHOUSE_REPORT")"
BEST_PRACTICES_SCORE="$(php -r '
$data = json_decode(file_get_contents($argv[1]), true);
echo $data["scores"]["best-practices"]["score"] ?? 0;
' "$LIGHTHOUSE_REPORT")"
SEO_SCORE="$(php -r '
$data = json_decode(file_get_contents($argv[1]), true);
echo $data["scores"]["seo"]["score"] ?? 0;
' "$LIGHTHOUSE_REPORT")"
FINDING_COUNT="$(php -r '
$data = json_decode(file_get_contents($argv[1]), true);
echo count($data["findings"] ?? []);
' "$LIGHTHOUSE_REPORT")"
echo "| Category | Score | Status |"
echo "|---|---:|---|"
echo "| Performance | $PERFORMANCE_SCORE | $(lighthouse_icon "$PERFORMANCE_SCORE") $(lighthouse_label "$PERFORMANCE_SCORE") |"
echo "| Accessibility | $ACCESSIBILITY_SCORE | $(lighthouse_icon "$ACCESSIBILITY_SCORE") $(lighthouse_label "$ACCESSIBILITY_SCORE") |"
echo "| Best Practices | $BEST_PRACTICES_SCORE | $(lighthouse_icon "$BEST_PRACTICES_SCORE") $(lighthouse_label "$BEST_PRACTICES_SCORE") |"
echo "| SEO | $SEO_SCORE | $(lighthouse_icon "$SEO_SCORE") $(lighthouse_label "$SEO_SCORE") |"
echo
if [ "$FINDING_COUNT" -gt 0 ]; then
echo "<details>"
echo "<summary>⚠️ Lighthouse findings ($FINDING_COUNT)</summary>"
echo
php -r '
$data = json_decode(file_get_contents($argv[1]), true);
foreach ($data["findings"] ?? [] as $finding) {
$title = $finding["title"] ?? "Lighthouse finding";
$categories = implode(", ", $finding["categories"] ?? []);
$score = $finding["score"] ?? null;
$impact = $finding["impact"] ?? null;
$problem = $finding["problem"] ?? "";
echo "### " . $title . PHP_EOL;
echo PHP_EOL;
if ($categories !== "") {
echo "**Category:** " . $categories . PHP_EOL;
}
if ($score !== null) {
echo "**Score:** " . $score . PHP_EOL;
}
if ($impact !== null && $impact !== "") {
echo "**Impact:** " . $impact . PHP_EOL;
}
if ($problem !== "") {
echo PHP_EOL . $problem . PHP_EOL;
}
echo PHP_EOL . "---" . PHP_EOL . PHP_EOL;
}
' "$LIGHTHOUSE_REPORT"
echo "</details>"
echo
else
echo "✅ No Lighthouse findings."
echo
fi
fi
echo "---"
echo
echo "## Code Quality"
echo
echo "| Module | Status |"
echo "|---|---|"
echo "| PHP | $(status_icon "$PHP_STATUS") |"
echo "| JavaScript / TypeScript | $(status_icon "$JS_STATUS") |"
echo "| CSS | $(status_icon "$CSS_STATUS") |"
echo
echo "## Security"
echo
echo "| Check | Status |"
echo "|---|---|"
echo "| Composer audit | $(status_icon "$COMPOSER_AUDIT") |"
echo "| npm audit | $(status_icon "$NPM_AUDIT") |"
echo "| Semgrep | $(status_icon "$SEMGREP") |"
echo "| Trivy vulnerabilities | $(status_icon "$TRIVY_VULN") |"
echo "| Trivy secrets | $(status_icon "$TRIVY_SECRET") |"
echo
echo "<details>"
echo "<summary>Project detection</summary>"
echo
echo "| Language | Files |"
echo "|---|---:|"
echo "| PHP | $PHP_COUNT |"
echo "| JavaScript | $JS_COUNT |"
echo "| TypeScript | $TS_COUNT |"
echo "| CSS | $CSS_COUNT |"
echo
echo "</details>"
echo
} >> "$SUMMARY_FILE"
echo "Davidson CI report generated"