Skip to content

Commit e5703c8

Browse files
committed
fix(install): correct version detection for multi-version Node.js
When upgrading a specific Node.js version (e.g., node@24), the script now correctly: - Uses NODE_VERSION env var to determine which version to check - Detects version of the specific major version, not the default - Reports correct before/after versions using nvm version lookup - Does not change nvm default alias for multi-version installs This fixes the false "upgrade did not succeed" warning when upgrading node@24 while node@25 is the default.
1 parent 7c9a625 commit e5703c8

1 file changed

Lines changed: 89 additions & 37 deletions

File tree

scripts/install_node.sh

Lines changed: 89 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,15 @@ DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
66
. "$DIR/lib/install_strategy.sh"
77

88
ACTION="${1:-install}"
9-
# Channel: 'node' (current latest) or 'lts'. Default to 'node' to match audit latest
10-
NODE_CHANNEL="${NODE_CHANNEL:-node}"
9+
# Channel: 'node' (current latest), 'lts', or specific major version (24, 25, etc.)
10+
# NODE_VERSION takes precedence for multi-version installs (e.g., NODE_VERSION=24)
11+
NODE_CHANNEL="${NODE_VERSION:-${NODE_CHANNEL:-node}}"
12+
13+
# For multi-version display
14+
DISPLAY_NAME="node"
15+
if [ -n "${NODE_VERSION:-}" ]; then
16+
DISPLAY_NAME="node@${NODE_VERSION}"
17+
fi
1118

1219
ensure_nvm() {
1320
if ! have nvm; then
@@ -16,47 +23,72 @@ ensure_nvm() {
1623
ensure_nvm_loaded
1724
}
1825

26+
# Get version of a specific Node.js major version (e.g., "24" -> "v24.13.0")
27+
get_specific_node_version() {
28+
local channel="$1"
29+
ensure_nvm_loaded
30+
# nvm version returns the installed version for a channel/alias
31+
local ver
32+
ver="$(nvm version "$channel" 2>/dev/null || true)"
33+
if [ -n "$ver" ] && [ "$ver" != "N/A" ]; then
34+
echo "$ver"
35+
fi
36+
}
37+
1938
install_node() {
2039
ensure_nvm
2140
nvm install "$NODE_CHANNEL"
22-
# Resolve the concrete version (e.g. v24.8.0) and pin default to it
23-
local resolved
24-
resolved="$(nvm version "$NODE_CHANNEL" 2>/dev/null || true)"
25-
if [ -n "$resolved" ] && [ "$resolved" != "N/A" ]; then
26-
nvm alias default "$resolved" || true
27-
nvm use "$resolved" || nvm use default || true
41+
42+
# Only set default if this is NOT a multi-version install
43+
# (multi-version = specific major version like 24, 25)
44+
if [ -z "${NODE_VERSION:-}" ]; then
45+
# Resolve the concrete version (e.g. v24.8.0) and pin default to it
46+
local resolved
47+
resolved="$(nvm version "$NODE_CHANNEL" 2>/dev/null || true)"
48+
if [ -n "$resolved" ] && [ "$resolved" != "N/A" ]; then
49+
nvm alias default "$resolved" || true
50+
nvm use "$resolved" || nvm use default || true
51+
else
52+
# Fallback to channel if resolution failed for any reason
53+
nvm alias default "$NODE_CHANNEL" || true
54+
nvm use default || true
55+
fi
56+
corepack enable 2>/dev/null || true
57+
npm install -g npm@latest || true
58+
corepack prepare pnpm@latest --activate 2>/dev/null || true
59+
corepack prepare yarn@1 --activate 2>/dev/null || true
60+
npm install -g eslint prettier || true
2861
else
29-
# Fallback to channel if resolution failed for any reason
30-
nvm alias default "$NODE_CHANNEL" || true
31-
nvm use default || true
62+
echo "=> Node.js version $NODE_VERSION has been successfully installed"
3263
fi
33-
corepack enable 2>/dev/null || true
34-
npm install -g npm@latest || true
35-
corepack prepare pnpm@latest --activate 2>/dev/null || true
36-
corepack prepare yarn@1 --activate 2>/dev/null || true
37-
npm install -g eslint prettier || true
3864
}
3965

4066
update_node() {
4167
ensure_nvm
4268
nvm install "$NODE_CHANNEL"
43-
# Resolve and pin default to the exact installed version
44-
local resolved
45-
resolved="$(nvm version "$NODE_CHANNEL" 2>/dev/null || true)"
46-
if [ -n "$resolved" ] && [ "$resolved" != "N/A" ]; then
47-
nvm alias default "$resolved" || true
48-
nvm use "$resolved" || nvm use default || true
69+
70+
# Only set default and update global packages if NOT a multi-version install
71+
if [ -z "${NODE_VERSION:-}" ]; then
72+
# Resolve and pin default to the exact installed version
73+
local resolved
74+
resolved="$(nvm version "$NODE_CHANNEL" 2>/dev/null || true)"
75+
if [ -n "$resolved" ] && [ "$resolved" != "N/A" ]; then
76+
nvm alias default "$resolved" || true
77+
nvm use "$resolved" || nvm use default || true
78+
else
79+
nvm alias default "$NODE_CHANNEL" || true
80+
nvm use default || true
81+
fi
82+
# Ensure corepack shims are present
83+
corepack enable 2>/dev/null || true
84+
npm install -g npm@latest || true
85+
# Update pnpm and yarn via corepack; fall back to npm global if corepack unavailable
86+
corepack prepare pnpm@latest --activate 2>/dev/null || npm install -g pnpm@latest || true
87+
corepack prepare yarn@1 --activate 2>/dev/null || npm install -g yarn@latest || true
88+
npm update -g eslint prettier || true
4989
else
50-
nvm alias default "$NODE_CHANNEL" || true
51-
nvm use default || true
90+
echo "=> Node.js version $NODE_VERSION has been updated"
5291
fi
53-
# Ensure corepack shims are present
54-
corepack enable 2>/dev/null || true
55-
npm install -g npm@latest || true
56-
# Update pnpm and yarn via corepack; fall back to npm global if corepack unavailable
57-
corepack prepare pnpm@latest --activate 2>/dev/null || npm install -g pnpm@latest || true
58-
corepack prepare yarn@1 --activate 2>/dev/null || npm install -g yarn@latest || true
59-
npm update -g eslint prettier || true
6092
}
6193

6294
uninstall_node() {
@@ -67,18 +99,38 @@ uninstall_node() {
6799

68100
reconcile_node() {
69101
local before after path
70-
before="$(command -v node >/dev/null 2>&1 && node -v || true)"
102+
103+
# For multi-version installs, check the specific version being installed
104+
if [ -n "${NODE_VERSION:-}" ]; then
105+
before="$(get_specific_node_version "$NODE_CHANNEL")"
106+
else
107+
before="$(command -v node >/dev/null 2>&1 && node -v || true)"
108+
fi
109+
71110
if ! prefers_nvm_node; then
72111
apt_remove_if_present nodejs npm || true
73112
install_node
74113
else
75114
update_node
76115
fi
77-
after="$(command -v node >/dev/null 2>&1 && node -v || true)"
78-
path="$(command -v node 2>/dev/null || true)"
79-
printf "[%s] before: %s\n" "node" "${before:-<none>}"
80-
printf "[%s] after: %s\n" "node" "${after:-<none>}"
81-
if [ -n "$path" ]; then printf "[%s] path: %s\n" "node" "$path"; fi
116+
117+
# Check version of the specific channel we installed
118+
if [ -n "${NODE_VERSION:-}" ]; then
119+
after="$(get_specific_node_version "$NODE_CHANNEL")"
120+
# Get path to the specific version's node binary
121+
local nvm_dir="${NVM_DIR:-$HOME/.nvm}"
122+
local resolved_ver="$(nvm version "$NODE_CHANNEL" 2>/dev/null || true)"
123+
if [ -n "$resolved_ver" ] && [ "$resolved_ver" != "N/A" ]; then
124+
path="$nvm_dir/versions/node/$resolved_ver/bin/node"
125+
fi
126+
else
127+
after="$(command -v node >/dev/null 2>&1 && node -v || true)"
128+
path="$(command -v node 2>/dev/null || true)"
129+
fi
130+
131+
printf "[%s] before: %s\n" "$DISPLAY_NAME" "${before:-<none>}"
132+
printf "[%s] after: %s\n" "$DISPLAY_NAME" "${after:-<none>}"
133+
if [ -n "$path" ] && [ -x "$path" ]; then printf "[%s] path: %s\n" "$DISPLAY_NAME" "$path"; fi
82134

83135
refresh_snapshot "node"
84136
}

0 commit comments

Comments
 (0)