Jenkins pipeline 배포 시 Docker로 빌드하기. (Node.js not supported)

작성 : 2024-03-26수정 : 2024-03-26

목차 펼치기

머리말

Astro 프레임워크로 개발한 프로젝트를 S3에 정적 사이트로 배포하며 지속적 통합 및 배포 도구로 Jenkins pipeline을 사용하면서 발생한 트러블슈팅을 해결한 작업기다. Jenkins의 Node.js 버전과 배포할 프로젝트가 요구하는 버전이 호환되지 않는 상황을 Docker를 이용하는 것으로 해결했다.


문제 상황

bash
1Node.js v16.20.2 is not supported by Astro!
2Please upgrade Node.js to a supported version: ">=18.14.1"
  1. 배포 파이프라인을 구성할 프로젝트는 Astro 프레임워크로 개발되었다.

  2. Astro 프레임워크는 최소 Node.js

    v18.14.1

    이상을 요구한다.

  3. Jenkins 버전은

    v16.20.2

    로 Astro 프레임워크의 요구사항을 충족하지 못해서 빌드 시 오류가 발생한다.


Jenkins의 Node.js 버전을 업그레이드하는 것으로 해결할 수도 있지만, 이 방법은 다른 빌드 환경에도 영향을 줄 수 있다. 그렇다면 Jenkins의 Node.js 버전을 업그레이드하지 않고 해결하려면 어떻게 해야할까?


해결 방법

  1. Global Tool Configuariton을 이용해서 pipeline 환경의 버전을 업그레이드하는 방법

  2. Docker를 이용해서 빌드 환경의 버전을 업그레이드하는 방법

위 두 가지 방법이 있는데, 1번을 시도했다가 발생한 GLIBC 호환 오류로 인해 최종적으로 2번을 통해 해결했다. 1, 2번 진행한 내용 모두 아래에 서술한다.


1. Global Tool Configuration 이용하기

Jenkins의 NodeJS Tool을 이용하면 pipeline이 실행되는 환경을 설정할 수 있다.



[Jenkins Management] - [Tools] - [NodeJS installations] - [Add NodeJS] 에서 사용할 버전에 맞는 NodeJS를 생성하고, 이 이름을 스크립트 상단에 선언해주면 된다.


하지만 이 경우 pipeline 버전이 Jenkins 버전보다 높아져서 Jenkins 내 GLIBC 라이브러리가 호환되지 않는 이슈가 발생했다.


bash
1node: /lib64/libm.so.6: version `GLIBC_2.27' not found (required by node)
2node: /lib64/libc.so.6: version `GLIBC_2.28' not found (required by node)

처음에는 이 방법을 통해 해결하려고 했는데, Astro의 버전에 맞추면 Jenkins가 호환되지 않고, Jenkins에 맞추면 Astro가 빌드되지 않는 상황이 되어버린 것이다.


2. 프로젝트 빌드에 Docker 이용하기

다시 문제를 살펴보면, “Node.js가 호환되지 않아 프로젝트를

빌드할 수 없다.

”는 점이다. 이를 해결하기 위해 다시 찾아보니 Docker를 이용하면 빌드 단계에서만 다른 환경을 제공해줄 수 있다는 것을 알게 되었다. 유레카!


Jenkins 서버에 Docker가 설치되어 있으면, Docker hub에서 제공해주는 태그를 통해 스크립트에서 쉽게 바로 사용할 수 있었다.

bash
1docker.image('node:18-bullseye').inside {
2	...
3}

Node.js 이미지 태그는

Docker Hub - Node

에서 확인할 수 있다. 여기서는 Astro 프레임워크의 요구사항에 맞춰

node:18-bullseye

를 사용했다.


이후 정상적으로 빌드가 진행되었으나,

EACCESS: permission denied

오류가 발생했다.

bash
1EACCES: permission denied, mkdir '/.config/astro'

이 오류는 Docker 컨테이너 빌드 단계에서, 빌드 관련 디렉터리를 생성할 권한이 없기 때문에 발생한 오류다.


bash
1// Before
2docker.image('node:18-bullseye').inside {
3	...
4}
5
6// After
7docker.image('node:18-bullseye').inside('-u root --workdir /app') {
8	...
9}

컨테이너를 루트 사용자로 실행하도록 설정하고, 컨테이너 내 작업 디렉터리 경로를 root가 아닌 하위 디렉터리로 변경해서 해결했다. 작업 디렉터리 자체가 변경된 것이므로 이후 Deploy 단계에서 상대 경로를 사용하고 있다면 별도로 수정하지 않아도 된다. 절대 경로를 사용하고 있다면,

--workdir {path}

에 맞게 수정해야한다.


이후 정상적으로 빌드가 진행되어 S3 업로드, Cloud Front 캐시 무효화 설정까지 진행할 수 있었다. 😌

Wanna get in touch?

All Icons byiconiFy