Guide
How to publish an HTML report from GitHub Actions and share it
Updated 30 October 2026
A workflow can keep the report as an artifact, which reviewers download as a ZIP, or publish it to GitHub Pages, which is public on the internet unless your organization is on GitHub Enterprise Cloud. The ashare GitHub Action publishes the report and posts its link in the pull request. With visibility: company only people who sign in with your company email open it, and each push updates the same link and the same comment.
Three ways to get a report out of CI
| Option | What the reader gets | Who can open it |
|---|---|---|
| Workflow artifact | A ZIP on the run’s summary page: upload-artifact zips files by default. Download, unpack, open locally. Kept 90 days by default. | People with read access to the repository, signed in to GitHub |
| GitHub Pages | A page at a URL | Anyone on the internet, even when the repository is private. Private publishing only on GitHub Enterprise Cloud, for people with read access. |
| ashare Action | A link in a pull request comment, a new version on every push | Anyone with the link, your company by email domain, or the people you add by email. No GitHub account needed. |
If everyone who reads the report already has access to the repository, an artifact keeps it inside GitHub and you need nothing else. The friction starts with readers outside the repository, a product manager or a client, and with reports that need a click, not a download.
Share a Playwright report
Playwright’s HTML reporter writes a self-contained folder, playwright-report by default. Screenshots and other attachments go into its data subfolder. Playwright’s CI guide warns that the report does not work when opened from disk: the reader extracts the artifact and runs npx playwright show-report, so they need Node.js and Playwright. Served from a link, it opens in the browser.
Zip the folder to keep the attachments, and publish the ZIP. Both steps run even when tests fail, which is when the report matters:
name: E2E
on: pull_request
permissions:
contents: read
pull-requests: write
jobs:
e2e:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7
- run: npm ci
- run: npx playwright install --with-deps
- run: npx playwright test --reporter=html
- if: ${{ !cancelled() }}
run: zip -r playwright-report.zip playwright-report
- if: ${{ !cancelled() }}
uses: Magir/ashare-action@v1
with:
file: playwright-report.zip
title: E2E report
api-key: ${{ secrets.ASHARE_API_KEY }}
visibility: companyThe Action takes HTML, Markdown or a ZIP. A ZIP needs index.html at its root or in its one folder, up to 200 files and 25 MB in all. A report without attachments can go up as playwright-report/index.html alone.
Share a Lighthouse report
The Lighthouse CLI writes HTML by default. In CI, run Chrome headless and name the file:
- run: npx lighthouse https://staging.example.com --output html --output-path lighthouse.html --chrome-flags="--headless"
- uses: Magir/ashare-action@v1
with:
file: lighthouse.html
api-key: ${{ secrets.ASHARE_API_KEY }}
visibility: companyLighthouse CI can upload reports to its temporary public storage: anyone with the link opens them, and they are deleted after a few days. That is fine for an open-source project. For a staging site behind a login, keep the report closed.
Two reports in one pull request do not collide: each file gets its own document and its own comment.
Choose who opens the link
visibility: public, the Action’s default: anyone with the link, so reviewers without an account can read it. Links are unguessable and search engines do not index them.visibility: company: everyone who signs in with an email on your company domain. It needs an organization on ashare; without one the step fails with 400 and nothing is published.visibility: private: you and the people you add, for example withnpx ashare-cli share <id> qa@agency.com.expires-in: 7d: the link stops working a week after the last run; every run extends it.
Readers sign in with a 6-digit code sent to their email. For company and private reports you see who opened them and when. Readers select text and comment, and an agent can pick up the threads with npx ashare-cli comments <id>.
Setup notes
- Create a key on ashare.net/me/api and save it as the repository secret
ASHARE_API_KEY: Settings → Secrets and variables → Actions. - The job needs
pull-requests: writeto post the comment. - GitHub does not pass secrets to workflows from forked repositories, so skip the step there:
if: github.event.pull_request.head.repo.full_name == github.repository. - On
pushthere is no pull request to comment on. Passartifact-idfrom the first run to keep a branch report at one link.
All inputs and outputs: GitHub Action.
ashare.net: your agent publishes HTML or Markdown and you choose who opens it: your company, specific emails or a password. Readers comment, the agent fixes the document.
Connect your agent