upload tests¶
Upload JUnit XML or CTRF test results to Drape.
Usage¶
Examples¶
# Upload a single file
drape upload tests results.xml --org acme --repo my-service --wait
# Upload multiple files with a glob
drape upload tests "./reports/**/*.xml" --org acme --wait
# Dry run (parse and validate, don't upload)
drape upload tests results.xml --dry-run
Flags¶
All global flags apply, plus:
| Flag | Default | Description |
|---|---|---|
--wait |
true |
Wait for server-side processing and print summary |
--timeout |
120 |
Max wait time in seconds |
--job-name |
(auto-detected) | Display name for this upload's "Job" column in the dashboard. Auto-detected from GITHUB_JOB but set explicitly for matrix shards so shards don't collapse under the matrix base name. |
--group |
Group label (e.g. python, playwright). Use when multiple test suites upload to the same repo. |
|
--pr-number |
(auto-detected) | PR number for PR-specific ingestion. |
Attribution¶
TestRun.job_name in the dashboard is whatever you pass via --job-name (or the auto-detected GITHUB_JOB if unset). For non-matrix jobs this is correct out of the box. For matrix shards you should pass an explicit name like Test Python (1/3), otherwise all shards collapse into one entry in the "Top Slowest Tests" table.
This is a CLI/workflow responsibility — the server stores whatever the CLI sends verbatim. See the GitHub Actions testing guide for the canonical matrix pattern.
Exit Codes¶
| Code | Meaning |
|---|---|
| 0 | Success — no unsuppressed failures |
| 1 | Test failure — unsuppressed failures exist |
| 2 | Usage error — invalid flags or missing required args |
| 3 | Upload error — network, auth, or API error |
| 4 | Timeout — server processing took too long |
| 5 | Parse error — couldn't parse input files |
When --wait is used, the CLI waits for server-side processing and prints a summary including suppression status. The exit code reflects whether unsuppressed failures exist.