Skip to main content
The Bruno CLI GitHub Action emits clean JUnit XML. Downstream actions render it for PR comments, Checks tab UI, Step Summary, or artifact upload. The action README documents all 13 canonical recipes. Common patterns:

Upload reports as artifacts

Pass reporter flags in command, then chain actions/upload-artifact:
To redact sensitive headers before upload, pass --reporter-skip-headers in command. See Generating Reports. What this does: Saves test report files (JUnit and HTML) as downloadable artifacts on the workflow run page. Anyone with repo access can download them for up to 90 days.

Slack notification on failure

Use action outputs with continue-on-error: true so the notification step still runs:
What this does: Runs Bruno tests, but if any fail, sends a Slack message with the failure count. continue-on-error: true lets the Slack step run even when tests fail. id: bruno names the step so later steps can read its outputs (steps.bruno.outputs.failed).

PR comment on every run

EnricoMi/publish-unit-test-result-action posts a sticky PR comment updated on re-runs, plus a check run with structured results.
Use if: always() so EnricoMi runs even when the Bruno step fails. Otherwise users do not see the comment on failure. What this does: Runs your Bruno tests, writes a JUnit report to results.xml, then posts a sticky comment on the PR with pass/fail details. The comment updates in place on re-runs instead of spamming new comments.

PR comment only on failures

What this does: Same as above, but the PR comment only appears when something failed. Successful runs stay quiet.

Checks tab UI (polyglot test stacks)

Use dorny/test-reporter when you want Bruno results alongside Jest, Pytest, or other JUnit-emitting suites:
What this does: Shows Bruno test results as a separate check run in the PR Checks tab, the same way Jest or Pytest results appear. Good when your repo runs multiple test tools and you want a consistent UI.

Matrix across environments

Use distinct JUnit paths and artifact names per matrix leg:
Include the matrix key in both --reporter-junit and the artifact name to avoid duplicate-name errors across legs. What this does: Runs the same collection twice in parallel, once per environment (staging and prod). Each run gets its own report file and artifact so results do not overwrite each other.

Soft-fail

Record results without failing the build, then act on outputs:
The Bruno step still appears red on failure (honest signal), but downstream steps proceed. What this does: Runs tests and records results, but does not stop the workflow when tests fail. Use this when you want to notify or log failures without blocking the entire pipeline.

Enterprise mTLS

Write cert files from secrets, then pass paths in command:
What this does: Writes TLS certificates from GitHub Secrets to temp files, then passes those file paths to Bruno so it can call APIs protected by mTLS (mutual TLS). Secrets never appear in logs.
Forked PR caveat: GitHub restricts GITHUB_TOKEN to read-only for pull_request events from forked repositories. PR comment actions need write permission, which may require pull_request_target with care. See EnricoMi’s fork PR docs.