Because tests are plain .js in your repo with no proprietary format, CI is
straightforward.
A minimal job
jobs: e2e: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: { node-version: 20 } - run: npx @unotest/web install-chromium - run: npx @unotest/web collection smoke --workers=4 env: APP_BASE_URL: ${{ secrets.APP_BASE_URL }} TEST_USER_EMAIL: ${{ secrets.TEST_USER_EMAIL }} TEST_PASSWORD: ${{ secrets.TEST_PASSWORD }}Tips
- Browsers: run the bundled Chromium in CI; you can widen
browsersto Firefox/WebKit in your config. - Retries: turn on
retry.countfor CI (off in dev) to absorb transient flakiness — assertion failures still never retry. - Secrets: inject variables from your CI secret store; the runner masks them in logs and artifacts.
- Environments: target a named environment with
--env staging— it layersunotest/.env.staging/.secrets.stagingover the base files (details). - Split:
smokeon every push,regressnightly. - iOS:
unotest mobileneeds macOS runners with Xcode.
Failure artifacts
On failure the bundle (screenshot, console,
semantic DOM, trace) is written into the run’s directory as failure/, under
the project’s unotest/.runs/ (or unotest/.runs.<env>/ for a run started
with --env); UNOTEST_ARTIFACTS_ROOT moves that whole tree to another root.
Upload the run directory as a CI artifact for inspection. A red collection
also prints the failing scenario’s own output and the path of its run
directory into the job log (see Run smoke / regress).