프로그래밍/기타

Travis CI와 github 연동 중 Test Failed가 발생할 때

카프카뮈 2021. 11. 2. 23:32

본 글은 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 CI] yml 및 secret 파일 암호화하는 방법

Travis CI 사용 시 암호화된 yml 파일로 빌드하기 Travis CI 를 Github 를 이용하여 구성할 때 중요한 것이 중요한 정보가 된 yml 파일을 올리는 것입니다. DB Connection 정보나, AWS Secrect key, Access Key 등..

sanghye.tistory.com

어쨌든, 이제 로그인을 진행해 보자.

$ 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시간 넘게 시간을 쓴 것 같다.

아직 경험이 부족한 만큼 많이 배워간다는 생각을 한다.

 

잘못된 내용이 있다면 댓글 부탁드립니다.

반응형