name: MoUI CI
on:
push:
branches: [main]
pull_request:
branches: [main]
workflow_dispatch:
inputs:
run_slow_native_examples:
description: Build current-platform Skia native examples on macOS and Linux.
required: false
default: false
type: boolean
jobs:
moonbit-workspace-baseline:
name: MoonBit workspace baseline
runs-on: macos-14
steps:
- name: Checkout
uses: actions/checkout@v5
- name: Set up MoonBit
uses: ./.github/actions/setup-moonbit
- name: Install dependencies
run: |
moon version --all
sh scripts/ci-moon-update.sh
- name: Run MoonBit workspace baseline
run: |
moon check
moon test
moon info
git diff --exit-code
pr-profile:
name: PR profile gate
runs-on: macos-14
steps:
- name: Checkout
uses: actions/checkout@v5
- name: Set up MoonBit
uses: ./.github/actions/setup-moonbit
- name: Install dependencies
run: |
moon version --all
sh scripts/ci-moon-update.sh
- name: Run PR check profile
run: sh scripts/check.sh --profile pr
api-surface:
name: Public API surface
runs-on: macos-14
steps:
- name: Checkout
uses: actions/checkout@v5
- name: Set up MoonBit
uses: ./.github/actions/setup-moonbit
- name: Install dependencies
run: |
moon version --all
sh scripts/ci-moon-update.sh
- name: Ⓒ moon info — public interface generation (all packages)
run: |
# Regenerate only MoUI-tracked packages; mooncakes deps (e.g. bobzhang/openseek) are not in git.
# Skip vendored third_party modules whose package ids differ from filesystem paths.
while IFS= read -r path; do
case "$path" in
third_party/*) continue ;;
esac
moon info -p "$path"
done < <(git ls-files '**/pkg.generated.mbti' | sed 's|/pkg.generated.mbti$||')
- name: Check generated interface drift
run: git diff --exit-code -- '**/pkg.generated.mbti'
linux-platform:
name: Linux platform contracts
runs-on: ubuntu-24.04
steps:
- name: Checkout
uses: actions/checkout@v5
- name: Install native Linux dependencies
run: |
sudo apt-get update
sudo apt-get install -y \
libwayland-dev libwayland-bin wayland-protocols pkg-config unzip \
libfontconfig1-dev libfreetype-dev libharfbuzz-dev fonts-noto-color-emoji
- name: Set up MoonBit
uses: ./.github/actions/setup-moonbit
- name: Install dependencies
run: |
moon version --all
sh scripts/ci-moon-update.sh
- name: Run Linux platform profile
run: sh scripts/check.sh --profile platform
- name: Build Linux native examples
if: ${{ github.event_name == 'workflow_dispatch' && inputs.run_slow_native_examples }}
run: |
moon build examples/showcase/linux_skia --target native
macos-packaging:
name: macOS packaging smoke
runs-on: macos-14
steps:
- name: Checkout
uses: actions/checkout@v5
- name: Set up MoonBit
uses: ./.github/actions/setup-moonbit
- name: Install dependencies
run: |
moon version --all
sh scripts/ci-moon-update.sh
- name: Package Showcase app bundle
run: |
sh scripts/package-macos-app.sh \
--package examples/showcase/macos_skia \
--name "MoUI Showcase" \
--bundle-id dev.wzzc.moui.showcase \
--version 0.1.0 \
--build-version "$GITHUB_RUN_NUMBER"
- name: Build macOS native examples
if: ${{ github.event_name == 'workflow_dispatch' && inputs.run_slow_native_examples }}
run: |
moon build examples/showcase/macos_skia --target native
moon build examples/markdown_editor/macos_skia --target native
- name: Upload macOS package artifact
uses: actions/upload-artifact@v4
with:
name: moui-showcase-macos-app
path: dist/macos/MoUI Showcase.app
if-no-files-found: error
benchmark-scaffold:
name: Benchmark scaffold
runs-on: macos-14
steps:
- name: Checkout
uses: actions/checkout@v5
- name: Set up MoonBit
uses: ./.github/actions/setup-moonbit
- name: Install dependencies
run: |
moon version --all
sh scripts/ci-moon-update.sh
- name: Build benchmark targets
run: node scripts/conformance-capture-scaffold.mjs --mode benchmark
- name: Run performance budgets
run: node scripts/run-performance-budgets.mjs
- name: Upload performance report
if: ${{ always() }}
uses: actions/upload-artifact@v4
with:
name: moui-performance-budgets
path: artifacts/performance/result.json
if-no-files-found: error
windows-native:
name: Windows MSVC native smoke
runs-on: windows-2022
steps:
- name: Checkout
uses: actions/checkout@v5
- name: Set up vcpkg zlib
shell: pwsh
run: powershell -ExecutionPolicy Bypass -File .\scripts\windows\setup_msvc_deps.ps1 -InstallZlib -InstallWebView2
- name: Set up MoonBit
uses: ./.github/actions/setup-moonbit
- name: Install dependencies
shell: bash
run: |
moon version --all
sh scripts/ci-moon-update.sh
- name: Verify Windows check wrapper plan
shell: pwsh
run: powershell -ExecutionPolicy Bypass -File .\scripts\windows\check.ps1 -Profile Pr -DryRun -Json -SkipSubmoduleInit
- name: Run Windows backend tests
shell: pwsh
run: |
. .\scripts\windows\msvc_env.ps1
moon test moui/backend/windows --target native
Enable-MsvcC11Atomics
moon check examples/showcase/windows_skia --target native
- name: Build Showcase Windows Skia entrypoint with MSVC
shell: pwsh
run: powershell -ExecutionPolicy Bypass -File .\scripts\windows\build_windows_msvc.ps1 -Package examples/showcase/windows_skia -BuildOnly
- name: Package Showcase Windows Skia folder with MSVC
shell: pwsh
run: |
powershell -ExecutionPolicy Bypass -File .\scripts\windows\package_windows_app_msvc.ps1 `
-Package examples/showcase/windows_skia `
-AppName MoUIShowcase `
-Version 0.1.0 `
-BuildNumber $env:GITHUB_RUN_NUMBER
- name: Upload Windows package artifact
uses: actions/upload-artifact@v4
with:
name: moui-showcase-windows-msvc-portable
path: dist/windows-msvc/MoUIShowcase
if-no-files-found: error