[Github Action] 환경변수 관련 에러 (Spring boot)
run: ./gradlew test -i # 모든 로그 출력
Spring boot 프로젝트에서 api key를 application.yml파일에 저장한 뒤 이를 스프링이 제공하는 @Value 애노테이션으로 불러오는 방식으로 api key를 사용했다. (application.yml 파일은 git에 올리지 않음)
Push / PR 시 빌드 및 테스트를 진행하기 위해 github action을 사용하기로 했다.
그런데 github action workflow를 통해 빌드를 하면 에러가 발생했다.
처음에는 api key문제는 절대 아닌 거라고 생각했다. @Value를 통해 api key를 읽어오는 작업은 Spring Context를 불러오는 거랑 상관이 없다고 생각했다. 그냥 해당 api key를 사용할 때 동적으로 읽어오는 줄 알았다.
처음에 에러가 발생했을 때
@SpringBootTest
class EnglishConversationApplicationTests {
@Test
void contextLoads() {
}
}
이 테스트에서
ChatGPTExceptionHandlerTest > HttpClientErrorExceptionHandle(HttpStatus, String, String) > [1] status=401 UNAUTHORIZED, expectedCode=EX, expectedMessage=서버 오류 FAILED
java.lang.IllegalStateException at DefaultCacheAwareContextLoaderDelegate.java:180
Caused by: org.springframework.beans.factory.BeanCreationException at AutowiredAnnotationBeanPostProcessor.java:514
Caused by: java.lang.IllegalArgumentException at PropertyPlaceholderHelper.java:180
이런 에러가 발생했었는데 생각해보니 이 테스트는 기본적으로 생성되는 테스트가 실패한거라서 내가 짠 코드 문제가 아니라고 판단했다.
그래서 로그를 좀 더 자세히 출력해보았다.
workflow에 이렇게 쓰면 된다.
run: ./gradlew test -i # 모든 로그 출력
로그를 확인해 보니
chatGPTConfig라는 파일에 @Value 애노테이션에서 api key를 불러온다. 이게 실패해서 bean이 생성되지 않은 것이다.
workflow에서 빌드를 할 때 @Value에서 api key를 읽어올 수 있도록 해야 한다.
먼저, github repository secrets에 api key를 저장해야 한다.
여기에 해당 api key 이름으로 저장해주고 (문자열이 아니라 키 그대로 저장해줘야 한다.)
run: ./gradlew test -i # 모든 로그 출력
env:
GPT_API_KEY: ${{ secrets.GPT_API_KEY }}
workflow에 env를 추가해 주면 된다.
이후 다시 workflow를 수행하면
성공