mirror of
https://github.com/tinyhumansai/openhuman.git
synced 2026-07-27 21:08:00 +00:00
* ci(release): bake Sentry DSN into shipped tauri bundle
Released builds weren't reporting anything to Sentry. Root cause: the
tauri.conf.json `beforeBuildCommand` re-runs `vite build` inside
`cargo tauri build`. The prior `yarn build` step set `VITE_SENTRY_DSN`
for its own run, but the tauri step did not — so the rebuild produced
a DSN-less `dist/` that overwrote the good one, and the shipped web UI
initialized Sentry with an empty DSN (`initSentry` returns early when
`!SENTRY_DSN`).
Fix:
- `release.yml` / `build-desktop` — declare `VITE_SENTRY_DSN` and
`VITE_DEBUG` on the tauri-build step so the `beforeBuildCommand`
rebuild bakes them into the final bundle.
- `release-packages.yml` / `build-cli-linux-arm64` — guard against a
missing `vars.OPENHUMAN_SENTRY_DSN` so the Linux arm64 CLI tarball
cannot ship without error reporting baked in via `option_env!`.
The core sidecar's `option_env!("OPENHUMAN_SENTRY_DSN")` already gets
the value from the dedicated "Build sidecar core binary" step; the
tauri shell doesn't rebuild it (separate crate, not a workspace dep),
so the baked DSN survives into the bundled installer.
* feat(observability): Sentry release tracking + source maps (#405)
Tags every Sentry event with a canonical release identifier shared by
the frontend and Rust core, uploads source maps so stack traces are
symbolicated in the dashboard, and adds a CLI probe for repeatable
verification of any future release.
Release identifier
openhuman@<semver>[+<short_git_sha>]
- Frontend (`app/src/utils/config.ts::SENTRY_RELEASE`) builds the tag
from `VITE_BUILD_SHA`.
- Core sidecar (`src/main.rs::build_release_tag`) builds the same tag
from `option_env!("OPENHUMAN_BUILD_SHA")`, so events from both
surfaces group under one release. Cargo's fingerprint already tracks
`option_env!` changes.
Environment separation
- Frontend: new `APP_ENVIRONMENT` export (`development` | `staging` |
`production`) derived from `VITE_OPENHUMAN_APP_ENV`, passed to
`Sentry.init`.
- Core: `resolve_environment` honors `OPENHUMAN_APP_ENV` at runtime,
falling back to `debug_assertions` detection.
Source-map upload
- `@sentry/vite-plugin` added as an app devDependency.
- `vite.config.ts` emits source maps unconditionally and registers the
plugin only when `SENTRY_AUTH_TOKEN` is present, so local dev skips
silently. The plugin uploads `dist/**/*.js{,.map}` under the
canonical release name and then deletes the on-disk `.map` files so
they never ship to end users.
CI wiring (`release.yml` + `release-packages.yml`)
- `Build frontend` and `Build and package Tauri app` both receive
`VITE_BUILD_SHA`, `SENTRY_RELEASE`, `SENTRY_AUTH_TOKEN`, `SENTRY_ORG`,
`SENTRY_PROJECT_FRONTEND`. The tauri step needs the same env because
its `beforeBuildCommand` re-runs `vite build`.
- `Build sidecar core binary` receives `OPENHUMAN_BUILD_SHA` so
`option_env!` bakes the short SHA into the release tag.
- `build-cli-linux-arm64` mirrors `OPENHUMAN_BUILD_SHA` and
`OPENHUMAN_APP_ENV` for the arm64 CLI tarball.
Verification support
- New `openhuman sentry-test` CLI subcommand captures an `Error`-level
event against the currently-initialized client, flushes, and prints
the event UUID. Optional `--panic` flag exercises the panic
integration. Requires a DSN resolvable at runtime or baked in at
compile time; exits non-zero otherwise so misconfiguration is loud.
- `src/main.rs` now loads `.env` before `sentry::init`, so a DSN
defined only in the repo-local dotenv file (common dev case) is
honored by the startup-time Sentry client.
Docs
- `docs/sentry.md` covers the release identifier, environment table,
source-map pipeline, required CI variables, and a verification
runbook with troubleshooting tips.
- `.env.example` + `app/.env.example` document the new build-time vars.
125 lines
6.4 KiB
JSON
125 lines
6.4 KiB
JSON
{
|
|
"name": "openhuman-app",
|
|
"version": "0.52.28",
|
|
"type": "module",
|
|
"scripts": {
|
|
"dev": "vite",
|
|
"dev:web": "vite",
|
|
"dev:app": "yarn tauri:ensure && export CEF_PATH=\"$HOME/Library/Caches/tauri-cef\" && yarn core:stage && bash ../scripts/setup-chromium-safe-storage.sh && source ../scripts/load-dotenv.sh && APPLE_SIGNING_IDENTITY='OpenHuman Dev Signer' cargo tauri dev",
|
|
"dev:cef": "yarn dev:app",
|
|
"dev:wry": "yarn tauri:ensure && export CEF_PATH=\"$HOME/Library/Caches/tauri-cef\" && yarn core:stage && source ../scripts/load-dotenv.sh && cargo tauri dev --no-default-features --features wry",
|
|
"core:stage": "node ../scripts/stage-core-sidecar.mjs",
|
|
"tauri:ensure": "bash ../scripts/ensure-tauri-cli.sh",
|
|
"build": "tsc && vite build",
|
|
"build:app": "tsc && vite build",
|
|
"compile": "tsc --noEmit",
|
|
"preview": "vite preview",
|
|
"tauri": "tauri",
|
|
"tauri:build:ui": "yarn tauri:ensure && export CEF_PATH=\"$HOME/Library/Caches/tauri-cef\" && cargo tauri build -- --bin OpenHuman",
|
|
"macos:build:intel": "yarn tauri:ensure && export CEF_PATH=\"$HOME/Library/Caches/tauri-cef\" && source ../scripts/load-dotenv.sh && cargo tauri build --bundles app dmg --target x86_64-apple-darwin -- --bin OpenHuman",
|
|
"macos:build:intel:debug": "yarn tauri:ensure && export CEF_PATH=\"$HOME/Library/Caches/tauri-cef\" && source ../scripts/load-dotenv.sh && cargo tauri build --debug --bundles app dmg --target x86_64-apple-darwin -- --bin OpenHuman",
|
|
"macos:build:debug": "yarn tauri:ensure && export CEF_PATH=\"$HOME/Library/Caches/tauri-cef\" && source ../scripts/load-dotenv.sh && cargo tauri build --debug --bundles app dmg -- --bin OpenHuman",
|
|
"macos:build:release": "yarn tauri:ensure && export CEF_PATH=\"$HOME/Library/Caches/tauri-cef\" && source ../scripts/load-dotenv.sh && cargo tauri build --bundles app dmg -- --bin OpenHuman",
|
|
"macos:build:release:signed": "yarn tauri:ensure && export CEF_PATH=\"$HOME/Library/Caches/tauri-cef\" && source ../scripts/load-env.sh && cargo tauri build --bundles app dmg -- --bin OpenHuman",
|
|
"macos:build:sign:release": "yarn macos:build:release:signed",
|
|
"macos:run": "open '../target/debug/bundle/macos/OpenHuman.app'",
|
|
"macos:dev": "yarn macos:build:debug && open '../target/debug/bundle/macos/OpenHuman.app'",
|
|
"test": "vitest run --config test/vitest.config.ts",
|
|
"test:unit": "vitest run --config test/vitest.config.ts",
|
|
"test:unit:watch": "vitest --config test/vitest.config.ts",
|
|
"test:watch": "vitest --config test/vitest.config.ts",
|
|
"test:coverage": "vitest run --config test/vitest.config.ts --coverage",
|
|
"test:rust": "bash ../scripts/test-rust-with-mock.sh",
|
|
"test:e2e:build": "bash ./scripts/e2e-build.sh",
|
|
"test:e2e:login": "bash ./scripts/e2e-login.sh",
|
|
"test:e2e:auth": "bash ./scripts/e2e-auth.sh",
|
|
"test:e2e:service-connectivity": "OPENHUMAN_SERVICE_MOCK=1 bash ./scripts/e2e-run-spec.sh test/e2e/specs/service-connectivity-flow.spec.ts service-connectivity",
|
|
"test:e2e:skills-registry": "bash ./scripts/e2e-run-spec.sh test/e2e/specs/skills-registry.spec.ts skills-registry",
|
|
"test:e2e:skill-execution": "bash ./scripts/e2e-run-spec.sh test/e2e/specs/skill-execution-flow.spec.ts skill-execution",
|
|
"test:e2e": "yarn test:e2e:build && yarn test:e2e:login && yarn test:e2e:auth",
|
|
"test:e2e:all:flows": "bash ./scripts/e2e-run-all-flows.sh",
|
|
"test:e2e:all": "yarn test:e2e:build && yarn test:e2e:all:flows",
|
|
"test:all": "yarn test:coverage && yarn test:rust && yarn test:e2e",
|
|
"rust:check": "cargo check --manifest-path src-tauri/Cargo.toml",
|
|
"rust:format": "cargo fmt --manifest-path ../Cargo.toml --all && cargo fmt --manifest-path src-tauri/Cargo.toml --all",
|
|
"rust:format:check": "cargo fmt --manifest-path ../Cargo.toml --all --check && cargo fmt --manifest-path src-tauri/Cargo.toml --all --check",
|
|
"rust:clippy": "cargo clippy -p openhuman -- -D warnings",
|
|
"format": "prettier --write . && yarn rust:format",
|
|
"format:check": "prettier --check . && yarn rust:format:check",
|
|
"lint": "eslint . --ext .ts,.tsx",
|
|
"lint:fix": "eslint . --ext .ts,.tsx --fix",
|
|
"knip": "knip --config knip.json",
|
|
"knip:production": "knip --config knip.json --production"
|
|
},
|
|
"dependencies": {
|
|
"@noble/hashes": "^2.0.1",
|
|
"@noble/secp256k1": "^3.0.0",
|
|
"@reduxjs/toolkit": "^2.11.2",
|
|
"@scure/bip32": "^2.0.1",
|
|
"@scure/bip39": "^2.0.1",
|
|
"@sentry/react": "^10.38.0",
|
|
"@tauri-apps/api": "^2.10.0",
|
|
"@tauri-apps/plugin-deep-link": "^2",
|
|
"@tauri-apps/plugin-opener": "^2",
|
|
"@tauri-apps/plugin-os": "^2.3.2",
|
|
"@types/three": "^0.183.1",
|
|
"buffer": "^6.0.3",
|
|
"debug": "^4.4.3",
|
|
"lottie-react": "^2.4.1",
|
|
"os-browserify": "^0.3.0",
|
|
"process": "^0.11.10",
|
|
"react": "^19.1.0",
|
|
"react-dom": "^19.1.0",
|
|
"react-icons": "^5.6.0",
|
|
"react-markdown": "^10.1.0",
|
|
"react-redux": "^9.2.0",
|
|
"react-router-dom": "^7.13.0",
|
|
"redux-logger": "^3.0.6",
|
|
"redux-persist": "^6.0.0",
|
|
"socket.io-client": "^4.8.3",
|
|
"three": "^0.183.2",
|
|
"util": "^0.12.5"
|
|
},
|
|
"devDependencies": {
|
|
"@eslint/js": "^9.39.2",
|
|
"@tailwindcss/forms": "^0.5.11",
|
|
"@tailwindcss/typography": "^0.5.19",
|
|
"@tauri-apps/cli": "2.10.0",
|
|
"@testing-library/dom": "^10.4.1",
|
|
"@testing-library/jest-dom": "^6.9.1",
|
|
"@testing-library/react": "^16.3.2",
|
|
"@trivago/prettier-plugin-sort-imports": "^6.0.2",
|
|
"@types/debug": "^4.1.12",
|
|
"@types/node": "^25.0.10",
|
|
"@types/react": "^19.1.8",
|
|
"@types/react-dom": "^19.1.6",
|
|
"@types/redux-logger": "^3.0.13",
|
|
"@typescript-eslint/eslint-plugin": "^8.54.0",
|
|
"@typescript-eslint/parser": "^8.54.0",
|
|
"@sentry/vite-plugin": "^2.22.6",
|
|
"@vitejs/plugin-react": "^4.6.0",
|
|
"@vitest/coverage-v8": "^4.0.18",
|
|
"@wdio/appium-service": "^9.24.0",
|
|
"@wdio/cli": "^9.24.0",
|
|
"@wdio/local-runner": "^9.24.0",
|
|
"@wdio/mocha-framework": "^9.24.0",
|
|
"@wdio/spec-reporter": "^9.24.0",
|
|
"autoprefixer": "^10.4.23",
|
|
"eslint": "^9.39.2",
|
|
"eslint-config-prettier": "^10.1.8",
|
|
"eslint-plugin-import": "^2.32.0",
|
|
"eslint-plugin-react": "^7.37.5",
|
|
"eslint-plugin-react-hooks": "^7.0.1",
|
|
"husky": "^9.1.7",
|
|
"jsdom": "^28.0.0",
|
|
"knip": "^6.3.1",
|
|
"postcss": "^8.5.6",
|
|
"prettier": "^3.8.1",
|
|
"tailwindcss": "^3.4.19",
|
|
"typescript": "~5.8.3",
|
|
"vite": "^7.0.4",
|
|
"vite-plugin-node-polyfills": "^0.25.0",
|
|
"vitest": "^4.0.18"
|
|
}
|
|
}
|