Fixed perf-aggregate-report job failure caused by artifact files
conflicting with git checkout.
The issue:
- Job downloads artifacts from perf-report (reports/4.2.5/*)
- Tries to checkout main with 'git checkout -B main origin/main'
- Fails because artifact files would be overwritten
The solution:
1. Stash all artifact files and generated content
2. Checkout main branch cleanly
3. Pull latest changes from origin/main
4. Pop stash to restore artifacts
5. Add and commit aggregated report
This preserves the artifact files while properly syncing with remote main.
Convert complex shell commands to multi-line blocks to fix YAML parsing:
- Changed `test -z "$VAR" && ... || true` patterns to proper if/else blocks
- Used `|` syntax for multi-line shell scripts
- Fixed variable expansion in $FILES for build/un command
- Separated git diff --cached logic into if/else block
This resolves the error:
"jobs:perf-aggregate-report:script config should be a string or
a nested array of strings up to 10 levels deep"
YAML validated successfully with Python yaml.safe_load()
- Add perf-aggregate-report CI job to analyze variance across releases
- Implement dynamic version discovery using git tags (ever-growing)
- Generate charts via UN sandbox using matplotlib
- Create AGGREGATED-PERFORMANCE.md with comprehensive methodology
- Add Makefile target for local report generation
- Include 3 visualization charts showing variance trends
Key findings: 2-3x performance variance due to orchestrator placement
on CPU-bound pool causing non-deterministic scheduling.
- Wait 60s after test matrix completes for data to settle
- Checkout main branch BEFORE generating reports to avoid unstaged changes
- Use git checkout -B to force-create branch from origin/main
- bash: Add file existence check before reading
- bash: Improve exit code handling for invalid JSON results
- bash: Expand detect_language to support all 42 languages
- python: Use detect_language() instead of non-existent EXT_MAP
- python: Remove exit_on_error param that doesn't exist
- python: Replace read_file test with validate_keys existence check
Adds cleanup-services stage to child pipeline that destroys any
existing test services before the 42-language parallel test matrix
runs. Prevents concurrency limit failures from orphaned services.
Updates generate-perf-report.sh to produce markdown with:
- Embedded chart images for all 6 visualizations
- Dynamic observations pulled from actual performance data
- Slowest/fastest language names extracted from JSON
- Raw data table at the end
The markdown now matches the manual report format and will be
generated automatically on each tagged release.
- Add setup-ci-deploy-key target to automate SSH deploy key creation
- Use protected=true so DEPLOY_KEY only exposed on protected tags
- Add test-ci-deploy-key target to verify SSH access
- Add remove-ci-deploy-key target for cleanup
- Include instructions about protecting release tags in GitLab
- Add input validation for tag format
- Check for required tools (curl, jq, bc)
- Skip if report already exists (idempotent)
- Add colored logging for better visibility
- Handle push failures gracefully
- Use 'rules' instead of 'only' for modern GitLab CI
- Add GIT_DEPTH: 0 for full history access
- Add scripts/generate-perf-charts.py for matplotlib visualizations
- Update generate-perf-report.sh for versioned directories (reports/TAG/)
- Add make perf-charts and make perf-all targets
- Add GitLab CI perf-report job to auto-commit after tagged releases
- Generated 6 charts for 4.2.0: dashboard, duration, histogram, leaders, etc.
Each release now gets its own reports/TAG/ directory with:
- perf.json (raw timing data)
- perf.md (markdown report)
- chart-*.png (6 visualizations)