Task :test FAILEDFAILURE: Build failed with an exception.The command "./gradlew clean build" exited with - 트래비스 암복호화
문제
travis(트래비스) CI 중에 발생한 에러입니다
원인은 application.yml 파일이 보안성 있는 DB 주소, 아이디, 비밀번호가 작성되어 있기 때문에
.gitignore에 작성하여 application.yml을 git에 push 하지 않도록 제외 시켰기 때문입니다
아마도, 보안성을 생각하지 않고 application.yml을 push 한 사람은 발생하지 않았을 에러입니다.
> Task :test
HelloSpringApplicationTests > contextLoads() FAILED
java.lang.IllegalStateException at DefaultCacheAwareContextLoaderDelegate.java:132
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException at ConstructorResolver.java:800
Caused by: org.springframework.beans.factory.BeanCreationException at ConstructorResolver.java:658
Caused by: org.springframework.beans.BeanInstantiationException at SimpleInstantiationStrategy.java:185
Caused by: org.springframework.boot.autoconfigure.jdbc.DataSourceProperties$DataSourceBeanCreationException at DataSourceProperties.java:253
MemberServiceTest > 아이디_비밀번호로_조회() FAILED
java.lang.IllegalStateException at DefaultCacheAwareContextLoaderDelegate.java:132
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException at ConstructorResolver.java:800
Caused by: org.springframework.beans.factory.BeanCreationException at ConstructorResolver.java:658
Caused by: org.springframework.beans.BeanInstantiationException at SimpleInstantiationStrategy.java:185
Caused by: org.springframework.boot.autoconfigure.jdbc.DataSourceProperties$DataSourceBeanCreationException at DataSourceProperties.java:253
2 tests completed, 2 failed
> Task :test FAILED
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':test'.
> There were failing tests. See the report at: file:///home/travis/build/kschoi93/spring-jpa-mysql-aws/build/reports/tests/test/index.html
* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.
* Get more help at <https://help.gradle.org>
BUILD FAILED in 11s
8 actionable tasks: 8 executed
The command "./gradlew clean build" exited with 1.
cache.2
store build cache
Done. Your build exited with 1.
해결 방법
그렇다면 application.yml을 github에 올리지도 못하고 트래비스로 빌드, 테스트도 불가능한데 어떻게 해결할까?에 대한 문제해결 방법에 대해 생각했습니다
저의 경우는 spring을 사용하기 때문에 jasypt를 사용해서 암호화 복호화를 할 생각을 가졌습니다
다만, 결론적으로 이 방법은 실패를 했는데요
jasypt를 사용해 암 복호화를 할 경우 암 복호화에 사용한 password를 활용 할 때 git과 git의 상호 연결은 각각의 해당 서버에 password를 보관해서 사용하면 git으로 노출될 일이 없기에 연결에 문제가 없었지만 중간에 travis가 낄 경우 문제가 되었는데..... travis를 사용할 경우 travis에 push 되었을 때 이 password를 전달해줄 방법이 없었습니다
그렇기에 다른 방법을 찾다가 travis의 환경 변수에 등록해서 파일 또는 문자를 암호화 복호화가 있다는 것을 알게 되었고 이 방법을 사용했다.
다만 조건이 있었습니다
조건1 : .travis.yml과 같은 위치에 있어야 복호화 가능
조건2 : 윈도우에서 암호화를 한 파일의 경우 복호화를 할 때 에러가 발생한다. 즉, 무조건 리눅스에서 해야 합니다
조건3 : travis에는 org와 com 두 가지 종류로 로그인, 암호화 하는 방법이 나눠진다org는 예전 것이고 이제는 com을 사용 한다고 하는데, 더 상세한 정보는 검색해보시길 바랍니다... com으로 로그인 후 com으로 암호화 해야 하고, 아래에도 적겠지만 com == pro 이 단어가 같다고 생각하면 됩니다
travis login 만 적을 경우 --pro가 기본 값이라 하던데 하도 오류가 많이 나니 저는 더 이상 못 믿겠어서 --pro 꼭 적어줬습니다
조건4 : 암호화 복호화를 하며 계속 오류가 발생할 경우 env list 라는 곳에 지금까지 했던 암 복호화 키가 쌓일 것입니다. 이걸 없애주지 않으면 덮어 씌워지는 것이나 마찬가지기 때문에 삭제해줘야 합니다
조건5 : 리눅스에서 트래비스 로그인을 해야 하는데, 이때 아이디 비밀번호를 맞게 작성해도 죽어도 로그인이 안됩니다. Github 토큰을 생성해서 로그인 해야 합니다
조건6: 암호화된 파일을 복호화 시키기 위해서는 .travis.yml과 같은 위치에 enc 암호화된 파일을 위치 시켜야 합니다.
리눅스(우분투)에서 트래비스를 설치하고 아래와 같이 하면 되겠습니다
travis login --pro --github-token {토큰}
application.yml이 있는 위치로 cd로 이동해서
travis encrypt-file --pro application.yml --add
하면 만들어 둔 .travis.yml 에 add 하겠냐고 나오는데
y 누르면 된다
그럼 해당 폴더에 application.yml.enc가 생성된다
mv application.yml.enc /home/ubuntu/spring/
명령어로 .travis.yml이 포함되어 있는 폴더 위치로 이동시킨다
* 즉 프로젝트 최상위 폴더에 위치해야 한다
* 같은 위치에 있어야지 application.yml.enc 복호화가 가능하다
아래는 트래비스 env에 쌓인 암 복호화 키 값을 확인하고 삭제하는 방법입니다
travis env list
travis env unset encrypted_1116e8e6e492_key
travis env unset encrypted_1116e8e6e492_iv
아래는 제가 진행했던 Travis 연동 방법입니다
https://d-life93.tistory.com/342?category=964395