Jest runs your tests and prints results to the console. CI captures the output, but sharing it with your team means “go check the workflow run” or screenshotting terminal output into Slack. There’s no built-in way to share Jest results as a link.
The Sharing Problem
Jest outputs to stdout by default. You can add reporters for JSON or HTML, but those files are stuck in CI artifacts:
Common (Bad) Solutions
1. “Check the CI logs”
- Requires repo access and navigating through workflow runs
- QA or PMs might not have CI access
- Logs disappear when retention expires
2. CI artifacts
- Download a zip, extract, find the right file
- GitHub Actions keeps artifacts 90 days max
- Finding the right artifact in dozens of workflow runs is tedious
3. Screenshot the terminal
- Loses all structure and detail
- Can’t reference later
- Looks terrible in Slack
4. Paste JSON output in a thread
- Nobody reads raw JSON
- Truncated for large test suites
- No filtering or navigation
Better: Hosted Jest Reports with Shareable Links
Upload Jest results after every CI run. Every test run gets a permanent URL that anyone on your team can open.
What This Looks Like
- CI runs your Jest tests
- Results upload automatically
- You get a URL like
https://app.gaffer.sh/reports/abc123 - Share in Slack, GitHub PRs, Jira — anywhere
- Anyone with access sees the full report
No downloads. No CI access required. No expiring artifacts.
Setting Up Jest Report Sharing with Gaffer
Step 1: Configure Jest Output
CTRF gives the richest analytics data:
npm install jest-ctrf-json-reporter --save-dev// jest.config.js
module.exports = {
reporters: [
'default',
['jest-ctrf-json-reporter', { outputFile: 'ctrf-report.json' }]
]
};Gaffer also accepts Jest’s built-in JSON output and jest-html-reporter if you prefer those.
Step 2: Add the Upload Step to CI
GitHub Actions:
- name: Run tests
run: npm test
- name: Upload to Gaffer
if: always()
uses: gaffer-sh/gaffer-uploader@v1
with:
gaffer_api_key: ${{ secrets.GAFFER_UPLOAD_TOKEN }}
report_path: ./ctrf-report.json
commit_sha: ${{ github.sha }}
branch: ${{ github.ref_name }}GitLab CI:
test:
script:
- npm ci
- npm test
after_script:
- |
curl -X POST https://app.gaffer.sh/api/upload \
-H "X-API-Key: $GAFFER_UPLOAD_TOKEN" \
-F "[email protected]" \
-F 'tags={"commitSha":"'"$CI_COMMIT_SHA"'","branch":"'"$CI_COMMIT_REF_NAME"'"}'Step 3: Share the Link
After upload, share the URL in Slack, GitHub PR comments, or Jira tickets. Recipients see the full report in their browser.
Slack and Webhook Notifications
Stop checking CI manually. Get notified when Jest tests finish:
Slack integration:
[FAILED] my-project - main
3 tests failed, 142 passed
View report: https://app.gaffer.sh/reports/abc123- Direct link to the full report
- Filter by branch — only notify on
main, skip feature branches
Webhooks:
- Send results to any endpoint
- Integrate with your existing alerting or workflow tools
- Trigger custom actions on failure
No more “did the tests pass?” messages in Slack. See Test Failure Notifications for the full setup guide.
GitHub Integration
Commit statuses show test results directly on PRs. No clicking through to CI logs to find out if tests passed.
Monorepo Support
Running Jest across multiple packages? Upload results from each:
- name: Upload to Gaffer
if: always()
uses: gaffer-sh/gaffer-uploader@v1
with:
gaffer_api_key: ${{ secrets.GAFFER_UPLOAD_TOKEN }}
report_path: |
./packages/api/ctrf-report.json
./packages/web/ctrf-report.json
./packages/shared/ctrf-report.jsonAll results appear in the same project dashboard.
Get Started
Gaffer’s free tier includes 500 MB of storage with 7-day retention. Paid plans offer extended retention up to 90 days.