mirror of
https://github.com/openclaw/openclaw.git
synced 2026-03-30 11:21:07 +00:00
fix: support anthropic parallels smoke lanes
This commit is contained in:
@@ -5,7 +5,11 @@ VM_NAME="Ubuntu 24.04.3 ARM64"
|
||||
VM_NAME_EXPLICIT=0
|
||||
SNAPSHOT_HINT="fresh"
|
||||
MODE="both"
|
||||
OPENAI_API_KEY_ENV="OPENAI_API_KEY"
|
||||
PROVIDER="openai"
|
||||
API_KEY_ENV=""
|
||||
AUTH_CHOICE=""
|
||||
AUTH_KEY_FLAG=""
|
||||
MODEL_ID=""
|
||||
INSTALL_URL="https://openclaw.ai/install.sh"
|
||||
HOST_PORT="18427"
|
||||
HOST_PORT_EXPLICIT=0
|
||||
@@ -82,7 +86,11 @@ Options:
|
||||
Falls back to the closest Ubuntu VM when omitted and unavailable.
|
||||
--snapshot-hint <name> Snapshot name substring/fuzzy match. Default: "fresh"
|
||||
--mode <fresh|upgrade|both>
|
||||
--openai-api-key-env <var> Host env var name for OpenAI API key. Default: OPENAI_API_KEY
|
||||
--provider <openai|anthropic>
|
||||
Provider auth/model lane. Default: openai
|
||||
--api-key-env <var> Host env var name for provider API key.
|
||||
Default: OPENAI_API_KEY for openai, ANTHROPIC_API_KEY for anthropic
|
||||
--openai-api-key-env <var> Alias for --api-key-env (backward compatible)
|
||||
--install-url <url> Installer URL for latest release. Default: https://openclaw.ai/install.sh
|
||||
--host-port <port> Host HTTP port for current-main tgz. Default: 18427
|
||||
--host-ip <ip> Override Parallels host IP.
|
||||
@@ -115,8 +123,12 @@ while [[ $# -gt 0 ]]; do
|
||||
MODE="$2"
|
||||
shift 2
|
||||
;;
|
||||
--openai-api-key-env)
|
||||
OPENAI_API_KEY_ENV="$2"
|
||||
--provider)
|
||||
PROVIDER="$2"
|
||||
shift 2
|
||||
;;
|
||||
--api-key-env|--openai-api-key-env)
|
||||
API_KEY_ENV="$2"
|
||||
shift 2
|
||||
;;
|
||||
--install-url)
|
||||
@@ -169,8 +181,26 @@ case "$MODE" in
|
||||
;;
|
||||
esac
|
||||
|
||||
OPENAI_API_KEY_VALUE="${!OPENAI_API_KEY_ENV:-}"
|
||||
[[ -n "$OPENAI_API_KEY_VALUE" ]] || die "$OPENAI_API_KEY_ENV is required"
|
||||
case "$PROVIDER" in
|
||||
openai)
|
||||
AUTH_CHOICE="openai-api-key"
|
||||
AUTH_KEY_FLAG="openai-api-key"
|
||||
MODEL_ID="openai/gpt-5.4"
|
||||
[[ -n "$API_KEY_ENV" ]] || API_KEY_ENV="OPENAI_API_KEY"
|
||||
;;
|
||||
anthropic)
|
||||
AUTH_CHOICE="apiKey"
|
||||
AUTH_KEY_FLAG="anthropic-api-key"
|
||||
MODEL_ID="anthropic/claude-sonnet-4-6"
|
||||
[[ -n "$API_KEY_ENV" ]] || API_KEY_ENV="ANTHROPIC_API_KEY"
|
||||
;;
|
||||
*)
|
||||
die "invalid --provider: $PROVIDER"
|
||||
;;
|
||||
esac
|
||||
|
||||
API_KEY_VALUE="${!API_KEY_ENV:-}"
|
||||
[[ -n "$API_KEY_VALUE" ]] || die "$API_KEY_ENV is required"
|
||||
|
||||
resolve_vm_name() {
|
||||
local json requested explicit
|
||||
@@ -526,10 +556,10 @@ verify_version_contains() {
|
||||
}
|
||||
|
||||
run_ref_onboard() {
|
||||
guest_exec /usr/bin/env "OPENAI_API_KEY=$OPENAI_API_KEY_VALUE" openclaw onboard \
|
||||
guest_exec /usr/bin/env "$API_KEY_ENV=$API_KEY_VALUE" openclaw onboard \
|
||||
--non-interactive \
|
||||
--mode local \
|
||||
--auth-choice openai-api-key \
|
||||
--auth-choice "$AUTH_CHOICE" \
|
||||
--secret-input-mode ref \
|
||||
--gateway-port 18789 \
|
||||
--gateway-bind loopback \
|
||||
@@ -540,7 +570,8 @@ run_ref_onboard() {
|
||||
}
|
||||
|
||||
verify_local_turn() {
|
||||
guest_exec /usr/bin/env "OPENAI_API_KEY=$OPENAI_API_KEY_VALUE" openclaw agent \
|
||||
guest_exec openclaw models set "$MODEL_ID"
|
||||
guest_exec /usr/bin/env "$API_KEY_ENV=$API_KEY_VALUE" openclaw agent \
|
||||
--local \
|
||||
--agent main \
|
||||
--message ping \
|
||||
@@ -630,6 +661,7 @@ summary = {
|
||||
"snapshotHint": os.environ["SUMMARY_SNAPSHOT_HINT"],
|
||||
"snapshotId": os.environ["SUMMARY_SNAPSHOT_ID"],
|
||||
"mode": os.environ["SUMMARY_MODE"],
|
||||
"provider": os.environ["SUMMARY_PROVIDER"],
|
||||
"latestVersion": os.environ["SUMMARY_LATEST_VERSION"],
|
||||
"installVersion": os.environ["SUMMARY_INSTALL_VERSION"],
|
||||
"targetPackageSpec": os.environ["SUMMARY_TARGET_PACKAGE_SPEC"],
|
||||
@@ -745,6 +777,7 @@ SUMMARY_JSON_PATH="$(
|
||||
SUMMARY_SNAPSHOT_HINT="$SNAPSHOT_HINT" \
|
||||
SUMMARY_SNAPSHOT_ID="$SNAPSHOT_ID" \
|
||||
SUMMARY_MODE="$MODE" \
|
||||
SUMMARY_PROVIDER="$PROVIDER" \
|
||||
SUMMARY_LATEST_VERSION="$LATEST_VERSION" \
|
||||
SUMMARY_INSTALL_VERSION="$INSTALL_VERSION" \
|
||||
SUMMARY_TARGET_PACKAGE_SPEC="$TARGET_PACKAGE_SPEC" \
|
||||
|
||||
@@ -6,7 +6,11 @@ ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
|
||||
VM_NAME="macOS Tahoe"
|
||||
SNAPSHOT_HINT="macOS 26.3.1 latest"
|
||||
MODE="both"
|
||||
OPENAI_API_KEY_ENV="OPENAI_API_KEY"
|
||||
PROVIDER="openai"
|
||||
API_KEY_ENV=""
|
||||
AUTH_CHOICE=""
|
||||
AUTH_KEY_FLAG=""
|
||||
MODEL_ID=""
|
||||
INSTALL_URL="https://openclaw.ai/install.sh"
|
||||
HOST_PORT="18425"
|
||||
HOST_PORT_EXPLICIT=0
|
||||
@@ -111,8 +115,11 @@ Options:
|
||||
fresh = fresh snapshot -> target package/current main tgz -> onboard smoke
|
||||
upgrade = fresh snapshot -> latest release -> target package/current main tgz -> onboard smoke
|
||||
both = run both lanes
|
||||
--openai-api-key-env <var> Host env var name for OpenAI API key.
|
||||
Default: OPENAI_API_KEY
|
||||
--provider <openai|anthropic>
|
||||
Provider auth/model lane. Default: openai
|
||||
--api-key-env <var> Host env var name for provider API key.
|
||||
Default: OPENAI_API_KEY for openai, ANTHROPIC_API_KEY for anthropic
|
||||
--openai-api-key-env <var> Alias for --api-key-env (backward compatible)
|
||||
--install-url <url> Installer URL for latest release. Default: https://openclaw.ai/install.sh
|
||||
--host-port <port> Host HTTP port for current-main tgz. Default: 18425
|
||||
--host-ip <ip> Override Parallels host IP.
|
||||
@@ -148,8 +155,12 @@ while [[ $# -gt 0 ]]; do
|
||||
MODE="$2"
|
||||
shift 2
|
||||
;;
|
||||
--openai-api-key-env)
|
||||
OPENAI_API_KEY_ENV="$2"
|
||||
--provider)
|
||||
PROVIDER="$2"
|
||||
shift 2
|
||||
;;
|
||||
--api-key-env|--openai-api-key-env)
|
||||
API_KEY_ENV="$2"
|
||||
shift 2
|
||||
;;
|
||||
--install-url)
|
||||
@@ -218,8 +229,26 @@ case "$MODE" in
|
||||
;;
|
||||
esac
|
||||
|
||||
OPENAI_API_KEY_VALUE="${!OPENAI_API_KEY_ENV:-}"
|
||||
[[ -n "$OPENAI_API_KEY_VALUE" ]] || die "$OPENAI_API_KEY_ENV is required"
|
||||
case "$PROVIDER" in
|
||||
openai)
|
||||
AUTH_CHOICE="openai-api-key"
|
||||
AUTH_KEY_FLAG="openai-api-key"
|
||||
MODEL_ID="openai/gpt-5.4"
|
||||
[[ -n "$API_KEY_ENV" ]] || API_KEY_ENV="OPENAI_API_KEY"
|
||||
;;
|
||||
anthropic)
|
||||
AUTH_CHOICE="apiKey"
|
||||
AUTH_KEY_FLAG="anthropic-api-key"
|
||||
MODEL_ID="anthropic/claude-sonnet-4-6"
|
||||
[[ -n "$API_KEY_ENV" ]] || API_KEY_ENV="ANTHROPIC_API_KEY"
|
||||
;;
|
||||
*)
|
||||
die "invalid --provider: $PROVIDER"
|
||||
;;
|
||||
esac
|
||||
|
||||
API_KEY_VALUE="${!API_KEY_ENV:-}"
|
||||
[[ -n "$API_KEY_VALUE" ]] || die "$API_KEY_ENV is required"
|
||||
|
||||
if [[ -n "$DISCORD_TOKEN_ENV" || -n "$DISCORD_GUILD_ID" || -n "$DISCORD_CHANNEL_ID" ]]; then
|
||||
[[ -n "$DISCORD_TOKEN_ENV" ]] || die "--discord-token-env is required when Discord smoke args are set"
|
||||
@@ -712,11 +741,11 @@ EOF
|
||||
|
||||
run_ref_onboard() {
|
||||
guest_current_user_cli \
|
||||
/usr/bin/env "OPENAI_API_KEY=$OPENAI_API_KEY_VALUE" \
|
||||
/usr/bin/env "$API_KEY_ENV=$API_KEY_VALUE" \
|
||||
"$GUEST_OPENCLAW_BIN" onboard \
|
||||
--non-interactive \
|
||||
--mode local \
|
||||
--auth-choice openai-api-key \
|
||||
--auth-choice "$AUTH_CHOICE" \
|
||||
--secret-input-mode ref \
|
||||
--gateway-port 18789 \
|
||||
--gateway-bind loopback \
|
||||
@@ -739,8 +768,9 @@ show_gateway_status_compat() {
|
||||
}
|
||||
|
||||
verify_turn() {
|
||||
guest_current_user_cli "$GUEST_OPENCLAW_BIN" models set "$MODEL_ID"
|
||||
guest_current_user_cli \
|
||||
/usr/bin/env "OPENAI_API_KEY=$OPENAI_API_KEY_VALUE" \
|
||||
/usr/bin/env "$API_KEY_ENV=$API_KEY_VALUE" \
|
||||
"$GUEST_OPENCLAW_BIN" agent \
|
||||
--agent main \
|
||||
--message "Reply with exact ASCII text OK only." \
|
||||
@@ -1082,6 +1112,7 @@ import sys
|
||||
|
||||
summary = {
|
||||
"vm": os.environ["SUMMARY_VM"],
|
||||
"provider": os.environ["SUMMARY_PROVIDER"],
|
||||
"snapshotHint": os.environ["SUMMARY_SNAPSHOT_HINT"],
|
||||
"snapshotId": os.environ["SUMMARY_SNAPSHOT_ID"],
|
||||
"mode": os.environ["SUMMARY_MODE"],
|
||||
@@ -1246,6 +1277,7 @@ fi
|
||||
|
||||
SUMMARY_JSON_PATH="$(
|
||||
SUMMARY_VM="$VM_NAME" \
|
||||
SUMMARY_PROVIDER="$PROVIDER" \
|
||||
SUMMARY_SNAPSHOT_HINT="$SNAPSHOT_HINT" \
|
||||
SUMMARY_SNAPSHOT_ID="$SNAPSHOT_ID" \
|
||||
SUMMARY_MODE="$MODE" \
|
||||
|
||||
@@ -6,7 +6,11 @@ ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
|
||||
MACOS_VM="macOS Tahoe"
|
||||
WINDOWS_VM="Windows 11"
|
||||
LINUX_VM="Ubuntu 24.04.3 ARM64"
|
||||
OPENAI_API_KEY_ENV="OPENAI_API_KEY"
|
||||
PROVIDER="openai"
|
||||
API_KEY_ENV=""
|
||||
AUTH_CHOICE=""
|
||||
AUTH_KEY_FLAG=""
|
||||
MODEL_ID=""
|
||||
PACKAGE_SPEC=""
|
||||
JSON_OUTPUT=0
|
||||
RUN_DIR="$(mktemp -d /tmp/openclaw-parallels-npm-update.XXXXXX)"
|
||||
@@ -19,7 +23,7 @@ HOST_PORT=""
|
||||
LATEST_VERSION=""
|
||||
CURRENT_HEAD=""
|
||||
CURRENT_HEAD_SHORT=""
|
||||
OPENAI_API_KEY_VALUE=""
|
||||
API_KEY_VALUE=""
|
||||
|
||||
MACOS_FRESH_STATUS="skip"
|
||||
WINDOWS_FRESH_STATUS="skip"
|
||||
@@ -59,7 +63,11 @@ Usage: bash scripts/e2e/parallels-npm-update-smoke.sh [options]
|
||||
|
||||
Options:
|
||||
--package-spec <npm-spec> Baseline npm package spec. Default: openclaw@latest
|
||||
--openai-api-key-env <var> Host env var name for OpenAI API key. Default: OPENAI_API_KEY
|
||||
--provider <openai|anthropic>
|
||||
Provider auth/model lane. Default: openai
|
||||
--api-key-env <var> Host env var name for provider API key.
|
||||
Default: OPENAI_API_KEY for openai, ANTHROPIC_API_KEY for anthropic
|
||||
--openai-api-key-env <var> Alias for --api-key-env (backward compatible)
|
||||
--json Print machine-readable JSON summary.
|
||||
-h, --help Show help.
|
||||
EOF
|
||||
@@ -74,8 +82,12 @@ while [[ $# -gt 0 ]]; do
|
||||
PACKAGE_SPEC="$2"
|
||||
shift 2
|
||||
;;
|
||||
--openai-api-key-env)
|
||||
OPENAI_API_KEY_ENV="$2"
|
||||
--provider)
|
||||
PROVIDER="$2"
|
||||
shift 2
|
||||
;;
|
||||
--api-key-env|--openai-api-key-env)
|
||||
API_KEY_ENV="$2"
|
||||
shift 2
|
||||
;;
|
||||
--json)
|
||||
@@ -92,8 +104,26 @@ while [[ $# -gt 0 ]]; do
|
||||
esac
|
||||
done
|
||||
|
||||
OPENAI_API_KEY_VALUE="${!OPENAI_API_KEY_ENV:-}"
|
||||
[[ -n "$OPENAI_API_KEY_VALUE" ]] || die "$OPENAI_API_KEY_ENV is required"
|
||||
case "$PROVIDER" in
|
||||
openai)
|
||||
AUTH_CHOICE="openai-api-key"
|
||||
AUTH_KEY_FLAG="openai-api-key"
|
||||
MODEL_ID="openai/gpt-5.4"
|
||||
[[ -n "$API_KEY_ENV" ]] || API_KEY_ENV="OPENAI_API_KEY"
|
||||
;;
|
||||
anthropic)
|
||||
AUTH_CHOICE="apiKey"
|
||||
AUTH_KEY_FLAG="anthropic-api-key"
|
||||
MODEL_ID="anthropic/claude-sonnet-4-6"
|
||||
[[ -n "$API_KEY_ENV" ]] || API_KEY_ENV="ANTHROPIC_API_KEY"
|
||||
;;
|
||||
*)
|
||||
die "invalid --provider: $PROVIDER"
|
||||
;;
|
||||
esac
|
||||
|
||||
API_KEY_VALUE="${!API_KEY_ENV:-}"
|
||||
[[ -n "$API_KEY_VALUE" ]] || die "$API_KEY_ENV is required"
|
||||
|
||||
resolve_linux_vm_name() {
|
||||
local json requested
|
||||
@@ -173,6 +203,9 @@ param(
|
||||
[Parameter(Mandatory = $true)][string]$TgzUrl,
|
||||
[Parameter(Mandatory = $true)][string]$HeadShort,
|
||||
[Parameter(Mandatory = $true)][string]$SessionId,
|
||||
[Parameter(Mandatory = $true)][string]$ModelId,
|
||||
[Parameter(Mandatory = $true)][string]$ProviderKeyEnv,
|
||||
[Parameter(Mandatory = $true)][string]$ProviderKey,
|
||||
[Parameter(Mandatory = $true)][string]$LogPath,
|
||||
[Parameter(Mandatory = $true)][string]$DonePath
|
||||
)
|
||||
@@ -243,6 +276,7 @@ try {
|
||||
$env:PATH = "$env:LOCALAPPDATA\OpenClaw\deps\portable-git\cmd;$env:LOCALAPPDATA\OpenClaw\deps\portable-git\mingw64\bin;$env:LOCALAPPDATA\OpenClaw\deps\portable-git\usr\bin;$env:PATH"
|
||||
$tgz = Join-Path $env:TEMP 'openclaw-main-update.tgz'
|
||||
Remove-Item $tgz, $LogPath, $DonePath -Force -ErrorAction SilentlyContinue
|
||||
Set-Item -Path ('Env:' + $ProviderKeyEnv) -Value $ProviderKey
|
||||
Invoke-Logged 'download current tgz' { curl.exe -fsSL $TgzUrl -o $tgz }
|
||||
Invoke-Logged 'npm install current tgz' { npm.cmd install -g $tgz --no-fund --no-audit }
|
||||
$openclaw = Join-Path $env:APPDATA 'npm\openclaw.cmd'
|
||||
@@ -250,7 +284,7 @@ try {
|
||||
if ($version -notmatch [regex]::Escape($HeadShort)) {
|
||||
throw "version mismatch: expected substring $HeadShort"
|
||||
}
|
||||
Invoke-Logged 'openclaw models set' { & $openclaw models set openai/gpt-5.4 }
|
||||
Invoke-Logged 'openclaw models set' { & $openclaw models set $ModelId }
|
||||
# Windows can keep the old hashed dist modules alive across in-place global npm upgrades.
|
||||
# Restart the gateway/service before verifying status or the next agent turn.
|
||||
Invoke-Logged 'openclaw gateway restart' { & $openclaw gateway restart }
|
||||
@@ -379,6 +413,9 @@ run_windows_script_via_log() {
|
||||
local tgz_url="$2"
|
||||
local head_short="$3"
|
||||
local session_id="$4"
|
||||
local model_id="$5"
|
||||
local provider_key_env="$6"
|
||||
local provider_key="$7"
|
||||
local runner_name log_name done_name done_status launcher_state
|
||||
local start_seconds poll_deadline startup_checked poll_rc state_rc log_rc
|
||||
runner_name="openclaw-update-$RANDOM-$RANDOM.ps1"
|
||||
@@ -401,6 +438,9 @@ Start-Process powershell.exe -ArgumentList @(
|
||||
'-TgzUrl', '$tgz_url',
|
||||
'-HeadShort', '$head_short',
|
||||
'-SessionId', '$session_id',
|
||||
'-ModelId', '$model_id',
|
||||
'-ProviderKeyEnv', '$provider_key_env',
|
||||
'-ProviderKey', '$provider_key',
|
||||
'-LogPath', \$log,
|
||||
'-DonePath', \$done
|
||||
) -WindowStyle Hidden | Out-Null
|
||||
@@ -483,9 +523,9 @@ case "\$version" in
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
/opt/homebrew/bin/openclaw models set openai/gpt-5.4
|
||||
/opt/homebrew/bin/openclaw models set "$MODEL_ID"
|
||||
/opt/homebrew/bin/openclaw gateway status --deep --require-rpc
|
||||
/opt/homebrew/bin/openclaw agent --agent main --session-id parallels-npm-update-macos-$head_short --message "Reply with exact ASCII text OK only." --json
|
||||
/usr/bin/env "$API_KEY_ENV=$API_KEY_VALUE" /opt/homebrew/bin/openclaw agent --agent main --session-id parallels-npm-update-macos-$head_short --message "Reply with exact ASCII text OK only." --json
|
||||
EOF
|
||||
prlctl exec "$MACOS_VM" --current-user /bin/bash /tmp/openclaw-main-update.sh
|
||||
}
|
||||
@@ -494,7 +534,14 @@ run_windows_update() {
|
||||
local tgz_url="$1"
|
||||
local head_short="$2"
|
||||
local script_url="$3"
|
||||
run_windows_script_via_log "$script_url" "$tgz_url" "$head_short" "parallels-npm-update-windows-$head_short"
|
||||
run_windows_script_via_log \
|
||||
"$script_url" \
|
||||
"$tgz_url" \
|
||||
"$head_short" \
|
||||
"parallels-npm-update-windows-$head_short" \
|
||||
"$MODEL_ID" \
|
||||
"$API_KEY_ENV" \
|
||||
"$API_KEY_VALUE"
|
||||
}
|
||||
|
||||
run_linux_update() {
|
||||
@@ -515,10 +562,10 @@ case "\$version" in
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
openclaw models set openai/gpt-5.4
|
||||
openclaw models set "$MODEL_ID"
|
||||
openclaw agent --local --agent main --session-id parallels-npm-update-linux-$head_short --message "Reply with exact ASCII text OK only." --json
|
||||
EOF
|
||||
prlctl exec "$LINUX_VM" /usr/bin/env "OPENAI_API_KEY=$OPENAI_API_KEY_VALUE" /bin/bash /tmp/openclaw-main-update.sh
|
||||
prlctl exec "$LINUX_VM" /usr/bin/env "$API_KEY_ENV=$API_KEY_VALUE" /bin/bash /tmp/openclaw-main-update.sh
|
||||
}
|
||||
|
||||
write_summary_json() {
|
||||
@@ -530,6 +577,7 @@ import sys
|
||||
|
||||
summary = {
|
||||
"packageSpec": os.environ["SUMMARY_PACKAGE_SPEC"],
|
||||
"provider": os.environ["SUMMARY_PROVIDER"],
|
||||
"latestVersion": os.environ["SUMMARY_LATEST_VERSION"],
|
||||
"currentHead": os.environ["SUMMARY_CURRENT_HEAD"],
|
||||
"runDir": os.environ["SUMMARY_RUN_DIR"],
|
||||
@@ -550,7 +598,7 @@ summary = {
|
||||
"linux": {
|
||||
"status": os.environ["SUMMARY_LINUX_UPDATE_STATUS"],
|
||||
"version": os.environ["SUMMARY_LINUX_UPDATE_VERSION"],
|
||||
"mode": "local-with-openai-env",
|
||||
"mode": "local-with-provider-env",
|
||||
},
|
||||
},
|
||||
}
|
||||
@@ -574,18 +622,24 @@ fi
|
||||
say "Run fresh npm baseline: $PACKAGE_SPEC"
|
||||
bash "$ROOT_DIR/scripts/e2e/parallels-macos-smoke.sh" \
|
||||
--mode fresh \
|
||||
--provider "$PROVIDER" \
|
||||
--api-key-env "$API_KEY_ENV" \
|
||||
--target-package-spec "$PACKAGE_SPEC" \
|
||||
--json >"$RUN_DIR/macos-fresh.log" 2>&1 &
|
||||
macos_fresh_pid=$!
|
||||
|
||||
bash "$ROOT_DIR/scripts/e2e/parallels-windows-smoke.sh" \
|
||||
--mode fresh \
|
||||
--provider "$PROVIDER" \
|
||||
--api-key-env "$API_KEY_ENV" \
|
||||
--target-package-spec "$PACKAGE_SPEC" \
|
||||
--json >"$RUN_DIR/windows-fresh.log" 2>&1 &
|
||||
windows_fresh_pid=$!
|
||||
|
||||
bash "$ROOT_DIR/scripts/e2e/parallels-linux-smoke.sh" \
|
||||
--mode fresh \
|
||||
--provider "$PROVIDER" \
|
||||
--api-key-env "$API_KEY_ENV" \
|
||||
--target-package-spec "$PACKAGE_SPEC" \
|
||||
--json >"$RUN_DIR/linux-fresh.log" 2>&1 &
|
||||
linux_fresh_pid=$!
|
||||
@@ -626,6 +680,7 @@ WINDOWS_UPDATE_VERSION="$(extract_last_version "$RUN_DIR/windows-update.log")"
|
||||
LINUX_UPDATE_VERSION="$(extract_last_version "$RUN_DIR/linux-update.log")"
|
||||
|
||||
SUMMARY_PACKAGE_SPEC="$PACKAGE_SPEC" \
|
||||
SUMMARY_PROVIDER="$PROVIDER" \
|
||||
SUMMARY_LATEST_VERSION="$LATEST_VERSION" \
|
||||
SUMMARY_CURRENT_HEAD="$CURRENT_HEAD_SHORT" \
|
||||
SUMMARY_RUN_DIR="$RUN_DIR" \
|
||||
|
||||
@@ -4,7 +4,11 @@ set -euo pipefail
|
||||
VM_NAME="Windows 11"
|
||||
SNAPSHOT_HINT="pre-openclaw-native-e2e-2026-03-12"
|
||||
MODE="both"
|
||||
OPENAI_API_KEY_ENV="OPENAI_API_KEY"
|
||||
PROVIDER="openai"
|
||||
API_KEY_ENV=""
|
||||
AUTH_CHOICE=""
|
||||
AUTH_KEY_FLAG=""
|
||||
MODEL_ID=""
|
||||
INSTALL_URL="https://openclaw.ai/install.ps1"
|
||||
HOST_PORT="18426"
|
||||
HOST_PORT_EXPLICIT=0
|
||||
@@ -23,6 +27,7 @@ MAIN_TGZ_DIR="$(mktemp -d)"
|
||||
MAIN_TGZ_PATH=""
|
||||
MINGIT_ZIP_PATH=""
|
||||
MINGIT_ZIP_NAME=""
|
||||
WINDOWS_ONBOARD_SCRIPT_PATH=""
|
||||
SERVER_PID=""
|
||||
RUN_DIR="$(mktemp -d /tmp/openclaw-parallels-windows.XXXXXX)"
|
||||
BUILD_LOCK_DIR="${TMPDIR:-/tmp}/openclaw-parallels-build.lock"
|
||||
@@ -84,8 +89,11 @@ Options:
|
||||
--snapshot-hint <name> Snapshot name substring/fuzzy match.
|
||||
Default: "pre-openclaw-native-e2e-2026-03-12"
|
||||
--mode <fresh|upgrade|both>
|
||||
--openai-api-key-env <var> Host env var name for OpenAI API key.
|
||||
Default: OPENAI_API_KEY
|
||||
--provider <openai|anthropic>
|
||||
Provider auth/model lane. Default: openai
|
||||
--api-key-env <var> Host env var name for provider API key.
|
||||
Default: OPENAI_API_KEY for openai, ANTHROPIC_API_KEY for anthropic
|
||||
--openai-api-key-env <var> Alias for --api-key-env (backward compatible)
|
||||
--install-url <url> Installer URL for latest release. Default: https://openclaw.ai/install.ps1
|
||||
--host-port <port> Host HTTP port for current-main tgz. Default: 18426
|
||||
--host-ip <ip> Override Parallels host IP.
|
||||
@@ -118,8 +126,12 @@ while [[ $# -gt 0 ]]; do
|
||||
MODE="$2"
|
||||
shift 2
|
||||
;;
|
||||
--openai-api-key-env)
|
||||
OPENAI_API_KEY_ENV="$2"
|
||||
--provider)
|
||||
PROVIDER="$2"
|
||||
shift 2
|
||||
;;
|
||||
--api-key-env|--openai-api-key-env)
|
||||
API_KEY_ENV="$2"
|
||||
shift 2
|
||||
;;
|
||||
--install-url)
|
||||
@@ -176,8 +188,26 @@ case "$MODE" in
|
||||
;;
|
||||
esac
|
||||
|
||||
OPENAI_API_KEY_VALUE="${!OPENAI_API_KEY_ENV:-}"
|
||||
[[ -n "$OPENAI_API_KEY_VALUE" ]] || die "$OPENAI_API_KEY_ENV is required"
|
||||
case "$PROVIDER" in
|
||||
openai)
|
||||
AUTH_CHOICE="openai-api-key"
|
||||
AUTH_KEY_FLAG="openai-api-key"
|
||||
MODEL_ID="openai/gpt-5.4"
|
||||
[[ -n "$API_KEY_ENV" ]] || API_KEY_ENV="OPENAI_API_KEY"
|
||||
;;
|
||||
anthropic)
|
||||
AUTH_CHOICE="apiKey"
|
||||
AUTH_KEY_FLAG="anthropic-api-key"
|
||||
MODEL_ID="anthropic/claude-sonnet-4-6"
|
||||
[[ -n "$API_KEY_ENV" ]] || API_KEY_ENV="ANTHROPIC_API_KEY"
|
||||
;;
|
||||
*)
|
||||
die "invalid --provider: $PROVIDER"
|
||||
;;
|
||||
esac
|
||||
|
||||
API_KEY_VALUE="${!API_KEY_ENV:-}"
|
||||
[[ -n "$API_KEY_VALUE" ]] || die "$API_KEY_ENV is required"
|
||||
|
||||
ps_single_quote() {
|
||||
printf "%s" "$1" | sed "s/'/''/g"
|
||||
@@ -553,6 +583,7 @@ summary = {
|
||||
"snapshotHint": os.environ["SUMMARY_SNAPSHOT_HINT"],
|
||||
"snapshotId": os.environ["SUMMARY_SNAPSHOT_ID"],
|
||||
"mode": os.environ["SUMMARY_MODE"],
|
||||
"provider": os.environ["SUMMARY_PROVIDER"],
|
||||
"latestVersion": os.environ["SUMMARY_LATEST_VERSION"],
|
||||
"installVersion": os.environ["SUMMARY_INSTALL_VERSION"],
|
||||
"targetPackageSpec": os.environ["SUMMARY_TARGET_PACKAGE_SPEC"],
|
||||
@@ -824,10 +855,41 @@ verify_version_contains() {
|
||||
esac
|
||||
}
|
||||
|
||||
write_onboard_runner_script() {
|
||||
WINDOWS_ONBOARD_SCRIPT_PATH="$MAIN_TGZ_DIR/openclaw-onboard-$PROVIDER.ps1"
|
||||
cat >"$WINDOWS_ONBOARD_SCRIPT_PATH" <<EOF
|
||||
param(
|
||||
[Parameter(Mandatory = \$true)][string]\$LogPath,
|
||||
[Parameter(Mandatory = \$true)][string]\$DonePath
|
||||
)
|
||||
|
||||
\$ErrorActionPreference = 'Stop'
|
||||
\$PSNativeCommandUseErrorActionPreference = \$false
|
||||
|
||||
try {
|
||||
\$openclaw = Join-Path \$env:APPDATA 'npm\openclaw.cmd'
|
||||
\$cmdLine = ('"{0}" onboard --non-interactive --mode local --auth-choice ${AUTH_CHOICE} --secret-input-mode ref --gateway-port 18789 --gateway-bind loopback --install-daemon --skip-skills --accept-risk --json > "{1}" 2>&1' -f \$openclaw, \$LogPath)
|
||||
& cmd.exe /d /s /c \$cmdLine
|
||||
Set-Content -Path \$DonePath -Value ([string]\$LASTEXITCODE)
|
||||
} catch {
|
||||
if (Test-Path \$LogPath) {
|
||||
Add-Content -Path \$LogPath -Value (\$_ | Out-String)
|
||||
} else {
|
||||
(\$_ | Out-String) | Set-Content -Path \$LogPath
|
||||
}
|
||||
Set-Content -Path \$DonePath -Value '1'
|
||||
}
|
||||
EOF
|
||||
}
|
||||
|
||||
run_ref_onboard() {
|
||||
local openai_key_q runner_name log_name done_name done_status launcher_state
|
||||
local api_key_env_q api_key_value_q script_url
|
||||
local runner_name log_name done_name done_status launcher_state
|
||||
local poll_rc state_rc log_rc start_seconds poll_deadline startup_checked
|
||||
openai_key_q="$(ps_single_quote "$OPENAI_API_KEY_VALUE")"
|
||||
api_key_env_q="$(ps_single_quote "$API_KEY_ENV")"
|
||||
api_key_value_q="$(ps_single_quote "$API_KEY_VALUE")"
|
||||
write_onboard_runner_script
|
||||
script_url="http://$HOST_IP:$HOST_PORT/$(basename "$WINDOWS_ONBOARD_SCRIPT_PATH")"
|
||||
runner_name="openclaw-onboard-$RANDOM-$RANDOM.ps1"
|
||||
log_name="openclaw-onboard-$RANDOM-$RANDOM.log"
|
||||
done_name="openclaw-onboard-$RANDOM-$RANDOM.done"
|
||||
@@ -840,27 +902,9 @@ run_ref_onboard() {
|
||||
\$log = Join-Path \$env:TEMP '$log_name'
|
||||
\$done = Join-Path \$env:TEMP '$done_name'
|
||||
Remove-Item \$runner, \$log, \$done -Force -ErrorAction SilentlyContinue
|
||||
@'
|
||||
\$ErrorActionPreference = 'Stop'
|
||||
\$PSNativeCommandUseErrorActionPreference = \$false
|
||||
\$log = Join-Path \$env:TEMP '$log_name'
|
||||
\$done = Join-Path \$env:TEMP '$done_name'
|
||||
\$env:OPENAI_API_KEY = '$openai_key_q'
|
||||
try {
|
||||
\$openclaw = Join-Path \$env:APPDATA 'npm\openclaw.cmd'
|
||||
\$cmdLine = ('"{0}" onboard --non-interactive --mode local --auth-choice openai-api-key --secret-input-mode ref --gateway-port 18789 --gateway-bind loopback --install-daemon --skip-skills --accept-risk --json > "{1}" 2>&1' -f \$openclaw, \$log)
|
||||
& cmd.exe /d /s /c \$cmdLine
|
||||
Set-Content -Path \$done -Value ([string]\$LASTEXITCODE)
|
||||
} catch {
|
||||
if (Test-Path \$log) {
|
||||
Add-Content -Path \$log -Value (\$_ | Out-String)
|
||||
} else {
|
||||
(\$_ | Out-String) | Set-Content -Path \$log
|
||||
}
|
||||
Set-Content -Path \$done -Value '1'
|
||||
}
|
||||
'@ | Set-Content -Path \$runner
|
||||
Start-Process powershell.exe -ArgumentList @('-NoProfile', '-ExecutionPolicy', 'Bypass', '-File', \$runner) -WindowStyle Hidden | Out-Null
|
||||
Set-Item -Path ('Env:' + '${api_key_env_q}') -Value '${api_key_value_q}'
|
||||
curl.exe -fsSL '$script_url' -o \$runner
|
||||
Start-Process powershell.exe -ArgumentList @('-NoProfile', '-ExecutionPolicy', 'Bypass', '-File', \$runner, '-LogPath', \$log, '-DonePath', \$done) -WindowStyle Hidden | Out-Null
|
||||
EOF
|
||||
)"
|
||||
|
||||
@@ -1028,7 +1072,8 @@ show_gateway_status_compat() {
|
||||
}
|
||||
|
||||
verify_turn() {
|
||||
guest_run_openclaw "OPENAI_API_KEY" "$OPENAI_API_KEY_VALUE" \
|
||||
guest_run_openclaw "" "" models set "$MODEL_ID"
|
||||
guest_run_openclaw "$API_KEY_ENV" "$API_KEY_VALUE" \
|
||||
agent --agent main --message "Reply with exact ASCII text OK only." --json
|
||||
}
|
||||
|
||||
@@ -1144,6 +1189,7 @@ SUMMARY_JSON_PATH="$(
|
||||
SUMMARY_SNAPSHOT_HINT="$SNAPSHOT_HINT" \
|
||||
SUMMARY_SNAPSHOT_ID="$SNAPSHOT_ID" \
|
||||
SUMMARY_MODE="$MODE" \
|
||||
SUMMARY_PROVIDER="$PROVIDER" \
|
||||
SUMMARY_LATEST_VERSION="$LATEST_VERSION" \
|
||||
SUMMARY_INSTALL_VERSION="$INSTALL_VERSION" \
|
||||
SUMMARY_TARGET_PACKAGE_SPEC="$TARGET_PACKAGE_SPEC" \
|
||||
|
||||
Reference in New Issue
Block a user