verify-node: Node 가 없을 때가 아니라 모자랄 때 대체 경로를 찾는다
Some checks failed
ci / build (push) Failing after 31s
Some checks failed
ci / build (push) Failing after 31s
러너에 시스템 Node v18 이 있고 fnm 으로 v22 를 넣었는데도 v18 을 보고 실패했다. 스크립트가 `command -v node` 가 실패할 때만 nvm/fnm/volta 를 훑었기 때문이다. 낡은 Node 가 PATH 에 있으면 그 탐색을 통째로 건너뛴다. 없을 때가 아니라 모자랄 때 찾도록 고쳤고, 후보 경로에서도 버전을 확인한다 (낡은 nvm 버전이 먼저 잡히지 않게). ~/.fnm 과 /usr/local/bin 도 후보에 넣었다. 실패 메시지도 고쳤다. 새 Node 가 있는데도 못 찾는 경우를 위해 훑는 경로 목록을 그대로 보여준다.
This commit is contained in:
parent
98d3aaf236
commit
9093128f5e
1 changed files with 49 additions and 10 deletions
|
|
@ -1,32 +1,71 @@
|
||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
# host 모드 러너에는 Node 가 없을 수 있다. 여기서 명확히 실패시켜 CI 로그를 읽을 수 있게 한다.
|
# host 모드 러너에는 Node 가 없거나 낡아 있을 수 있다.
|
||||||
# 필요하면 러너에 nvm/fnm 으로 설치된 Node 를 PATH 에 올려준다.
|
# 러너에 설치된 더 새 Node 를 찾아 PATH 에 올리고, 그래도 안 되면 명확히 실패시킨다.
|
||||||
set -euo pipefail
|
set -euo pipefail
|
||||||
|
|
||||||
MIN_MAJOR=20
|
MIN_MAJOR=20
|
||||||
|
|
||||||
add_path() { echo "$1" >> "${GITHUB_PATH:-/dev/null}"; export PATH="$1:$PATH"; }
|
add_path() { echo "$1" >> "${GITHUB_PATH:-/dev/null}"; export PATH="$1:$PATH"; }
|
||||||
|
|
||||||
if ! command -v node >/dev/null 2>&1; then
|
# 현재 PATH 의 Node 메이저 버전. 없으면 0.
|
||||||
# 러너에 흔히 있는 위치를 훑는다
|
current_major() {
|
||||||
for cand in "$HOME/.nvm/versions/node"/*/bin "$HOME/.local/share/fnm/node-versions"/*/installation/bin "$HOME/.volta/bin"; do
|
command -v node >/dev/null 2>&1 || { echo 0; return; }
|
||||||
[ -d "$cand" ] && add_path "$cand" && break
|
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
|
done
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
if [ "$(current_major)" -lt "$MIN_MAJOR" ]; then
|
||||||
|
adopt_newer_node || true
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if ! command -v node >/dev/null 2>&1; then
|
if ! command -v node >/dev/null 2>&1; then
|
||||||
cat >&2 <<'MSG'
|
cat >&2 <<'MSG'
|
||||||
Node 를 찾을 수 없다.
|
Node 를 찾을 수 없다.
|
||||||
|
|
||||||
이 워크플로는 self-hosted host 러너에서 돈다. 러너 머신에 Node 20 이상을 설치하고
|
이 워크플로는 self-hosted host 러너에서 돈다. 러너 머신에 Node 20 이상을 설치해라.
|
||||||
러너 사용자의 PATH 에 올려라. 예: fnm install 22 && fnm default 22
|
curl -fsSL https://fnm.vercel.app/install | bash -s -- --skip-shell
|
||||||
|
fnm install 22 && fnm default 22
|
||||||
|
셸 rc 를 고치지 않아도 된다 — 이 스크립트가 설치 경로를 직접 찾는다.
|
||||||
MSG
|
MSG
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
major="$(node -p 'process.versions.node.split(".")[0]')"
|
major="$(current_major)"
|
||||||
if [ "$major" -lt "$MIN_MAJOR" ]; then
|
if [ "$major" -lt "$MIN_MAJOR" ]; then
|
||||||
echo "Node $MIN_MAJOR 이상이 필요하다 (현재 $(node -v))" >&2
|
cat >&2 <<MSG
|
||||||
|
Node $MIN_MAJOR 이상이 필요하다 (현재 $(node -v)).
|
||||||
|
|
||||||
|
러너에 새 Node 가 설치돼 있는데도 이 메시지가 나오면, 이 스크립트가 훑는 경로 밖에
|
||||||
|
있는 것이다. 아래 중 한 곳에 두거나 러너 사용자의 PATH 에 올려라.
|
||||||
|
~/.nvm/versions/node/*/bin
|
||||||
|
~/.local/share/fnm/node-versions/*/installation/bin
|
||||||
|
~/.volta/bin
|
||||||
|
MSG
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue