Continuously validates published releases and source-built @utoo/pack candidates against Umi, Ant Design Pro, Ant Design, Father, Dumi, and EVJS. Each suite injects the candidate into a fresh consumer checkout, runs its real utoopack build or E2E workflow in isolation, and verifies the expected output.
| Suite | Consumer | E2E coverage |
|---|---|---|
umi |
umijs/umi@master |
Runs Umi's native utoopack browser E2E plus its qiankun slave and utoopack master E2Es |
ant-design-pro |
ant-design/ant-design-pro@master |
Runs the production Umi Max + utoopack build and starts its utoopack dev server |
ant-design |
ant-design/ant-design@7793cab |
Runs the production Dumi site build and the exact utoopack dev startup from utooland/utoo#3332 |
father |
umijs/father@master |
Builds Father, then builds its utoopack UMD example |
dumi |
umijs/dumi@master |
Builds Dumi from source, then builds and starts a minimal site based on Dumi's official template with utoopack |
evjs |
afx-team/evjs@main |
Builds EVJS packages, starts its basic app with ev dev, and runs its bundler-utoopack Playwright project |
evjs-shared-runtime |
afx-team/evjs@main |
Enables sharedRuntime in the disposable two-page MPA example, runs its Chromium E2E, and verifies both pages load the same runtime asset last |
Every suite verifies that its expected output directory exists and is non-empty. Node.js 22 is used in CI, satisfying utoopack's Node.js 20+ requirement.
For EVJS, the runner also verifies the candidate from packages/bundler-utoopack's module-resolution context. Its upstream lockfile currently contains a workspace-local @utoo/pack entry, so the disposable checkout removes that stale generated copy after installation before running E2E; this prevents the root override from producing a false-positive result.
Requirements: Node.js 22, Git, and Utoo 1.1.8 or newer. The project self-pins to Utoo 1.1.8.
ut install
ut test
ut lint
ut check:workflow
# Show suites
ut ecosystem -- --list
# Test a published version or dist-tag
ut ecosystem -- --suite father --pack latest
ut ecosystem -- --suite ant-design-pro --pack 1.5.3
ut ecosystem -- --suite ant-design --pack latest
ut ecosystem -- --suite evjs --pack latest
# Run the shared runtime regression alone against a candidate containing the feature
ut ecosystem -- --suite evjs-shared-runtime --pack /path/to/utoo-pack.tgz --pack-shared /path/to/utoo-pack-shared.tgz
# Inspect the exact plan without cloning or installing
ut ecosystem -- --suite dumi --pack latest --dry-runTo test locally built tarballs:
node scripts/prepare-candidate.mjs \
--source /path/to/utoo \
--out candidate-artifacts
ut ecosystem -- \
--suite umi \
--pack candidate-artifacts/utoo-pack.tgz \
--pack-shared candidate-artifacts/utoo-pack-shared.tgzConsumer checkouts are disposable and live under workspace/. Use --keep to reuse an existing checkout, --ref <branch|tag|commit> to test a consumer ref, or --repo <owner/repo> to test a fork.
The Utoopack ecosystem CI workflow supports four entry points:
- Daily schedule: the seven suites in
allagainst the npmlatesttag. - Manual run: choose npm/source mode, an individual suite or
all, and optionally a harness branch to validate. repository_dispatch: event typeutoopack-ecosystem-ciwith the same values inclient_payload.- Reusable workflow: call it directly from the utoo repository so the result appears on the originating PR or commit.
In npm mode, pack_spec is an npm version or dist-tag. In source mode, the workflow checks out utoo_repository@utoo_ref, initializes the next.js submodule, builds the Linux x64 native package once, packs @utoo/pack and @utoo/pack-shared, and shares those tarballs with the selected consumer jobs.
The workflow's all selector runs all seven suites, including evjs-shared-runtime, on the daily schedule and for Utoopack releases. It is a workflow input, not a name accepted by the local ut ecosystem -- --suite CLI. To run only the shared runtime check, select evjs-shared-runtime (or use source mode with a Utoo ref containing the feature before its npm release). The npm latest package must contain sharedRuntime for the scheduled all run to pass.
Add a small workflow to the utoo repository:
name: Ecosystem CI
on:
pull_request:
types: [opened, synchronize, reopened]
workflow_dispatch:
permissions:
contents: read
jobs:
ecosystem:
uses: utooland/utoo-ecosystem-ci/.github/workflows/ecosystem-ci.yml@main
with:
candidate_mode: source
utoo_repository: ${{ github.event.pull_request.head.repo.full_name || github.repository }}
utoo_ref: ${{ github.event.pull_request.head.sha || github.sha }}
suite: all
harness_repository: utooland/utoo-ecosystem-ci
harness_ref: mainFor a published Utoopack release, set candidate_mode: npm, pack_spec to the newly published version, and suite: all in the reusable workflow call. The harness ref must contain the evjs-shared-runtime suite.
No secrets are required for public repositories. GitHub-hosted runners need enough time and disk for the one-time Rust/NAPI source build; the source preparation job has a three-hour timeout and frees unused runner images first.
gh api --method POST repos/utooland/utoo-ecosystem-ci/dispatches \
-f event_type=utoopack-ecosystem-ci \
-f 'client_payload[candidate_mode]=npm' \
-f 'client_payload[pack_spec]=latest' \
-f 'client_payload[suite]=all'This repository itself uses Utoo (ut install, ut test, and ut lint) and keeps an npm-compatible package-lock.json, which Utoo reads and updates. JavaScript is linted with @utoo/lint; its files, ignores, and rules live in utlint.config.ts. ut check:workflow separately enforces the GitHub Actions SHA policy. Consumer checkouts generally use the package manager declared by each upstream repository; the large Ant Design and Ant Design Pro dependency graphs use Utoo for faster installation while retaining their upstream npm scripts and npm-compatible dependency overrides.
Suite commands live in src/suites.mjs. Keep them aligned with the consumer repositories' own CI and examples. External GitHub Actions are pinned to full commit SHAs; ut check:workflow enforces that policy.