From 4997a239ec734dc3d59336a3769fc23eefbe97c9 Mon Sep 17 00:00:00 2001 From: Mega Mind <146339422+M3gA-Mind@users.noreply.github.com> Date: Thu, 30 Apr 2026 16:41:46 +0530 Subject: [PATCH] Build staging desktop artifacts in debug profile (#1044) --- .github/workflows/release.yml | 50 ++++++++++++++++--------- app/src-tauri/src/core_process_tests.rs | 16 +++++++- 2 files changed, 48 insertions(+), 18 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 342f48721..737d56156 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -288,8 +288,8 @@ jobs: run: | set +e for BIN in \ - app/src-tauri/target/${{ matrix.settings.target }}/release/OpenHuman \ - target/${{ matrix.settings.target }}/release/OpenHuman; do + app/src-tauri/target/${{ matrix.settings.target }}/${{ inputs.build_target == 'staging' && 'debug' || 'release' }}/OpenHuman \ + target/${{ matrix.settings.target }}/${{ inputs.build_target == 'staging' && 'debug' || 'release' }}/OpenHuman; do if [ -x "$BIN" ]; then echo "ldd $BIN" ldd "$BIN" | grep 'not found' || echo " all resolved" @@ -443,24 +443,35 @@ jobs: fi SIDE_CAR_BASE="$(node -e "const fs=require('fs');const c=JSON.parse(fs.readFileSync('app/src-tauri/tauri.conf.json','utf8'));const b=(c.bundle&&Array.isArray(c.bundle.externalBin)&&c.bundle.externalBin[0])||'binaries/openhuman-core';process.stdout.write(String(b).split('/').pop());")" CORE_BIN_NAME="${SIDE_CAR_BASE}" + BUILD_PROFILE="${BUILD_PROFILE:-release}" echo "core_dir=$CORE_DIR" >> "$GITHUB_OUTPUT" echo "core_manifest=$CORE_DIR/Cargo.toml" >> "$GITHUB_OUTPUT" - # Cargo workspace: release artifacts are under repo root target/, not /target/ - echo "core_target_dir=target/$MATRIX_TARGET/release" >> "$GITHUB_OUTPUT" + # Cargo workspace artifacts are under repo root target/, not /target/ + echo "core_target_dir=target/$MATRIX_TARGET/$BUILD_PROFILE" >> "$GITHUB_OUTPUT" + echo "build_profile=$BUILD_PROFILE" >> "$GITHUB_OUTPUT" echo "core_bin_name=$CORE_BIN_NAME" >> "$GITHUB_OUTPUT" echo "sidecar_base=$SIDE_CAR_BASE" >> "$GITHUB_OUTPUT" env: MATRIX_TARGET: ${{ matrix.settings.target }} + BUILD_PROFILE: ${{ inputs.build_target == 'staging' && 'debug' || 'release' }} - name: Build sidecar core binary shell: bash run: | - cargo build \ - --manifest-path "$CORE_MANIFEST" \ - --release \ - --target "$MATRIX_TARGET" \ - --bin "$CORE_BIN_NAME" + if [ "$BUILD_PROFILE" = "release" ]; then + cargo build \ + --manifest-path "$CORE_MANIFEST" \ + --release \ + --target "$MATRIX_TARGET" \ + --bin "$CORE_BIN_NAME" + else + cargo build \ + --manifest-path "$CORE_MANIFEST" \ + --target "$MATRIX_TARGET" \ + --bin "$CORE_BIN_NAME" + fi env: MATRIX_TARGET: ${{ matrix.settings.target }} + BUILD_PROFILE: ${{ steps.core-paths.outputs.build_profile }} CORE_MANIFEST: ${{ steps.core-paths.outputs.core_manifest }} CORE_BIN_NAME: ${{ steps.core-paths.outputs.core_bin_name }} OPENHUMAN_APP_ENV: ${{ inputs.build_target == 'staging' && 'staging' || 'production' }} @@ -552,7 +563,11 @@ jobs: # Inline NODE_OPTIONS so it reaches the vite child spawned by # beforeBuildCommand. Step-level env was observed not to propagate # on macos-arm64 runners, causing OOM at node's ~2GB auto default. - NODE_OPTIONS="--max-old-space-size=8192" cargo tauri build -c "$TAURI_CONFIG_OVERRIDE" $MATRIX_ARGS + if [ "${{ inputs.build_target }}" = "staging" ]; then + NODE_OPTIONS="--max-old-space-size=8192" cargo tauri build --debug -c "$TAURI_CONFIG_OVERRIDE" $MATRIX_ARGS + else + NODE_OPTIONS="--max-old-space-size=8192" cargo tauri build -c "$TAURI_CONFIG_OVERRIDE" $MATRIX_ARGS + fi # Upload Rust debug info to Sentry so backend + Tauri-shell stack traces # symbolicate in production. The frontend source maps are handled by @@ -629,12 +644,13 @@ jobs: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} TAG: ${{ needs.prepare-build.outputs.tag }} MATRIX_TARGET: ${{ matrix.settings.target }} + BUILD_PROFILE: ${{ inputs.build_target == 'staging' && 'debug' || 'release' }} run: | set -euo pipefail shopt -s nullglob BUNDLE_ROOTS=( - "app/src-tauri/target/${MATRIX_TARGET}/release/bundle" - "target/${MATRIX_TARGET}/release/bundle" + "app/src-tauri/target/${MATRIX_TARGET}/${BUILD_PROFILE}/bundle" + "target/${MATRIX_TARGET}/${BUILD_PROFILE}/bundle" ) UPLOAD=() for root in "${BUNDLE_ROOTS[@]}"; do @@ -667,8 +683,8 @@ jobs: # depending on workspace config — search both APP_PATH="" for candidate in \ - "app/src-tauri/target/${{ matrix.settings.target }}/release/bundle/macos/OpenHuman.app" \ - "target/${{ matrix.settings.target }}/release/bundle/macos/OpenHuman.app"; do + "app/src-tauri/target/${{ matrix.settings.target }}/${{ inputs.build_target == 'staging' && 'debug' || 'release' }}/bundle/macos/OpenHuman.app" \ + "target/${{ matrix.settings.target }}/${{ inputs.build_target == 'staging' && 'debug' || 'release' }}/bundle/macos/OpenHuman.app"; do if [ -d "$candidate" ]; then APP_PATH="$candidate" break @@ -677,7 +693,7 @@ jobs: # Fallback: search for it if [ -z "$APP_PATH" ]; then - APP_PATH="$(find . -path '*/release/bundle/macos/OpenHuman.app' -type d 2>/dev/null | head -1)" + APP_PATH="$(find . -path "*/${{ inputs.build_target == 'staging' && 'debug' || 'release' }}/bundle/macos/OpenHuman.app" -type d 2>/dev/null | head -1)" fi if [ -z "$APP_PATH" ]; then echo "ERROR: Could not find OpenHuman.app bundle anywhere" @@ -810,8 +826,8 @@ jobs: desktop-bundles-${{ matrix.settings.platform }}-${{ matrix.settings.artifact_suffix }} path: | - app/src-tauri/target/${{ matrix.settings.target }}/release/bundle/** - target/${{ matrix.settings.target }}/release/bundle/** + app/src-tauri/target/${{ matrix.settings.target }}/${{ inputs.build_target == 'staging' && 'debug' || 'release' }}/bundle/** + target/${{ matrix.settings.target }}/${{ inputs.build_target == 'staging' && 'debug' || 'release' }}/bundle/** - name: Upload standalone CLI artifacts uses: actions/upload-artifact@v4 with: diff --git a/app/src-tauri/src/core_process_tests.rs b/app/src-tauri/src/core_process_tests.rs index b1503ebd2..18b54a1aa 100644 --- a/app/src-tauri/src/core_process_tests.rs +++ b/app/src-tauri/src/core_process_tests.rs @@ -6,6 +6,15 @@ use super::{ }; use std::io::Write; use std::path::PathBuf; +use std::sync::{Mutex, MutexGuard, OnceLock}; + +fn env_lock() -> MutexGuard<'static, ()> { + static ENV_LOCK: OnceLock> = OnceLock::new(); + ENV_LOCK + .get_or_init(|| Mutex::new(())) + .lock() + .expect("env lock poisoned") +} struct EnvGuard { key: &'static str, @@ -38,6 +47,7 @@ impl Drop for EnvGuard { #[test] fn default_core_run_mode_env_parsing() { + let _env_lock = env_lock(); let _unset = EnvGuard::unset("OPENHUMAN_CORE_RUN_MODE"); assert_eq!(default_core_run_mode(false), CoreRunMode::ChildProcess); @@ -50,6 +60,7 @@ fn default_core_run_mode_env_parsing() { #[test] fn default_core_port_env_and_fallback() { + let _env_lock = env_lock(); let _unset = EnvGuard::unset("OPENHUMAN_CORE_PORT"); assert_eq!(default_core_port(), 7788); @@ -109,6 +120,7 @@ fn same_executable_path_handles_symlinks() { // Tests for default_core_bin() - PR: make linux CEF deb package runnable #[test] fn default_core_bin_env_override_takes_precedence() { + let _env_lock = env_lock(); let temp_dir = std::env::temp_dir().join("openhuman-core-test-"); let _ = std::fs::remove_dir_all(&temp_dir); std::fs::create_dir_all(&temp_dir).expect("create temp dir"); @@ -138,11 +150,11 @@ fn default_core_bin_env_override_takes_precedence() { // Cleanup let _ = std::fs::remove_dir_all(&temp_dir); - std::env::remove_var("OPENHUMAN_CORE_BIN"); } #[test] fn default_core_bin_env_override_nonexistent_warns() { + let _env_lock = env_lock(); let _guard = EnvGuard::set("OPENHUMAN_CORE_BIN", "/nonexistent/path/openhuman-core"); let _result = default_core_bin(); @@ -154,6 +166,7 @@ fn default_core_bin_env_override_nonexistent_warns() { #[test] fn default_core_bin_returns_none_when_no_binary_found() { + let _env_lock = env_lock(); // Clear env override let _guard = EnvGuard::unset("OPENHUMAN_CORE_BIN"); @@ -166,6 +179,7 @@ fn default_core_bin_returns_none_when_no_binary_found() { #[test] fn default_core_bin_prefers_staged_sidecar_in_dev() { + let _env_lock = env_lock(); // This test verifies the dev build behavior where we look for // staged binaries in src-tauri/binaries // In test mode (debug_assertions), this path is checked