71 lines
2.5 KiB
Bash
Executable File
71 lines
2.5 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
|
|
set -euo pipefail
|
|
|
|
WEB_ROOT=${1:-/opt/lingniu-vehicle-platform/current/web}
|
|
BASE_URL=${2:-http://127.0.0.1:20300}
|
|
PREVIOUS_MANIFEST=${3:-}
|
|
CURL_TIMEOUT_SEC=${CURL_TIMEOUT_SEC:-15}
|
|
|
|
BASE_URL=${BASE_URL%/}
|
|
CURRENT_MANIFEST="$WEB_ROOT/.release-assets"
|
|
response_file=$(mktemp)
|
|
trap 'rm -f "$response_file"' EXIT
|
|
|
|
fail() {
|
|
printf 'web release smoke failed: %s\n' "$*" >&2
|
|
exit 1
|
|
}
|
|
|
|
fetch_exact() {
|
|
local url_path=$1
|
|
local expected_file=$2
|
|
local label=$3
|
|
local status
|
|
|
|
test -f "$expected_file" || fail "$label is missing on disk: $expected_file"
|
|
status=$(curl --silent --show-error --max-time "$CURL_TIMEOUT_SEC" --output "$response_file" --write-out '%{http_code}' "$BASE_URL$url_path" || true)
|
|
test "$status" = 200 || fail "$label returned HTTP ${status:-000}: $url_path"
|
|
cmp -s "$expected_file" "$response_file" || fail "$label response differs from release file: $url_path"
|
|
}
|
|
|
|
verify_manifest() {
|
|
local manifest=$1
|
|
local kind=$2
|
|
local count=0
|
|
local asset
|
|
|
|
test -f "$manifest" || fail "$kind manifest is missing: $manifest"
|
|
while IFS= read -r asset || test -n "$asset"; do
|
|
asset=${asset%$'\r'}
|
|
test -n "$asset" || continue
|
|
case "$asset" in
|
|
/*|*../*|../*|*/..|..)
|
|
fail "$kind manifest contains unsafe asset path: $asset"
|
|
;;
|
|
esac
|
|
fetch_exact "/assets/$asset" "$WEB_ROOT/assets/$asset" "$kind asset"
|
|
count=$((count + 1))
|
|
done < "$manifest"
|
|
test "$count" -gt 0 || fail "$kind manifest is empty: $manifest"
|
|
printf '%s' "$count"
|
|
}
|
|
|
|
fetch_exact / "$WEB_ROOT/index.html" 'root document'
|
|
|
|
config_status=$(curl --silent --show-error --max-time "$CURL_TIMEOUT_SEC" --output "$response_file" --write-out '%{http_code}' "$BASE_URL/app-config.js" || true)
|
|
test "$config_status" = 200 || fail "app config returned HTTP ${config_status:-000}"
|
|
grep -q 'window\.__LINGNIU_APP_CONFIG__' "$response_file" || fail 'app config response does not expose the runtime configuration object'
|
|
if grep -q '"amapSecurityJsCode"' "$response_file"; then
|
|
fail 'app config response exposes the server-side AMap security code'
|
|
fi
|
|
grep -q '"amapSecurityServiceHost":"/_AMapService"' "$response_file" || fail 'app config response does not enable the server-side AMap proxy'
|
|
|
|
current_count=$(verify_manifest "$CURRENT_MANIFEST" current)
|
|
compatibility_count=0
|
|
if test -n "$PREVIOUS_MANIFEST"; then
|
|
compatibility_count=$(verify_manifest "$PREVIOUS_MANIFEST" compatibility)
|
|
fi
|
|
|
|
printf 'web_release_smoke=ok current_assets=%s compatibility_assets=%s\n' "$current_count" "$compatibility_count"
|