현재 서비스는 Github Actions를 사용해서 CI/CD를 구성했다. 이전에는 테스트 코드를 작성하지 않았기에 '/gradlew build -x test'를 사용해서 테스트 없이 build를 진행하였는데, 이번에 테스트 코드를 간단하게 작성하면서 '/gradlew build'로 바꾸어서 빌드 단계에서 테스트까지 진행하도록 수정했다.
문제 발생
역시나 첫 try 한 build는 실패. infra는 한 번에 성공하면 infra가 아니지 ㅋㅋ..
'java.lang.IllegalStateException at DefaultCacheAwareContextLoaderDelegate' 에러가 발생하면서 빌드에 실패했다.
원인 파악
구글링을 해본 결과 'Caused by: org.hibernate.HibernateException at DialectFactoryImpl.java' 부분이 문제인걸 알 수 있다. DialectFactoryImpl에서 HibernateException이 발생했다는 건데.. 그냥 DB 설정 문제라고 생각하면 된다.
그렇다면 분명 로컬에서는 build가 잘 되었는데 왜 remote 환경에서는 안되는걸까?
이는 Github Actions의 workflow가 어떤 환경에서 실행되는지를 알아봐야 한다. Github에서는 workflow를 실행하는 Runner라는 호스팅 가상 머신을 제공하는데, 이 가상의 환경에서 workflow를 사용하여 스크립트 및 셸 명령을 실행시킨다.
그렇다면 runner라는 가상 머신에서 내가 업로드한 코드가 gradle build를 성공하면 배포가 된다 생각하면 되는데, 이 경우는 runner에서 build가 실패했다고 볼 수 있다.
이제 어디서 문제가 생겼는지 파악했으니 하나씩 점검을 해보자.
문제 해결
- application.yml, application.properties 확인
- 설정 파일에서 db 연결 설정이 정확히 되었는지 확인한다 (ex. DB 스키마, user, password 등)
- 설정 파일이 git ignore 처리되어서 아예 깃허브에 올라가 있지 않은 경우도 있으니 확인해봐야 한다
- 만약 git ignore에 설정파일을 추가했다면, settings-> secrets -> actions로 따로 설정하길 바란다 - workflow 스크립트 확인
- 설정이 잘 되어있다면 workflow 스크립트에서 runner 가상머신에서 내가 연결시킬 db가 구동 중인지 확인해야 한다
- 예를 들어 나의 경우는 test에서 redis와 mariaDB가 필요했는데, workflow 스크립트에서는 db들을 실행시키는 스크립트가 없었기에 runner에서 db가 돌아가지 않았고, 그 결과 db를 찾지 못해서 예외가 발생했다
- 따라서 application.yml의 db 설정과 동일하게 스크립트에서 db를 구동시켜 주면 해결!
나의 경우 위의 스크립트처럼 mariaDB와 redis를 설정해 주고 build에 성공했다.
성공~~!
Reference