OpenCode's CI runs unit and e2e tests on Linux and Windows via a test workflow triggered on pushes to dev, pull requests, and manual dispatch, with OS-specific test commands and a shared Turbo build cache keyed on configuration and commits. The workflow manages concurrency differently per branch—dev runs use unique groups to preserve history, while PRs share groups per ref to cancel stale runs—and pins Node 24.15 for e2e to avoid Playwright hangs with newer Node versions.
The CI test workflow runs on pushes to dev, pull requests, and manual dispatch, targeting both Linux (blacksmith-4vcpu-ubuntu-2404) and Windows (blacksmith-4vcpu-windows-2025) for both the unit and e2e jobs.[1] On the dev branch, the concurrency group is unique per run (keyed on github.run_id) so that cancelled checks do not pollute the default-branch commit history; PRs and other branches share a group per PR or ref and cancel stale runs.[1]
Unit-test jobs set up Node 24; e2e jobs set up Node 24.15. Bun is provisioned for both via the shared local action ./.github/actions/setup-bun.[1] Turbo build cache is stored in node_modules/.cache/turbo and keyed on the OS, a hash of turbo.json and all package.json files, and the commit SHA, with OS-scoped fallback restore keys.[1]
Unit tests run with GITHUB_ACTIONS=false bun turbo test and time out after 20 minutes. On Windows, OPENCODE_EXPERIMENTAL_DISABLE_FILEWATCHER=true is set automatically to avoid file-watcher issues.[1] On Linux only, CI additionally runs bun run check:generated in packages/client to validate the generated client, then bun run test:httpapi in packages/opencode to exercise HttpApi gates.[1]
E2e tests use Playwright and run only Chromium. Node 24.15 (not 24.16) is pinned because Playwright 1.59 hangs while extracting Chromium under Node 24.16.[1] E2e tests are launched with bun --cwd packages/app test:e2e:local and time out after 30 minutes. Playwright artifacts (results and report) are uploaded and retained for 7 days on every run, including failures.[1]
Sources