Use case

Test Artifact Management: Stop Downloading CI Zip Files

Store and retain the test reports, screenshots, and coverage from every CI run. One upload step, one URL per run, configurable retention, no zip files.

On this page

Your Playwright report is in GitHub Actions. The screenshot is in a Slack thread from last Tuesday. The coverage data is in an S3 bucket that two people have access to. When a test fails, the first ten minutes aren’t spent debugging. They’re spent finding the evidence.

For definitions and file types, read What Are Test Artifacts in Software Testing?. This page covers where the files go once CI has produced them.

Playwright HTML Test Report Example

Which Test Artifacts Are Worth Storing

Not everything a run produces is worth storage. These five are:

  • Test Reports - HTML, JSON, or XML summaries of test results (Playwright, Jest, Vitest, pytest, JUnit)
  • Screenshots & Videos - Visual evidence of test failures, especially for E2E tests
  • Log Files - Console output, stack traces, and debugging information
  • Coverage Reports - Code coverage data showing which lines were tested
  • Performance Metrics - Timing data, memory usage, and resource consumption

All five are cheap to generate and easy to lose. Storage is the whole problem.

The CI Artifact Expiration Problem

Most CI/CD platforms (GitHub Actions, GitLab CI, CircleCI) automatically delete test artifacts after a retention period - typically 30-90 days. This creates real problems:

  • Debugging old failures - When a bug resurfaces, the original test artifacts are gone
  • Compliance audits - Regulated industries need to retain test evidence for years, not months
  • Onboarding engineers - New team members can’t see historical context for test behavior
  • Flaky test analysis - Understanding intermittent failures requires data across many runs

Even worse, accessing artifacts while they exist is painful. You have to navigate to the CI provider, find the right workflow run, download a zip file, and extract it locally.

How Gaffer Solves Test Artifact Management

Gaffer provides searchable test artifact storage with configurable retention and instant team access:

Automatic Upload from CI

Add one step to your CI pipeline and Gaffer captures your test artifacts automatically:

- name: Upload to Gaffer
uses: gaffer-sh/gaffer-uploader@v2
with:
gaffer_upload_token: ${{ secrets.GAFFER_PROJECT_TOKEN }}
report_path: ./test-results

Instant Team Sharing

Every test run gets a URL in the Gaffer dashboard. Share it in Slack, add it to a bug ticket, or bookmark it for later. No downloads, no zip files.

For external collaborators, you can generate public share links with configurable expiration. They view the results in their browser without needing a Gaffer account.

Slack Notifications

Get notified in Slack when tests fail, with a direct link to the full report. Filter notifications by branch so you only hear about failures that matter.

Historical Analytics

Track test health over time with pass rate trends, flaky test detection, and historical analytics.

Supported Test Frameworks

Gaffer works with the test artifacts you already generate:

FrameworkReport Types
PlaywrightHTML reports, traces, screenshots
JestJSON output, jest-html-reporter
VitestHTML reports, JSON output
pytestpytest-html, JUnit XML
Any frameworkJUnit XML, CTRF JSON

Get Started

Gaffer’s free tier includes 500 MB of artifact storage with 7-day retention. Paid plans offer extended retention (up to 90 days) and up to 50 GB of storage.