Git-Hub

[Github Action] 환경변수 관련 에러 (Spring boot)

뾰루퉁한 제리 2024. 3. 2. 00:19
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를 저장해야 한다.

repository > Settings > Secrets and variables > Actions > Repository secrets

 

여기에 해당 api key 이름으로 저장해주고 (문자열이 아니라 키 그대로 저장해줘야 한다.)

run: ./gradlew test -i # 모든 로그 출력
env:
  GPT_API_KEY: ${{ secrets.GPT_API_KEY }}

 

workflow에 env를 추가해 주면 된다.

 

이후 다시 workflow를 수행하면

성공