Appearance
Continuous integration
In CI there is no login. The only thing to set is the project token:
- Dashboard → your project → Setup → create a token (
et_proj_…), named after the CI. - Store it as a CI secret named
EASYTRACE_TOKEN. - Run the same command as locally — the committed
easytrace.config.jsontells the CLI which suites to upload.
When EASYTRACE_TOKEN is set it always wins over a stored login, and the project field of the config is ignored: the token already belongs to one project.
GitHub Actions
yaml
name: test
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: pnpm/action-setup@v4
- uses: actions/setup-node@v4
with: { node-version: 24, cache: pnpm }
- run: pnpm install --frozen-lockfile
- run: pnpm test:report # easytrace run -- …
env:
EASYTRACE_TOKEN: ${{ secrets.EASYTRACE_TOKEN }}That's all: the build id (run id + attempt), branch, commit, pull request number and a link back to the workflow run are detected. easytrace run keeps the tests' exit code, so the job still fails when tests fail.
Installing the CLI from the private GitHub preview needs one more secret — see Install the CLI → Access from CI.
Separate test and upload steps
If the tests run in their own step, upload in the next one even when they failed:
yaml
- run: pnpm test:json
- run: pnpm exec easytrace upload
if: ${{ !cancelled() }}
env:
EASYTRACE_TOKEN: ${{ secrets.EASYTRACE_TOKEN }}Several jobs, one build
A unit job and an e2e job of the same workflow share the build id, so their suites appear side by side ("Other suites in this build"). Give each job its own suites (--suite unit, --suite e2e, or separate entries in the config).
Other CI systems
| CI | Detected |
|---|---|
| GitHub Actions | Build, branch, commit, PR, link, re-run attempt |
| GitLab CI | Pipeline, branch, commit, merge request, user, parallel: node (shard) |
| CircleCI | Workflow, branch, commit, PR, parallel node index (shard) |
| Jenkins | Build tag, branch, commit, change request (multibranch pipelines) |
Anything else with CI=true | Set EASYTRACE_BUILD_ID (and optionally EASYTRACE_BRANCH, EASYTRACE_COMMIT_SHA, EASYTRACE_PR_NUMBER, EASYTRACE_BUILD_URL) |
GitLab example — add EASYTRACE_TOKEN as a masked CI/CD variable (Settings → CI/CD → Variables); jobs receive it automatically:
yaml
test:
script:
- pnpm install --frozen-lockfile
- pnpm test:reportSharded runs
Shards of the same suite with the same build id merge into one run. On CircleCI and GitLab (parallel:) the shard is detected; elsewhere pass it:
bash
easytrace upload ".easytrace/*.json" --suite e2e --shard 2/4Coverage is skipped on sharded runs; upload the merged coverage from a final job — see Coverage.