Pure-reference for cross-CI test workflow conventions - when to shard (and how many shards), retry policy (which failures are safe to retry), flake-quarantine integration, artifact retention, per-trigger cadence (per-PR vs per-merge vs nightly), concurrency-cancel patterns, per-job timeouts, secret management, and cross-CI portability. Use as the team's reference for CI test-workflow design across GitHub Actions / GitLab CI / Jenkins / CircleCI; per-CI reporting and per-language reporter / cache-key lookups live in references/.
79
99%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Passed
No findings from the security scan
Deep reference for ci-test-job-conventions SKILL.md. Consult by CI
platform and language once the workflow's shard / retry / cadence
decisions are made - these tables carry no design decisions, only the
concrete mechanism per platform and per language.
Every modern CI accepts JUnit XML via either a native plugin or a third-party action:
| CI | JUnit XML support |
|---|---|
| GitHub Actions | dorny/test-reporter action |
| GitLab CI | artifacts.reports.junit: (native) |
| Jenkins | junit '...' (JUnit Plugin; native) |
| CircleCI | store_test_results: (native; feeds Insights) |
Always emit JUnit XML; the same output feeds every CI's reporting and
the downstream junit-xml-analysis parser (in the qa-test-reporting
plugin).
| Language | Default reporter | JUnit XML output |
|---|---|---|
| JavaScript (Jest) | default | jest-junit (separate package) |
| TypeScript | (same as JS) | (same) |
| Python (pytest) | pytest | pytest --junitxml=reports/junit.xml |
| Java (Maven) | Surefire | target/surefire-reports/*.xml (default) |
| Java (Gradle) | Gradle Test | build/test-results/test/*.xml (default) |
| .NET | dotnet test | --logger "junit;LogFilePath=..." |
| Go | go test | gotestsum --junitfile=junit.xml |
| Ruby (RSpec) | RSpec | --format RspecJunitFormatter --out junit.xml |
The same JUnit XML feeds every CI's reporting + downstream analysis tools.
Per-language cache key recommendations:
package-lock.json hashrequirements.txt / poetry.lock hashpom.xml hash; cache ~/.m2~/.gradle~/go/pkg/mod on go.sum hash~/.cargo on Cargo.lock hashBenefits: repeat installs are sub-second vs 30s-2min cold. Trade-off: cache eviction when key changes; extra config to manage.