Travis CI와 github 연동 중 Test Failed가 발생할 때
본 글은 Travis CI 적용 중 겪은 오류와 해결법을 정리한 글이다.
오류를 겪는 분들께 큰 도움이 되기를 바란다.
기본 설정
기본적으로 설정한 .travis.yml의 구성은 아래와 같았다.
# 언어 및 jdk 버전
language: java
jdk:
- openjdk11
# 푸시할때 검사가 수행되는 브랜치
branches:
only:
- master
- develop
# Travis CI 서버의 HOME
# 디렉토리에 의존성을 캐싱하여 반복작업 개선
cache:
directories:
- '$HOME/.m2/repository'
- '$HOME/.gradle'
script: "./gradlew clean build"
# CI 실행 완료시 메일로 알람 전달
notifications:
email:
recipients:
- sample@gmail.com
오류: Test FAILED
최근 PR을 보낼 때 테스트를 돌려서 CI를 수행하고 싶어, Travis CI를 프로젝트에 연동해 봤다.
그런데 PR을 보내고 나니...갑자기 Test Failed가 나오면서 아래와 같은 에러 메시지가 출력되었다.
ChargerControllerTest > '/chargers/types'로 GET 요청 시, 충전기의 목록을 반환한다. FAILED
java.lang.IllegalStateException at DefaultCacheAwareContextLoaderDelegate.java:132
Caused by: org.springframework.boot.context.config.ConfigDataResourceNotFoundException at ConfigDataResourceNotFoundException.java:97
거의 모든 테스트가 위 문제로 통과되지 않아서, 한참 머리를 쥐어짰다.
그러다가, 직접 로컬에서 ./gradlew clean build를 돌려보며 문제가 뭐였는지를 알았다.
내 프로젝트에는 몇몇 yml 속성 파일이 .gitignore에 등록된 채로 존재하고 있다.
- application-local에는 로컬 pc의 mysql 로그인 정보가 들어있어서 git에 업로드하지 않았다.
- application-prod에는 AWS RDS의 mariaDB 로그인 정보가 들어있어서 git에 업로드하지 않았다.
- rest.yml에는 공공API 접근 키 값이 들어있어서 git에 업로드하지 않았다.
해당 파일들은 생각해보니, travis의 기준에서는 빠진 파일이나 마찬가지였던 것이다!
게다가 빠트리지 않았던 application.yml에는 다음 코드가 존재했다.
spring:
config:
import: rest.yml
application.yml이 rest.yml을 참조하는 데 해당 파일이 존재하지 않아서 ConfigDataResourceNotFoundException이 발생했던 것이다. 이 에러는 검색해봐도 잘 나오지도 않아서 한참 헤매다가, 직접 로컬 저장소에서 파일을 지워본 뒤 테스트해서야 알 수 있었다.
해결법: 파일 암호화
다행히 이런 경우에 대비해, Travis CI에는 private한 파일을 암호화 및 복호화하는 기능이 있다.
이를 활용하기 위해서는 아래의 단계를 거쳐야 한다.
Travis CI CLC 구성 및 로그인
우선 Travic CI의 CLI 클라이언트인 Travis CI CLC를 설치해야 한다.
$ brew install travis
간단히 설치를 진행해 주고, 이후 로그인을 해야 한다.
그런데, 여기서 또 시간을 많이 잡아먹었다. 그냥 로그인하게 되면, 몇몇 문제가 발생한다.
- 이슈 1: Travis.org가 Travis.com으로 옮기면서 로그인 링크가 작동하지 않는 문제
- 이슈 2: github을 통해 ID/PW로 로그인하는 경우 github에서 승인하지 않는 문제
- 이슈 3: 그냥 로그인하게 되면 이후 암호화가 제대로 동작하지 않는 문제
이슈 1과 2는 결국 토큰으로 로그인하면 해결되는 문제다.
이슈 3의 경우가 중요한데, --pro를 붙이지 않고 로그인하면 github 권한의 문제로 암호화 파일을 제대로 읽지 못한다고 한다.
더 자세한 설명은 이 링크를 참조하시길 바란다. 본 글보다 훨씬 더 잘 쓴 글이라 해당 문제를 해결하는데에 큰 도움이 되었다..!!
어쨌든, 이제 로그인을 진행해 보자.
$ travis login --pro --github-token 토큰값
해당 토큰값은 github-계정-설정-developer setting-personal access tokens에 가서 발급받으면 된다.
그 과정에서, 아래의 권한은 꼭 체크해야 한다.
파일 암호화하기
앞서의 동작을 수행해서 로그인이 잘 되었다면, 아래의 명령어를 입력한다.
$ travis encrypt-file abc.yml
그러면 암호화가 수행되고, 파일명 + .enc 파일이 생성된다.
또한 위처럼 안내 메시지가 뜨는데, 줄이 그어진 부분을 복사한다.
이후 복사한 값을, .travis.yml에 아래처럼 추가해준다.
# 암호화된 rest.yml을 복호화
before_install:
- openssl aes-256-cbc -K $encrypted_4a7b01645f68_key -iv $encrypted_4a7b01645f68_iv -in ./src/main/resources/config/abc.yml.enc -out ./src/main/resources/config/abc.yml -d
여기서 주의할 점은, 위 밑줄쳐진 내용을 그대로 쓰면 안된다는 것이다.
- 첫째로, 파일명 앞에 ' . / ' 을 붙여줘야 한다. 안붙이면 해당 파일을 못찾는 경우가 생긴다.
- 둘째로, 파일이 특정 경로에 들어있다면 경로를 입력해줘야 한다.
- 셋째로, 출력되는 결과 파일 역시 적절히 반환되는지 확인해야 한다.
이후 해당 .enc 파일을 github에 업로드해두면 된다.
그러면 Travis CI가 빌드 및 테스트를 수행하기 앞서, 해당 파일을 복호화하여 지정된 위치에 저장한다.
또한 암호화된 파일의 목록은 Travis CI의 저장소-설정에 가면 볼 수 있다.
마치며
되게 간단하게 작성한 글인데, 사실 공력이 많이 들었다. 거의 3시간 넘게 시간을 쓴 것 같다.
아직 경험이 부족한 만큼 많이 배워간다는 생각을 한다.
잘못된 내용이 있다면 댓글 부탁드립니다.