서론
MoneyTalk 프로젝트에 CI/CD를 붙이던 어느 날, 테스트는 잘 도는데 갑자기 Docker 빌드에서 에러가 팡팡 터졌다.
분명 로컬에서는 되던 거였는데 말이지...
🎯 1. 테스트는 왜 CI에서만 실패했을까?
Could not resolve placeholder 'spring.data.redis.host'
이 에러는 Spring이 ${spring.data.redis.host} 같은 설정값을 못 찾았을 때 나오는 고전적인 에러다.
로컬에서는 잘만 돌아갔는데, GitHub Actions에서는 줄줄이 테스트가 터졌다.
📌 원인은 단순했다
- 테스트 전용 설정 파일인 application-test.yml이 .gitignore에 막혀서 Git에 아예 포함되지 않았던 것!
- 결국 CI 환경에서는 이 설정 파일이 존재하지 않아 테스트 환경 구성이 깨졌던 거다.
✅ 해결 방법
.gitignore에 다음 한 줄만 추가해주자.
# gitignore
# 테스트용 설정은 포함시켜야 한다!
!src/test/resources/application-test.yml
그리고 커밋!
# bash
git add -f src/test/resources/application-test.yml
git commit -m "fix: include application-test.yml for CI" git push origin main
🐳 2. 테스트는 통과했는데, Docker 빌드가 실패한다면?
에러 로그는 이랬다:
COPY build/libs/moneytalk-0.0.1-SNAPSHOT.jar
app.jar => ERROR: failed to compute cache key: "/build/libs/moneytalk-0.0.1-SNAPSHOT.jar": not found
JAR 파일을 못 찾는다고?? 근데 그럴만도 했다.
📌 이유는 아주 간단함
CI에서 다음처럼 테스트만 돌리고 있었고:
./gradlew test
정작 JAR 파일을 생성하는 빌드 단계는 빠져 있었던 것!
✅ 해결 방법
테스트가 끝난 뒤에, 아래처럼 JAR 파일을 따로 빌드하도록 step을 추가하면 된다:
- name: Build jar with Gradle
run: ./gradlew build -x test
working-directory: ./moneytalk
이제 Docker는 build/libs/*.jar을 잘 찾아서 이미지 빌드도 성공~!
🧠 정리
| 문제 | 원인 | 해결 방법 |
| application-test.yml 누락 | .gitignore에 막혀서 CI에 포함되지 않음 | .gitignore에 !src/test/resources/application-test.yml 추가 |
| Docker COPY 실패 | JAR 파일을 만들지 않아서 없음 | ./gradlew build -x test로 따로 빌드 수행 |
✍️ 마무리
CI/CD는 한 번 틀어지면 꼬리에 꼬리를 무는 느낌인데,
사실 하나씩 풀어보면 다 명확한 이유가 있다.
앞으론 이 글을 보고 미래의 나도 덜 당황하길 바라며... 🙏