GitHub Actions 테스트 실패 원인과 해결 과정 (Spring Boot + YML 설정)

coldrice99·2025년 5월 25일
0
post-thumbnail

CI/CD 설정하면서 ./gradlew test만 유독 GitHub Actions에서 계속 실패했다.


상황 요약

  • CI 파이프라인은 다음 순서로 짜놨음:

    1. Redis 설치
    2. 테스트 실행
    3. Gradle 빌드
    4. EC2 배포
  • 테스트는 로컬에선 -Dspring.profiles.active=test 옵션 주고 하면 잘 됨

  • 근데 GitHub Actions에선 테스트 단계에서 무조건 실패


⚠️ 실패 로그들

대표적인 실패 에러는 이거들:

1. 프로퍼티 안 채워짐

Caused by: java.lang.IllegalArgumentException at PropertyPlaceholderHelper.java:180

${xxx} 로 설정을 불러오는데 해당 값이 없어서 생긴 에러

2. JWT secret 문제

Caused by: io.jsonwebtoken.security.WeakKeyException at Keys.java:96

→ secret 값이 너무 짧거나 base64 디코딩 실패


🔍 원인 찾기

처음에는 test용 yml 파일이 잘못됐나 싶었는데, 진짜 문제는 application.yml에 있었다.

spring:
  profiles:
    active: local
    include: secret

이게 모든 상황에서 localsecret 프로파일을 로드함.
test 프로파일만 써도 결국 MySQL, JWT, mail 등 민감한 설정이 필요해졌던 거다.

→ 그래서 CI 환경에서는 저 설정들이 없으니까 에러가 나는 구조였던 것.


application-local.yml, secret.yml을 base64로 인코딩해서 GitHub 환경변수(Secrets)에 등록

- name: Restore local.yml
  run: echo "${{ secrets.LOCAL_YML }}" | base64 -d > src/main/resources/application-local.yml

- name: Restore secret.yml
  run: echo "${{ secrets.SECRET_YML }}" | base64 -d > src/main/resources/application-secret.yml

이렇게 해도 실패. 어째서???

Caused by: org.hibernate.HibernateException at DialectFactoryImpl.java:191

그리고 마지막 한 줄:

BUILD FAILED in 55s
Error: Process completed with exit code 1.

즉, DB 연결 시도 중 Dialect 감지를 못 해서 터진 것.

application-test.yml에서는 H2로 설정되어 있지만, 해당 에러는 테스트 중 JPA가 H2가 아닌 MySQL을 로딩하려다 발생한 거였다.

즉, application-test.yml이 로드되지 않고 application-local.yml이 먼저 로드된 상태.

CI 환경에는 MySQL이 없으니 당연히 실패한 거다.


이유는 application.yml의 고정된 Profile 설정 때문이었다.

spring:
  profiles:
    active: local
    include: secret

이렇게 되어 있었기 때문에, 내가 아무리 CI 환경에서
- Dspring.profiles.active=test를 주더라도 application.yml은 여전히 local과 secret 프로파일을 로딩했다.

결국 테스트에서도 MySQL 설정이 적용되어버리는 구조였던 것.
CI 환경에는 MySQL이 없으니 당연히 DB Dialect도 찾지 못하고 터지는 게 맞았던 거다.


✅ 결국 해결한 방법

application.yml에서 프로파일을 환경변수 기반으로 바꿨음:

spring:
  profiles:
-   active: local
-   include: secret
+   active: ${SPRING_PROFILES_ACTIVE:local}
+   include: ${SPRING_PROFILES_INCLUDE:secret}

→ 기본은 여전히 local/secret이지만, 환경변수로 덮어쓸 수 있게 된 것이다.

그리고 GitHub Actions에서 이렇게 설정했다:

- name: Set profile
  run: echo "SPRING_PROFILES_ACTIVE=test" >> $GITHUB_ENV

application.yml이 기본값은 local/secret 쓰지만, CI 환경에서는 test만 쓰도록 override 가능해짐.


배포까지 확인


회고

  • 진짜 핵심은 application.yml을 너무 고정값으로 설정해놨던 거
  • CI 환경에서는 로컬이랑 완전히 동일하게 설정해줘야 제대로 작동함
  • application.yml은 최대한 유연하게 구성해야 한다는 걸 뼈저리게 느낌
  • 삽질도 많았지만 덕분에 Spring Profile, GitHub Actions, CI/CD 전반을 한층 이해하게 됨

기억할 것

CI 환경에서 계속 실패하면 application.yml부터 의심하자.
환경 변수로 유연하게 바꾸는 게 답이다.

profile
서두르지 않으나 쉬지 않고

0개의 댓글