---
name: Build
on:
  push:
    branches: [main]
  pull_request:
permissions:
  contents: read
  pull-requests: read
  # Required for Sentry to associate commits with releases
  actions: read

concurrency:
  group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.head_ref || github.ref }}
  cancel-in-progress: true
jobs:
  build:
    name: Build Tauri App
    runs-on: ubuntu-22.04
    container:
      image: ghcr.io/tinyhumansai/openhuman_ci:rust-1.93.0
    steps:
      - name: Checkout code
        uses: actions/checkout@v5
        with:
          fetch-depth: 1
          submodules: recursive
      - name: Cache Rust build artifacts
        uses: Swatinem/rust-cache@v2
        with:
          workspaces: |
            . -> target
            app/src-tauri -> target
          cache-on-failure: true

      # CEF (Chromium Embedded Framework) runtime is downloaded on-demand by
      # cef-dll-sys + the vendored tauri-cli. Cache it across builds — the
      # payload is ~400MB per platform and fetching every run is painful.
      - name: Cache CEF binary distribution
        uses: actions/cache@v5
        with:
          path: ~/.cache/tauri-cef
          key: cef-ubuntu-22.04-${{ hashFiles('app/src-tauri/Cargo.toml') }}
          restore-keys: |
            cef-ubuntu-22.04-

      # Note: the vendored CEF-aware tauri-cli, Node 24, and pnpm are all
      # pre-installed in the ghcr.io/tinyhumansai/openhuman_ci image (see
      # .github/Dockerfile), so `cargo tauri build` below resolves to the
      # fork without any per-run compile step.
      - name: Cache pnpm store
        uses: actions/cache@v5
        with:
          path: ~/.local/share/pnpm/store
          key: pnpm-store-${{ runner.os }}-${{ hashFiles('pnpm-lock.yaml') }}
          restore-keys: |
            pnpm-store-${{ runner.os }}-
      - name: Install dependencies
        run: pnpm install --frozen-lockfile
      # Core is linked into the Tauri binary as a path dep — no separate
      # sidecar build / stage step needed.
      - name: Build Tauri app (CEF default)
        working-directory: app
        run: |
          # Skip tsc in beforeBuildCommand — typechecking runs in the dedicated
          # `typecheck` workflow, so doing it again here is duplicated CI time.
          TAURI_CONFIG_OVERRIDE='{"build":{"beforeBuildCommand":"npx vite build"},"plugins":{"updater":{"active":false}}}'
          cargo tauri build -c "$TAURI_CONFIG_OVERRIDE" --bundles deb
        env:
          NODE_ENV: production
          # CI builds should point at staging, not production.
          # Without these, APP_ENV is undefined in config.ts and
          # DEFAULT_BACKEND_URL falls through to api.tinyhumans.ai.
          VITE_OPENHUMAN_APP_ENV: staging
          VITE_BACKEND_URL: https://staging-api.tinyhumans.ai
          CARGO_PROFILE_RELEASE_OPT_LEVEL: "1"
          CARGO_PROFILE_RELEASE_CODEGEN_UNITS: "16"
          CARGO_PROFILE_RELEASE_LTO: "false"
          CARGO_PROFILE_RELEASE_STRIP: "true"
          CARGO_PROFILE_RELEASE_DEBUG: "false"
