Jenkins alpine 컨테이너에서 NodeJS 프로젝트를 빌드하려는데 오류가 생기나요? Jenkins alpine 이미지를 활용해서 Jenkins를 구동하지 말아야 하는 이유를 설명해 드립니다.
목차
Jenkins alpine 이미지 사용 비추천
결론부터 일단 말씀드리면, Jenkins를 Docker로 띄워서 사용할 것이고, NodeJS 프로젝트를 빌드할 계획이라면 Alpine Jenkins 도커 이미지를 사용하지 마시길 권합니다.
이유: musl-libc 이슈
alpine은 경량 musl-libc 라이브러리를 사용하는데, Jenkins의 NodeJS 플러그인은 glibc로 컴파일 되어 있다고 합니다. 굳이 alpine 이미지를 사용해야 한다면 플러그인 소스 코드를 구해서 musl-libc로 컴파일하고 설치하면 될 수도 있겠지만, 매우 귀찮은 작업이 될 수 있습니다.
저의 경우는 NVM Wrapper 플러그인과 NodeJS 플러그인을 모두 Jenkins에 설치해서 시도해 봤는데, 플러그인 설치와 설정까지는 정상적으로 되는데, 결정적으로 실행이 안 됩니다. node 명령어를 실행하면, Not Found를 외치며 실행되지 않습니다.
심지어 node 파일이 있는 디렉토리까지 찾아가서 ./node를 입력해 보았지만 찾을 수 없다고 합니다. 정말 황당했지만, 어쩌겠습니까.
해결책
Debian 기반의 Jenkins 이미지 활용: 추천
아래와 같이 Debian 기반의 도커 이미지로 Jenkins를 사용하면 아무 문제 없이 해당 플러그인을 사용할 수 있습니다.
docker pull jenkins/jenkins:lts-jdk11
ShellScriptAlpine에 Glibc를 설치
Alpine 리눅스에 gblic를 설치하는 것이 하나의 방법이긴 하지만, 이미지 재구성이 필요하고 Alpine을 사용하는 이유가 사라지게 됩니다. 그럴 바에야 차라리 Debian 이미지를 사용하는 편이 더 나아 보입니다.
Alpine에서 플러그인 소스 컴파일
플러그인 소스 코드를 다운 받아서 musl-libc 기반으로 컴파일을 새로 한 후 수동 설치하는 방법입니다. 이와 같은 문제가 생기는 플러그인들을 모두 일일히 컴파일 하는 건 꽤 고단한 작업이 될 수 있습니다. 서버 자원이 너무 부족해서 꼭 alpine linux를 사용해야 하는 경우가 아니라면, Jenkins 구동은 Debian 이미지 사용하시길 권합니다.
관련 링크
참고했던 자료를 아래에 링크 걸어놓았습니다. Stackoverflow의 “Nodejs with jenkins plugin not executable in alpine image and displays “symbol not found” 답글 달아주신 valiano님 고맙습니다.