From 9093128f5e954955e98380ce659dfb3bca1c916f Mon Sep 17 00:00:00 2001 From: Yun Chan Date: Thu, 20 Aug 2026 17:13:12 +0900 Subject: [PATCH] =?UTF-8?q?verify-node:=20Node=20=EA=B0=80=20=EC=97=86?= =?UTF-8?q?=EC=9D=84=20=EB=95=8C=EA=B0=80=20=EC=95=84=EB=8B=88=EB=9D=BC=20?= =?UTF-8?q?=EB=AA=A8=EC=9E=90=EB=9E=84=20=EB=95=8C=20=EB=8C=80=EC=B2=B4=20?= =?UTF-8?q?=EA=B2=BD=EB=A1=9C=EB=A5=BC=20=EC=B0=BE=EB=8A=94=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 러너에 시스템 Node v18 이 있고 fnm 으로 v22 를 넣었는데도 v18 을 보고 실패했다. 스크립트가 `command -v node` 가 실패할 때만 nvm/fnm/volta 를 훑었기 때문이다. 낡은 Node 가 PATH 에 있으면 그 탐색을 통째로 건너뛴다. 없을 때가 아니라 모자랄 때 찾도록 고쳤고, 후보 경로에서도 버전을 확인한다 (낡은 nvm 버전이 먼저 잡히지 않게). ~/.fnm 과 /usr/local/bin 도 후보에 넣었다. 실패 메시지도 고쳤다. 새 Node 가 있는데도 못 찾는 경우를 위해 훑는 경로 목록을 그대로 보여준다. --- build/ci/verify-node.sh | 59 ++++++++++++++++++++++++++++++++++------- 1 file changed, 49 insertions(+), 10 deletions(-) diff --git a/build/ci/verify-node.sh b/build/ci/verify-node.sh index 1ffdaaf..a749005 100755 --- a/build/ci/verify-node.sh +++ b/build/ci/verify-node.sh @@ -1,32 +1,71 @@ #!/usr/bin/env bash -# host 모드 러너에는 Node 가 없을 수 있다. 여기서 명확히 실패시켜 CI 로그를 읽을 수 있게 한다. -# 필요하면 러너에 nvm/fnm 으로 설치된 Node 를 PATH 에 올려준다. +# host 모드 러너에는 Node 가 없거나 낡아 있을 수 있다. +# 러너에 설치된 더 새 Node 를 찾아 PATH 에 올리고, 그래도 안 되면 명확히 실패시킨다. set -euo pipefail MIN_MAJOR=20 add_path() { echo "$1" >> "${GITHUB_PATH:-/dev/null}"; export PATH="$1:$PATH"; } -if ! command -v node >/dev/null 2>&1; then - # 러너에 흔히 있는 위치를 훑는다 - for cand in "$HOME/.nvm/versions/node"/*/bin "$HOME/.local/share/fnm/node-versions"/*/installation/bin "$HOME/.volta/bin"; do - [ -d "$cand" ] && add_path "$cand" && break +# 현재 PATH 의 Node 메이저 버전. 없으면 0. +current_major() { + command -v node >/dev/null 2>&1 || { echo 0; return; } + node -p 'process.versions.node.split(".")[0]' 2>/dev/null || echo 0 +} + +# 러너에 흔히 있는 위치를 훑어 조건을 만족하는 Node 를 찾는다. +# +# 이 스크립트는 원래 "Node 가 아예 없을 때"만 여기를 훑었다. 그래서 시스템에 +# 낡은 Node 가 깔려 있으면 `command -v node` 가 성공해버려 탐색을 건너뛰고, +# 바로 아래 버전 검사에서 죽었다. 실측에서 그랬다 — 러너에 v18 이 있고 +# fnm 으로 v22 를 넣었는데도 v18 을 보고 실패했다. +# **없을 때가 아니라 모자랄 때 찾아야 한다.** +adopt_newer_node() { + local cand v + for cand in \ + "$HOME/.nvm/versions/node"/*/bin \ + "$HOME/.local/share/fnm/node-versions"/*/installation/bin \ + "$HOME/.fnm/node-versions"/*/installation/bin \ + "$HOME/.volta/bin" \ + /usr/local/bin + do + [ -x "$cand/node" ] || continue + v="$("$cand/node" -p 'process.versions.node.split(".")[0]' 2>/dev/null || echo 0)" + if [ "$v" -ge "$MIN_MAJOR" ]; then + add_path "$cand" + return 0 + fi done + return 1 +} + +if [ "$(current_major)" -lt "$MIN_MAJOR" ]; then + adopt_newer_node || true fi if ! command -v node >/dev/null 2>&1; then cat >&2 <<'MSG' Node 를 찾을 수 없다. -이 워크플로는 self-hosted host 러너에서 돈다. 러너 머신에 Node 20 이상을 설치하고 -러너 사용자의 PATH 에 올려라. 예: fnm install 22 && fnm default 22 +이 워크플로는 self-hosted host 러너에서 돈다. 러너 머신에 Node 20 이상을 설치해라. + curl -fsSL https://fnm.vercel.app/install | bash -s -- --skip-shell + fnm install 22 && fnm default 22 +셸 rc 를 고치지 않아도 된다 — 이 스크립트가 설치 경로를 직접 찾는다. MSG exit 1 fi -major="$(node -p 'process.versions.node.split(".")[0]')" +major="$(current_major)" if [ "$major" -lt "$MIN_MAJOR" ]; then - echo "Node $MIN_MAJOR 이상이 필요하다 (현재 $(node -v))" >&2 + cat >&2 <