openpencil/.github/workflows/ci.yml
Danila Poyarkov d44c1f9d82
ci: parallelize quality and trim shard builds (#558)
* ci: parallelize quality and trim shard builds

- Split source, package, repository, and Storybook checks into independent jobs

- Build only Core before quick unit shards instead of all public packages

- Keep full package and dist validation in the dedicated package-quality job

- Disable duplicate Storybook component metadata extraction

* fix(ci): build declarations before source checks

* fix(ci): apply review security and docgen settings

- Pin checkout and disable credential persistence

- Declare read-only workflow permissions

- Explicitly disable Storybook Vue docgen

* ci: clarify check and step names

* fix(ci): cap workflow job runtimes

- Limit the WebView dependency install to three minutes

- Limit native contracts to eight minutes

- Limit all other CI jobs to ten minutes

* ci: retry native contracts on a fresh runner

* ci: move native contracts to Ubuntu 24

- Leave the deprecated Ubuntu 22 hosted image

- Retry WebKit dependency provisioning on the current runner image

* ci: prebuild native contract dependencies

* ci: pin native contracts image digest

* fix(ci): authenticate native image pulls

* fix(ci): include Bun archive tooling

* ci: pin updated native contracts image

* fix(tools): register CI image tooling
2026-08-18 22:52:18 +03:00

175 lines
4.5 KiB
YAML

name: CI
on:
pull_request:
branches: [master]
paths-ignore:
- 'packages/docs/**'
- 'openspec/**'
- '*.md'
permissions:
contents: read
packages: read
concurrency:
group: ci-${{ github.ref }}
cancel-in-progress: true
jobs:
source-quality:
name: Code quality
timeout-minutes: 10
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1
with:
persist-credentials: false
- uses: ./.github/actions/setup-bun
- name: Generate package declarations
run: bun run build:packages
- name: Verify formatting
run: bun run format:check
- name: Lint TypeScript and Vue
run: bun run lint
- name: Typecheck application and SDKs
run: bun run typecheck
- name: Enforce architecture and type-shape boundaries
run: bun run check:arch && bun run test:type-shapes
package-quality:
name: Package integrity
timeout-minutes: 10
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1
with:
persist-credentials: false
- uses: ./.github/actions/setup-bun
- name: Build publishable packages
run: bun run build:packages
- name: Validate package exports
run: bun run check:packages
- name: Detect unused dependencies and files
run: bun run check:deps
- name: Validate workspace dependency policy
run: bun run check:monorepo
repository-quality:
name: Repository hygiene
timeout-minutes: 10
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1
with:
persist-credentials: false
- uses: ./.github/actions/setup-bun
- name: Validate translations
run: bun run check:i18n
- name: Validate documentation links and structure
run: bun run check:docs
- name: Audit critical dependency vulnerabilities
run: bun run check:audit
- name: Scan for committed secrets
run: bun run check:secrets
- name: Test repository tooling
run: bun run test:tools
- name: Detect duplicated product code
run: bun run test:dupes
storybook:
name: Component workshop
timeout-minutes: 10
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1
with:
persist-credentials: false
- uses: ./.github/actions/setup-bun
- name: Build component dependencies
run: bun run build:packages
- name: Build static Storybook
run: bun run build-storybook
native-test-contracts:
name: Native app contracts
timeout-minutes: 8
runs-on: ubuntu-24.04
container:
image: ghcr.io/open-pencil/native-contracts-ci@sha256:64e6b1b50a988c1cefe2b69ac9d58076fd743b18391fa2dbd1d153eba2be9521
credentials:
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1
with:
persist-credentials: false
- uses: dtolnay/rust-toolchain@stable
- uses: Swatinem/rust-cache@v2
with:
workspaces: desktop -> target
key: native-test
- uses: ./.github/actions/setup-bun
- name: Typecheck native interaction tests
run: bun run check:native-test
- name: Compile native-test Tauri feature
run: cargo check --manifest-path desktop/Cargo.toml --features native-test
unit-tests:
timeout-minutes: 10
runs-on: ubuntu-latest
strategy:
fail-fast: true
matrix:
group: [app, dom, editor, fig, render, scene, vue]
name: Engine tests — ${{ matrix.group }}
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1
with:
persist-credentials: false
- uses: ./.github/actions/setup-bun
with:
lfs: 'true'
- name: Build shared Core test dependency
run: bun --filter @open-pencil/core build
- name: Run ${{ matrix.group }} engine tests
shell: bash
run: |
mapfile -t test_files < <(bun tools/unit-tests/src/list.ts "${{ matrix.group }}")
if [ "${#test_files[@]}" -eq 0 ]; then
echo "No tests found for shard ${{ matrix.group }}"
exit 0
fi
bun test "${test_files[@]}"
env:
BUN_HEAVY_TESTS: 'false'