Files
openhuman/scripts/dev-staging.sh
T

101 lines
3.5 KiB
Bash
Executable File

#!/usr/bin/env bash
# Launch a local staging build of the Tauri app.
#
# Loads signing credentials from scripts/ci-secrets.json, imports the
# Developer ID certificate into a temporary keychain (like CI), and sets
# OPENHUMAN_APP_ENV=staging so the encrypted-file keyring backend is used.
#
# Usage:
# bash scripts/dev-staging.sh
# pnpm dev:staging
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
ROOT_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
SECRETS_FILE="$ROOT_DIR/scripts/ci-secrets.json"
if [[ ! -f "$SECRETS_FILE" ]]; then
echo "[dev-staging] $SECRETS_FILE not found — cannot load signing credentials" >&2
exit 1
fi
# Load secrets + vars from the CI secrets file
source "$SCRIPT_DIR/load-env-json.sh" "$SECRETS_FILE" '.secrets + .vars'
# Ensure staging env
export OPENHUMAN_APP_ENV=staging
export VITE_OPENHUMAN_APP_ENV=staging
# Point to staging API (ci-secrets.json has localhost for CI)
export BACKEND_URL=https://staging-api.tinyhumans.ai
export VITE_BACKEND_URL=https://staging-api.tinyhumans.ai
# Load the regular .env (secrets take precedence since they're already set)
source "$SCRIPT_DIR/load-dotenv.sh"
export CEF_PATH="$HOME/Library/Caches/tauri-cef"
# ── Temporary keychain for codesign (CI-style) ────────────────────────────────
KEYCHAIN_NAME="dev-staging.keychain-db"
KEYCHAIN_PATH="$HOME/Library/Keychains/$KEYCHAIN_NAME"
KEYCHAIN_PASSWORD="dev-staging-$(date +%s)"
cleanup_keychain() {
security delete-keychain "$KEYCHAIN_PATH" 2>/dev/null || true
}
trap cleanup_keychain EXIT
# Remove stale keychain from a previous run
cleanup_keychain
echo "[dev-staging] creating temporary keychain for codesign..."
security create-keychain -p "$KEYCHAIN_PASSWORD" "$KEYCHAIN_PATH"
security set-keychain-settings -lut 21600 "$KEYCHAIN_PATH"
security unlock-keychain -p "$KEYCHAIN_PASSWORD" "$KEYCHAIN_PATH"
# Import the Developer ID certificate
CERT_TMP=$(mktemp /tmp/dev-staging-cert.XXXXXX.p12)
echo "$APPLE_CERTIFICATE_BASE64" | base64 --decode > "$CERT_TMP"
security import "$CERT_TMP" \
-k "$KEYCHAIN_PATH" \
-P "$APPLE_CERTIFICATE_PASSWORD" \
-T /usr/bin/codesign \
-T /usr/bin/security
rm -f "$CERT_TMP"
# Allow codesign to access the key without prompts
security set-key-partition-list -S "apple-tool:,apple:,codesign:" \
-s -k "$KEYCHAIN_PASSWORD" "$KEYCHAIN_PATH" >/dev/null 2>&1
# Prepend temporary keychain to the search list so codesign finds it
EXISTING_KEYCHAINS=$(security list-keychains -d user | tr -d '"' | tr '\n' ' ')
security list-keychains -d user -s "$KEYCHAIN_PATH" $EXISTING_KEYCHAINS
echo "[dev-staging] certificate imported into temporary keychain"
# ── Chromium safe storage & tauri-cli ─────────────────────────────────────────
bash "$SCRIPT_DIR/setup-chromium-safe-storage.sh"
cd "$ROOT_DIR/app"
pnpm tauri:ensure
echo "[dev-staging] APPLE_SIGNING_IDENTITY=$APPLE_SIGNING_IDENTITY"
echo "[dev-staging] OPENHUMAN_APP_ENV=$OPENHUMAN_APP_ENV"
echo "[dev-staging] building and running (no file watcher)..."
# Build the frontend first
pnpm run dev &
VITE_PID=$!
# Wait for vite to be ready
until curl -s http://localhost:1420 >/dev/null 2>&1; do sleep 0.5; done
# Build the .app bundle only (skip DMG) and run directly
cargo tauri build --debug --bundles app
# Kill vite
kill $VITE_PID 2>/dev/null
echo "[dev-staging] launching app bundle..."
exec "$ROOT_DIR/app/src-tauri/target/debug/bundle/macos/OpenHuman.app/Contents/MacOS/OpenHuman"