🏗️ Build and Test JellyTau / Run Tests (push) Successful in 4m59s
Publish Documentation / Build & publish docs to gitea-pages (push) Failing after 5m23s
Traceability Validation / Check Requirement Traces (push) Successful in 15s
Build & Release / Run Tests (push) Successful in 5m5s
🏗️ Build and Test JellyTau / Android Compile Check (push) Successful in 4m41s
Build & Release / Build Linux (push) Successful in 17m20s
Build & Release / Build Android (push) Successful in 22m29s
Build & Release / Create Release (push) Successful in 5s
bun is already baked into the jellytau-builder image (Dockerfile.builder), so oven-sh/setup-bun@v1 was redundant. Fetching that GitHub-hosted action from the self-hosted Gitea runner hangs the job before any steps run. Removed from traceability-check, traceability, and publish-docs workflows; build-and-test and build-release never used it and never stalled.
152 lines
4.7 KiB
YAML
152 lines
4.7 KiB
YAML
name: Traceability Validation
|
|
|
|
on:
|
|
push:
|
|
branches:
|
|
- master
|
|
- main
|
|
- develop
|
|
pull_request:
|
|
branches:
|
|
- master
|
|
- main
|
|
- develop
|
|
|
|
jobs:
|
|
validate-traces:
|
|
runs-on: linux/amd64
|
|
name: Check Requirement Traces
|
|
container:
|
|
image: gitea.tourolle.paris/dtourolle/jellytau-builder:latest
|
|
|
|
steps:
|
|
- name: Checkout repository
|
|
uses: actions/checkout@v4
|
|
with:
|
|
fetch-depth: 0
|
|
|
|
# bun is baked into jellytau-builder (see Dockerfile.builder); no setup-bun
|
|
# action needed — fetching it stalls on this Gitea runner.
|
|
- name: Install dependencies
|
|
run: bun install
|
|
|
|
- name: Extract traces
|
|
run: |
|
|
echo "🔍 Extracting requirement traces..."
|
|
bun run traces:json > traces-report.json
|
|
|
|
- name: Validate traces
|
|
run: |
|
|
set -e
|
|
|
|
echo "📊 Validating requirement traceability..."
|
|
echo ""
|
|
|
|
# Parse JSON
|
|
TOTAL_TRACES=$(jq '.totalTraces' traces-report.json)
|
|
UR=$(jq '.byType.UR | length' traces-report.json)
|
|
IR=$(jq '.byType.IR | length' traces-report.json)
|
|
DR=$(jq '.byType.DR | length' traces-report.json)
|
|
JA=$(jq '.byType.JA | length' traces-report.json)
|
|
|
|
# Print coverage report
|
|
echo "✅ TRACES Found: $TOTAL_TRACES"
|
|
echo ""
|
|
echo "📋 Coverage Summary:"
|
|
echo " User Requirements (UR): $UR / 39 ($(( UR * 100 / 39 ))%)"
|
|
echo " Integration Requirements (IR): $IR / 24 ($(( IR * 100 / 24 ))%)"
|
|
echo " Development Requirements (DR): $DR / 48 ($(( DR * 100 / 48 ))%)"
|
|
echo " Jellyfin API Requirements (JA): $JA / 3 ($(( JA * 100 / 3 ))%)"
|
|
echo ""
|
|
|
|
COVERED=$((UR + IR + DR + JA))
|
|
TOTAL_REQS=114
|
|
COVERAGE=$((COVERED * 100 / TOTAL_REQS))
|
|
|
|
echo "📈 Overall Coverage: $COVERED / $TOTAL_REQS ($COVERAGE%)"
|
|
echo ""
|
|
|
|
# Check minimum threshold
|
|
MIN_THRESHOLD=50
|
|
if [ "$COVERAGE" -lt "$MIN_THRESHOLD" ]; then
|
|
echo "❌ ERROR: Coverage ($COVERAGE%) is below minimum threshold ($MIN_THRESHOLD%)"
|
|
exit 1
|
|
fi
|
|
|
|
echo "✅ Coverage is acceptable ($COVERAGE% >= $MIN_THRESHOLD%)"
|
|
|
|
- name: Check modified files
|
|
if: github.event_name == 'pull_request'
|
|
run: |
|
|
echo "🔍 Checking modified files for traces..."
|
|
echo ""
|
|
|
|
# Get changed files
|
|
CHANGED=$(git diff --name-only origin/${{ github.base_ref }}...HEAD | grep -E '\.(ts|tsx|svelte|rs)$' || echo "")
|
|
|
|
if [ -z "$CHANGED" ]; then
|
|
echo "✅ No TypeScript/Rust files changed"
|
|
exit 0
|
|
fi
|
|
|
|
echo "📝 Changed files:"
|
|
echo "$CHANGED" | sed 's/^/ /'
|
|
echo ""
|
|
|
|
# Check each file
|
|
# Pipe into the loop instead of a here-string (<<<) so this step works
|
|
# under POSIX sh/dash, not just bash. Use `case` instead of `[[ == ]]`
|
|
# for the same reason. The loop runs in a subshell (so a counter var
|
|
# wouldn't survive), so we record warnings in a temp file and count it
|
|
# afterwards.
|
|
MISSING_FILE=$(mktemp)
|
|
echo "$CHANGED" | while IFS= read -r file; do
|
|
# Skip test files
|
|
case "$file" in
|
|
*.test.*) continue ;;
|
|
esac
|
|
|
|
if [ -f "$file" ]; then
|
|
if ! grep -q "TRACES:" "$file"; then
|
|
echo "⚠️ Missing TRACES: $file"
|
|
echo "$file" >> "$MISSING_FILE"
|
|
fi
|
|
fi
|
|
done
|
|
|
|
MISSING_TRACES=$(wc -l < "$MISSING_FILE" | tr -d ' ')
|
|
rm -f "$MISSING_FILE"
|
|
|
|
if [ "$MISSING_TRACES" -gt 0 ]; then
|
|
echo ""
|
|
echo "📝 Recommendation: Add TRACES comments to new/modified code"
|
|
echo " Format: // TRACES: UR-001, UR-002 | DR-003"
|
|
echo ""
|
|
echo "💡 For more info, see: scripts/README.md"
|
|
fi
|
|
|
|
- name: Generate full report
|
|
if: always()
|
|
run: |
|
|
echo "📄 Generating full traceability report..."
|
|
bun run traces:markdown
|
|
|
|
- name: Display report summary
|
|
if: always()
|
|
run: |
|
|
echo ""
|
|
echo "📊 Full Report Generated"
|
|
echo "📁 Location: docs/traceability.md"
|
|
echo ""
|
|
head -50 docs/traceability.md || true
|
|
|
|
- name: Save artifacts
|
|
if: always()
|
|
uses: actions/upload-artifact@v3
|
|
with:
|
|
name: traceability-reports
|
|
path: |
|
|
traces-report.json
|
|
docs/traceability.md
|
|
retention-days: 30
|