Skip to content

Commit df8505b

Browse files
committed
test: cover installer npm freshness policy
1 parent 0903fa6 commit df8505b

2 files changed

Lines changed: 107 additions & 0 deletions

File tree

scripts/docker/install-sh-smoke/run.sh

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,10 @@ UPDATE_BASELINE_VERSION="${OPENCLAW_INSTALL_UPDATE_BASELINE:-latest}"
1313
UPDATE_BASELINE_TAG_URL="${OPENCLAW_INSTALL_UPDATE_BASELINE_TAG_URL:-}"
1414
UPDATE_EXPECT_VERSION="${OPENCLAW_INSTALL_UPDATE_EXPECT_VERSION:-}"
1515
UPDATE_TAG_URL="${OPENCLAW_INSTALL_UPDATE_TAG_URL:-}"
16+
FRESHNESS_VERSION="${OPENCLAW_INSTALL_FRESHNESS_VERSION:-latest}"
17+
# npm min-release-age is days; 10000 keeps the control failure independent of normal release cadence.
18+
FRESHNESS_MIN_RELEASE_AGE="${OPENCLAW_INSTALL_FRESHNESS_MIN_RELEASE_AGE:-10000}"
19+
FRESHNESS_NPM_VERSION="${OPENCLAW_INSTALL_FRESHNESS_NPM_VERSION:-11.14.1}"
1620
HEARTBEAT_INTERVAL="${OPENCLAW_INSTALL_SMOKE_HEARTBEAT_INTERVAL:-60}"
1721
INSTALL_COMMAND_TIMEOUT="${OPENCLAW_INSTALL_SMOKE_COMMAND_TIMEOUT:-900}"
1822
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
@@ -391,6 +395,75 @@ run_npm_global_smoke() {
391395
echo "OK"
392396
}
393397

398+
run_freshness_smoke() {
399+
local freshness_spec="${PACKAGE_NAME}@${FRESHNESS_VERSION}"
400+
local expected_version
401+
local current_npm_version
402+
local policy_home
403+
local plain_stdout_file
404+
local plain_stderr_file
405+
local plain_status
406+
policy_home="$(mktemp -d)"
407+
plain_stdout_file="$(mktemp)"
408+
plain_stderr_file="$(mktemp)"
409+
printf "min-release-age=%s\n" "$FRESHNESS_MIN_RELEASE_AGE" >"${policy_home}/.npmrc"
410+
411+
current_npm_version="$(npm --version 2>/dev/null || true)"
412+
if [[ "$current_npm_version" != "$FRESHNESS_NPM_VERSION" ]]; then
413+
echo "==> Install npm with min-release-age support: npm@$FRESHNESS_NPM_VERSION"
414+
npm_install_global "install npm freshness-capable release" "npm@${FRESHNESS_NPM_VERSION}"
415+
fi
416+
417+
expected_version="$(quiet_npm view "$freshness_spec" version 2>/dev/null || true)"
418+
if [[ -z "$expected_version" ]]; then
419+
echo "ERROR: failed to resolve $freshness_spec" >&2
420+
return 1
421+
fi
422+
423+
echo "package=$PACKAGE_NAME version=$FRESHNESS_VERSION resolved=$expected_version npm=$(npm --version) min_release_age=$FRESHNESS_MIN_RELEASE_AGE"
424+
echo "==> Verify user npm freshness policy blocks plain npm install"
425+
set +e
426+
HOME="$policy_home" NPM_CONFIG_USERCONFIG="${policy_home}/.npmrc" \
427+
timeout --foreground "${INSTALL_COMMAND_TIMEOUT}s" \
428+
npm \
429+
--loglevel=error \
430+
--logs-max=0 \
431+
--no-update-notifier \
432+
--no-fund \
433+
--no-audit \
434+
--no-progress \
435+
install -g "$freshness_spec" \
436+
>"$plain_stdout_file" 2>"$plain_stderr_file"
437+
plain_status=$?
438+
set -e
439+
if [[ "$plain_status" -eq 0 ]]; then
440+
echo "ERROR: plain npm install unexpectedly succeeded under min-release-age policy" >&2
441+
return 1
442+
fi
443+
if ! grep -Eiq "No matching version|No versions available|ETARGET|ENOVERSIONS|notarget|min-release-age|minimum release age|before" \
444+
"$plain_stdout_file" "$plain_stderr_file"; then
445+
echo "ERROR: plain npm install failed without expected freshness evidence" >&2
446+
cat "$plain_stdout_file"
447+
cat "$plain_stderr_file" >&2
448+
return 1
449+
fi
450+
451+
echo "==> Run installer with same npm freshness policy"
452+
env \
453+
HOME="$policy_home" \
454+
NPM_CONFIG_USERCONFIG="${policy_home}/.npmrc" \
455+
OPENCLAW_NO_ONBOARD=1 \
456+
OPENCLAW_NO_PROMPT=1 \
457+
bash -c 'curl -fsSL "$1" | bash -s -- --install-method npm --version "$2" --no-prompt --no-onboard' \
458+
_ "$INSTALL_URL" "$FRESHNESS_VERSION"
459+
460+
echo "==> Verify installed version"
461+
print_install_audit "freshness install"
462+
verify_installed_cli "$PACKAGE_NAME" "$expected_version"
463+
464+
echo "OK"
465+
}
466+
394467
case "$SMOKE_MODE" in
395468
install)
396469
run_install_smoke
@@ -401,6 +474,9 @@ case "$SMOKE_MODE" in
401474
npm-global)
402475
run_npm_global_smoke
403476
;;
477+
freshness)
478+
run_freshness_smoke
479+
;;
404480
*)
405481
echo "ERROR: unsupported OPENCLAW_INSTALL_SMOKE_MODE=$SMOKE_MODE" >&2
406482
exit 1

scripts/test-install-sh-docker.sh

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,11 @@ SKIP_SMOKE_IMAGE_BUILD="${OPENCLAW_INSTALL_SMOKE_SKIP_IMAGE_BUILD:-0}"
149149
SKIP_NONROOT_IMAGE_BUILD="${OPENCLAW_INSTALL_NONROOT_SKIP_IMAGE_BUILD:-0}"
150150
SKIP_UPDATE="${OPENCLAW_INSTALL_SMOKE_SKIP_UPDATE:-0}"
151151
SKIP_NPM_GLOBAL="${OPENCLAW_INSTALL_SMOKE_SKIP_NPM_GLOBAL:-0}"
152+
SKIP_FRESHNESS="${OPENCLAW_INSTALL_SMOKE_SKIP_FRESHNESS:-0}"
153+
FRESHNESS_INSTALL_URL="${OPENCLAW_INSTALL_SMOKE_FRESHNESS_INSTALL_URL:-file:///tmp/openclaw-install.sh}"
154+
# npm min-release-age is days; 10000 keeps the control failure independent of normal release cadence.
155+
FRESHNESS_MIN_RELEASE_AGE="${OPENCLAW_INSTALL_FRESHNESS_MIN_RELEASE_AGE:-10000}"
156+
FRESHNESS_NPM_VERSION="${OPENCLAW_INSTALL_FRESHNESS_NPM_VERSION:-11.14.1}"
152157
UPDATE_BASELINE_VERSION="${OPENCLAW_INSTALL_SMOKE_UPDATE_BASELINE:-latest}"
153158
UPDATE_PACKAGE_SPEC="${OPENCLAW_INSTALL_SMOKE_UPDATE_PACKAGE_SPEC:-}"
154159
UPDATE_DIST_IMAGE="${OPENCLAW_INSTALL_SMOKE_UPDATE_DIST_IMAGE:-}"
@@ -169,6 +174,7 @@ UPDATE_TAG_URL=""
169174
UPDATE_DOCKER_HOST_ARGS=()
170175
NPM_CACHE_DIR="${OPENCLAW_INSTALL_SMOKE_NPM_CACHE_DIR:-}"
171176
NPM_CACHE_OWNED=0
177+
NPM_CACHE_PREPARED=0
172178
NPM_CACHE_DOCKER_ARGS=()
173179

174180
remove_owned_npm_cache() {
@@ -334,6 +340,9 @@ prepare_update_host_access() {
334340
}
335341

336342
prepare_npm_cache() {
343+
if [[ "$NPM_CACHE_PREPARED" == "1" ]]; then
344+
return
345+
fi
337346
if [[ -z "$NPM_CACHE_DIR" ]]; then
338347
NPM_CACHE_DIR="$(mktemp -d)"
339348
NPM_CACHE_OWNED=1
@@ -345,6 +354,7 @@ prepare_npm_cache() {
345354
-e npm_config_cache=/npm-cache
346355
-e NPM_CONFIG_CACHE=/npm-cache
347356
)
357+
NPM_CACHE_PREPARED=1
348358
}
349359

350360
start_update_server() {
@@ -447,6 +457,27 @@ else
447457
fi
448458
fi
449459

460+
if [[ "$SKIP_FRESHNESS" == "1" ]]; then
461+
echo "==> Skip installer npm freshness smoke (OPENCLAW_INSTALL_SMOKE_SKIP_FRESHNESS=1)"
462+
else
463+
prepare_npm_cache
464+
echo "==> Run installer npm freshness smoke"
465+
docker run --rm -t \
466+
--platform "$SMOKE_PLATFORM" \
467+
"${NPM_CACHE_DOCKER_ARGS[@]}" \
468+
-v "$ROOT_DIR/scripts/install.sh:/tmp/openclaw-install.sh:ro" \
469+
-e OPENCLAW_INSTALL_URL="$FRESHNESS_INSTALL_URL" \
470+
-e OPENCLAW_INSTALL_PACKAGE="$PACKAGE_NAME" \
471+
-e OPENCLAW_INSTALL_SMOKE_MODE=freshness \
472+
-e OPENCLAW_INSTALL_FRESHNESS_VERSION="${OPENCLAW_INSTALL_FRESHNESS_VERSION:-latest}" \
473+
-e OPENCLAW_INSTALL_FRESHNESS_MIN_RELEASE_AGE="$FRESHNESS_MIN_RELEASE_AGE" \
474+
-e OPENCLAW_INSTALL_FRESHNESS_NPM_VERSION="$FRESHNESS_NPM_VERSION" \
475+
-e OPENCLAW_NO_ONBOARD=1 \
476+
-e OPENCLAW_NO_PROMPT=1 \
477+
-e DEBIAN_FRONTEND=noninteractive \
478+
"$SMOKE_IMAGE"
479+
fi
480+
450481
LATEST_VERSION="${LATEST_VERSION:-}"
451482

452483
if [[ "$SKIP_NONROOT" == "1" ]]; then

0 commit comments

Comments
 (0)