Huny's Dev Blog

Github actions node20 glibc 종속성 문제 우회하기

GitHub Actions에서 container를 사용해 CentOS 등 구버전 리눅스를 기반으로 동작할 때, 액션 실행 과정에서 사용하는 /__e/node20/bin/node가 glibc 버전 문제로 오류를 일으킨다. 이를 우회하기 위해 container 설정에서 volumes를 사용해 /__e/node20/bin을 다른 디렉터리와 마운트해 실제 /__e/node20/bin/node가 내부에서 보이지 않도록 만들고, 이후 container 내의 유효한 Node 바이너리에 심볼릭 링크를 연결하여 GitHub Actions가 문제없이 동작하도록 한다.
Hun Jang
Hun JangFeb 16, 2025
Github actions node20 glibc 종속성 문제 우회하기

github actions에서 runs-on 을 ubuntu-latest로 사용하는 경우, 이러한 문제가 발생하지 않지만, container를 직접 사용하는 경우, 예를 들어 runs-on은 ubuntu-latest지만 container의 image는 centos:7과 같이 사용하는 경우 node20 glibc 상위 버전 종속성 에러가 발생한다.


actions에서는 container를 생성(create)하는 과정에서 docker 명령에 필요한 옵션을 설정한다. 이 때 필요한 실행파일들을 외부에서 container 내부에서 사용하기 위해 /home/runner 하위의 디렉터리를 container의 특정 위치에 마운트(-v 옵션) 하는데, 이때 마운트하는 디렉터리 중 하나가 /home/runner/runners/2.321.0/externals 이다. 이 디렉터리는 container의 /__e 에 마운트 되며 read-only filesystem으로 인식되므로 actions의 yml에서 run으로 해당 디렉터리를 변조하는 것은 불가능하다.

container가 정상적으로 실행되면 이후에 actions에서 추가하여 사용하는 일반적인 action 중에 하나인 checkout, upload-artifact 등은 /__e/node20/bin/node 를 사용하는데 이 때 이 node의 라이브러리 종속성 에러가 발생한다.

이를 회피 하기 위해, container/image 를 지정하고, container/volumes를 지정하여 node20/bin을 다른 디렉터리로 마운트 한다.

예) 경로를 꼭 /home/runner/work/_temp 로 지정하지 않아도 되며, 실제 존재하는 경로로 지정하면 된다. 목적은 /__e/node20/bin/node가 마운트되지 않도록 하는 것이다.

# 이상 생략

jobs:
  build:
    runs-on: ubuntu-latest
    container:
      image: centos:7
      volumes: # 강제로 node20을 사용하지 않도록 우회한다.
        - '/home/runner/work/_temp:/__e/node20/bin'

# 이하 생략
yaml

이후에는 container 내에 위치한 node로 steps의 가장 상단에 소프트 링크를 생성하도록 명령을 추가해주면, github actions에서는 해당 실행파일로 필요한 action을 실행하게 된다.

 # 이상 생략
 
    steps:
    - name: Node Version
      run: |
        node --version
        ln -sf $(which node) /__e/node20/bin/node
        /__e/node20/bin/node --version

# 이하 생략
yaml