#!/usr/bin/env bash # host 모드 러너에는 Node 가 없거나 낡아 있을 수 있다. # 러너에 설치된 더 새 Node 를 찾아 PATH 에 올리고, 그래도 안 되면 명확히 실패시킨다. set -euo pipefail MIN_MAJOR=20 add_path() { echo "$1" >> "${GITHUB_PATH:-/dev/null}"; export PATH="$1:$PATH"; } # 현재 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 이상을 설치해라. curl -fsSL https://fnm.vercel.app/install | bash -s -- --skip-shell fnm install 22 && fnm default 22 셸 rc 를 고치지 않아도 된다 — 이 스크립트가 설치 경로를 직접 찾는다. MSG exit 1 fi major="$(current_major)" if [ "$major" -lt "$MIN_MAJOR" ]; then cat >&2 </dev/null 2>&1; then corepack enable >/dev/null 2>&1 || true corepack prepare pnpm@10.5.2 --activate >/dev/null 2>&1 || true fi if ! command -v pnpm >/dev/null 2>&1; then echo "pnpm 을 확보하지 못했다. corepack 이 막혀 있으면 npm i -g pnpm@10.5.2 로 설치해라" >&2 exit 1 fi echo "node $(node -v) / pnpm $(pnpm -v) / npm $(npm -v)"