파트 내에서 사용할 CI 환경 구성 중 Embedded Redis를 사용해 테스트를 실행하는 모듈의 테스트가 지속적으로 실패하는 문제를 겪었습니다.
로컬이나 다른 이미지에서는 빌드가 성공했기 때문에 관련 내용을 별도 찾아볼 필요 없이 이미지 변경으로 해결은 가능했지만 왜 해당 이미지에서만 테스트가 구동되지 않는지 관련 내용을 찾아보고 정리했습니다.
실패한 이미지에서 발생한 에러 메세지는 아래와 같습니다.
2021-03-29T21:23:49.643+0900 [DEBUG] [TestEventLogger] at java.lang.Thread.run(Thread.java:748)
2021-03-29T21:23:49.643+0900 [DEBUG] [TestEventLogger]
2021-03-29T21:23:49.643+0900 [DEBUG] [TestEventLogger] Caused by:
2021-03-29T21:23:49.643+0900 [DEBUG] [TestEventLogger] java.io.IOException: Cannot run program "/tmp/1617020629467-0/redis-server-3.0.7" (in directory "/tmp/1617020629467-0"): error=2, No such file or directory
2021-03-29T21:23:49.643+0900 [DEBUG] [TestEventLogger] at java.lang.ProcessBuilder.start(ProcessBuilder.java:1048)
2021-03-29T21:23:49.643+0900 [DEBUG] [TestEventLogger] at redis.embedded.AbstractRedisInstance.start(AbstractRedisInstance.java:34)
2021-03-29T21:23:49.643+0900 [DEBUG] [TestEventLogger] ... 85 more
2021-03-29T21:23:49.643+0900 [DEBUG] [TestEventLogger]
2021-03-29T21:23:49.643+0900 [DEBUG] [TestEventLogger] Caused by:
2021-03-29T21:23:49.643+0900 [DEBUG] [TestEventLogger] java.io.IOException: error=2, No such file or directory
No such file or directory
메세지만 보고 바이너리를 해당 경로에 복사하거나 하는 과정이 누락된 것이라고 생각했습니다.
하지만 실제 해당 경로를 체크했을 때 실제 바이너리 파일은 정상적으로 해당 경로에 위치하고 있었습니다.
삽질을 계속하다가 해당 이미지에서 직접 바이너리를 실행시켜보니 아래와 같이 바이너리 파일이
존재하는데도 아래와 같이 No such file or directory
에러가 노출되는것을 확인할 수 있었습니다.
bash-4.4# uname -a
Linux 490bc54ba0f4 4.14.214-160.339.amzn2.x86_64 #1 SMP Sun Jan 10 05:53:05 UTC 2021 x86_64 Linux
bash-4.4# ls -al
-rwxr-xr-x 1 root root 4311368 Mar 29 20:35 redis-server-3.0.7
-rwxr-xr-x 1 root root 927664 Mar 29 20:35 redis-server-3.0.7-darwin
bash-4.4# ./redis-server-3.0.7
bash: ./redis-server-3.0.7: No such file or directory
https://askubuntu.com/questions/133389/no-such-file-or-directory-but-the-file-exists
파일을 찾지 못하는 경우 뿐만 아니라 운영체제 별 필요한 런타임 구성 요소가 누락되는
경우도 No such file or directory
라는 형태로 에러가 출력될 수 있다는 것을 알수 있었습니다.
위 에러가 발생한 케이스는 해당 Embedded Redis 라이브러리에서 사용하는 Redis 바이너리 자체가 alpine에서 구동되지 않는 문제라 결국은 CI에 사용하는 이미지를 교체해 해결했습니다.