Cannot find module … in Github Actions (ubuntu/latest)

GitHub Actions Ubuntu 환경에서만 Cannot find module 오류가 발생할 때 파일명 대소문자와 경로를 점검하는 방법.

GitHub Actions, CI/CD, TypeScript, Linux

Cannot find module

MacOS에서 Next 애플리케이션을 개발하던 중 커밋을 푸시하는 과정에서, 구축해둔 Github Actions를 통한 테스트 자동화 워크플로우를 통과하지 못했는데, 단순 작성한 테스트를 통과하지 못한 것이 아니라 아예 모듈을 찾지 못했다며 에러가 발생했다.

로컬에서의 테스트. 문제없이 통과했다.

로컬 머신에서 직접 테스트를 수행한 결과는 몇 번의 반복에도 모두 통과했다. 처음에는 tsconfig.js의 paths 경로 문제라고 생각하여, ts-jest 같은 옵션을 채용해보기도 하고, 경로 축약 표현을 사용하지 않고 상대 경로로 적어보기도 했으나 해결할 수 없었다.

runs on ubuntu-latest

원인은 Github Actions에서 사용하고 있는 Ubuntu 운영체제와 로컬 머신인 MacOS의 파일 시스템 차이가 문제였다. 문제가 발생한 커밋을 푸시할 때, 몇 의 폴더와 파일의 이름을 변경한 적이 있었다.

그런데 Ubuntu는 대소문자를 구분하는 파일 시스템을 사용하고, MacOS는 그렇지 않기 때문에 발생하는 괴리에서 오는 문제였던 것이다.

$ git mv [origin] [renamed]

위의 명령어를 통해 문제가 되는 파일의 이름을 직접 수정해줄 수 있다.

하지만 추적이 불가능한 최악의 경우, 위의 솔루션으로 문제를 해결할 수 없다. 이에 대해 작은 꼼수가 있는데, 원인으로 보이는 파일들을 프로젝트 밖으로 이전시킨 상태의 커밋과 앞선 파일들을 다시 원상복구 시킨 상태의 커밋을 푸시하면, 해당 파일이 새로 기록되므로, 대소문자 구별에 따른 모듈 탐색 실패 문제를 해결할 수 있다.


원문: Medium