Node.js: node-sass/node-gyp 빌드 시 ‘Python not found’ 오류 해결하기
1. 문제 정의
Jenkins CI 환경에서 Node.js 프로젝트를 빌드할 때 갑자기 빌드가 실패하는 경우가 있습니다. 로컬 머신에서는 정상 동작하지만, 빌드 서버에서만 반복되는 다음과 같은 에러를 만나게 됩니다.
| |
이 문제는 StackOverflow에 475점으로 채택된 아주 흔한 빌드 오류입니다.
2. 원인 탐구
이 에러의 근본 원인을 이해하려면 의존성 체인을 봐야 합니다.
node-sass는 sass 컴파일러인 LibSass를 바이너리로 사용합니다.- 특정 버전(여기서는 node-sass v3.8.0)은 내부적으로
node-gypv3.5.0을 사용해 네이티브 모듈을 빌드합니다. node-gyp는 소스에서 네이티브 모듈을 컴파일할 때 빌드 도구(Python, C++ 컴파일러, MSBuild 등)를 요구합니다.
문헌에서 node-gyp의 전제 조건(prerequisite)은 Python이 설치되어 있어야 한다는 것이 명시적으로 확인됩니다. 문제의 사용자는 Jenkins 서버에 Python이 없어 PATH에서 python2를 찾지 못해 which 명령이 실패한 것입니다.
3. 근본 원인 분석
핵심 원인은 **’node-gyp가 빌드 시 요구하는 Python 의존성의 부재’**입니다.
- 원 질문의 로그에는
checking for Python executable "python2" in the PATH가 실패하는 것이 명확히 보입니다. node-sass는 인기 있는 순수 자바스크립트 모듈이지만, 설치 시 플랫폼용 사전 빌드(prebuilt) 바이너리를 자동 다운로드하려고 합니다. 그것이 실패하면 소스로 빌드하게 되고, 그 시점에 Python이 필요한 겁니다.- 따라서 이 오류가 떴다는 것은 “설치 서버가 사전 빌드 바이너리를 받지 못했고, 네이티브 빌드에 필요한 Python/빌드 체인도 없다"는 두 가지가 겹쳐 발생합니다. 로컬에 Python이 있다면 정상이라는 점이 해결 방향을 가리킵니다.
4. 코드 해결책
옵션 A — node-sass를 호환 버전으로 업데이트
StackOverflow 채택 답변에서는 다음을 권장합니다.
| |
node-sass 3.8.0은 Node 5를 지원합니다. Node 5는 이미 수명이 끝났으므로 버전을 맞추며, 만약 Node 8로 올리고 싶다면 에서node-sass@4.5.3이 필요합니다.
옵션 B — Node.js를 업그레이드
| |
Node 6 이상에서 최신 node-sass가 더 이상 레거시 node-gyp를 사용하지 않아 Python 2 의존성을 덜 요구합니다.
옵션 C — 빌드 환경에 Python 준비
Jenkins(빌드 서버)에 아래와 같은 전제를 갖춥니다.
- Python 2 설치 (node-gyp v3.5 요구)
- 윈도우라면 Visual Studio(C++ 빌드 도구) 또는 MSBuild 필요
- 이후
npm rebuild node-sass로 네이티브 모듈 재빌드
| |
5. 향후 예방 조치
- 레거시
node-sass대신 최신 빌드 체인으로 마이그레이션하면 더욱 안정적입니다. 현대 프로젝트에서는sass(Dart Sass) 호환 래퍼로 전환하거나 CI 이미지에 Python 빌드 체인을 사전에 포함합니다. - 빌드 서버 Docker 이미지에
python2, 빌드 도구를 미리 넣고 CI 파일에 명시적으로 설치하십시오. npm ci(잠금 파일 기반)를 쓰면 설치 중 바이너리 재다운로드 오류를 초기 발견할 수 있습니다.
출처: StackOverflow — Node.js: Python not found exception due to node-sass and node-gyp