Your pytest report, one click from the PR
pytest-html with --self-contained-html packs the entire report — failures, screenshots, logs — into a single file. That makes it the easiest deploy you'll ever do: point the action at the file, get a link back.
Drop your pytest-html report here — get a live link
.zip, folder, or single .html — free, no account, live for 7 days.
The artifact dead-end
A red pytest run ends with a wall of console output and a report file zipped into artifacts. The report has the actual answers — which test, which assertion, what the page looked like — but opening it means download, extract, double-click.
Single-file reports rot just as fast as folders do. The artifact tab doesn't care that your report was convenient locally; on CI it's still a zip nobody opens.
Two lines to a live link
Build your output like you already do, then hand the folder to the action:
Generate the report
pytest --html=report.html --self-contained-html.github/workflows/ci.yml
- uses: bitgate/ship-page-action@v1
if: always()
with:
path: report.htmlpath: report.html deploys exactly what the tool wrote — no detection to configure. The link goes in the job summary — add comment: true and it lands on the pull request too.
What you get
- The whole report is one self-contained file, so the deploy is a single upload — no zipping, no folder layout to get right
- if: always() publishes the report even when pytest exits non-zero, which is exactly the run you want to inspect
- Add name: pr-${{ github.event.number }} and an API key for a stable per-PR URL that every push redeploys in place
Questions
Do I need --self-contained-html?
It's the easy path — one file, one upload. Without it pytest-html writes separate assets; that works too, just point path at the report's directory instead of the file.
Does the link work without an account?
Yes. Anonymous deploys need zero config and stay live for 7 days. Viewers never log in — the URL is the access control.
What about pytest-cov output in the same run?
Deploy both: two action steps, or point path at a directory holding report.html and htmlcov/ together. Coverage has its own preset too — engine: coverage-py auto-detects htmlcov/.
Try it on your next run
Anonymous deploys need no account and no key — paste the step, get a link. When you want stable URLs that redeploy in place, an API key and a name are all it takes.
Need to share the report with someone outside GitHub? How to share a GitHub Actions artifact without a login.