ENAN

Developer, Artist, Traveler

공부/Spring

Github Action 빌드시 contextLoads Failed 오류

ENAN 2020. 11. 20. 20:38

spring server를 ec2에 배포하는 과정을 자동화할 방법을 찾다가, github Action을 사용해보기로 했다.

 

Github Action?

Github Action을 간단히 설명하면 빌드, 테스트, 배포 등의 작업을 자동화 시켜주는 도구이다. 즉, Github에서 지원하는 CI/CD 도구이다. 기존에 CI/CD 툴로 많이 사용된 Jenkins, Travis 등과 비슷한 역할을 한다고 볼 수 있을 것 같다.

비교적 최근(약 1년 전)에 생겼고, jenkins와 다르게 설치나 ci 서버 설정 등의 과정이 필요 없어서 편하게 사용할 수 있는 것 같다. 심지어 public repository에서는 무료고, private repository에서도 월 일정 시간(2000분) 만큼은 무료로 사용할 수 있다.

사용을 주저할 이유는 없어보인다!

 

github Action에 대한 설명을 잘 정리해둔 글이 있어 링크로 남긴다.

velog.io/@adam2/Github%EC%97%90-Action%EC%9D%B4%EB%9D%BC%EB%8A%94-%ED%83%AD%EC%9D%B4-%EC%83%9D%EA%B2%BC%EB%8B%A4..-github-Action%EC%9D%B4%EB%9E%80-3gk336pk8q

 

Github에 Action이라는 탭이 생겼다.. (github Action이란?)

새로운 탭 깃허브를 사용하다 어느순간... 내 레포에 새로운 탭이 생긴 것을 여러분은 인지하셨나요? image.png > 자꾸 자기를 클릭해달라고 팝업도 뜨던데... > 구글에 검색해보니 CI/CD관련된 기능

velog.io

그리고 github Action, codeDeploy, nginx 조합으로 무중단 배포 하는 방법도 잘 설명되어 있어 링크로 남긴다. (이거 보고 따라함)

wbluke.tistory.com/39

 

Github Actions + CodeDeploy + Nginx 로 무중단 배포하기 (1)

개요 안녕하세요! 이번 시리즈에서는 제목에서와 같이 Github Actions 와 CodeDeploy, 그리고 Nginx 를 사용하여 하나의 서버에서 최소 규모의 무중단 배포를 진행하는 방법에 대해 정리해보려고 합니다.

wbluke.tistory.com

세상엔 참 대단하고 고마운 사람들이 많다..

 

어쨌든 github Action에 대해 설명하려는게 본 글의 목표는 아니었고, 본론은 github Action build 과정에서 발생한 error에 대한 것이다.

내가 삽질한 내용을 남겨서 혹시나 나같은 바보가 또 있다면 헤메지 않길 바라는 마음에서 글을 쓴다! 

 

---

빌드 중 발생한 에러

github Action build 도중 아래와 같은 오류가 발생했다.

com.safari.onredserver.OnredserverApplicationTests > contextLoads() FAILED
    java.lang.IllegalStateException at DefaultCacheAwareContextLoaderDelegate.java:132
        Caused by: org.springframework.beans.factory.BeanCreationException at BeanDefinitionValueResolver.java:342
            Caused by: org.springframework.beans.factory.BeanCreationException at AbstractAutowireCapableBeanFactory.java:1794
                Caused by: javax.persistence.PersistenceException at AbstractEntityManagerFactoryBean.java:403
                    Caused by: org.hibernate.exception.JDBCConnectionException at SQLStateConversionDelegate.java:112
                        Caused by: com.mysql.cj.jdbc.exceptions.CommunicationsException at SQLError.java:174
                            Caused by: com.mysql.cj.exceptions.CJCommunicationsException at NativeConstructorAccessorImpl.java:-2
                                Caused by: java.net.ConnectException at PlainSocketImpl.java:-2

> Task :test FAILED

error log를 보면 뭔가 JDBC 관련된 에러라고 추측할 수는 있었는데, 대체 뭐가 문제인지 감을 잡을 수 없었다. 처음엔 코드 문제인줄 알았지만, 로컬에서 빌드하는데는 아무 문제가 없었다. 로컬에서 빌드할 때는 잘 돌아가는데 github Aciton에서 빌드할 때는 오류가 나니까 더 해멨던 것 같다.

 

원인은 어이없게도 github action에서 mysql server를 시작하지 않아서 connection 과정에서 오류가 난 거였다. 바보같은 새끼 .. 

 

해결

기본 mysql을 사용할 수도 있지만 누군가 사용하기 간편하게 만들어둔 소스가 있어 적용해봤다.

workflow file의 build 과정 steps에서 gradle build 전 아래의 내용을 추가해줌으로써 해결되었다!

      - name: Setup MySQL
        uses: samin/mysql-action@v1
        with:
          character set server: 'utf8' 
          mysql database: '테스트에 사용할 db이름' 
          mysql user: '유저 이름'
          mysql password: ${{ secrets.MYSQL_PASSWORD }} # github Secret 탭에서 설정하세요!

 

나는 characterset, db/user/pwd 만 설정해주었지만 포트번호 등 다른 옵션들도 간편하게 줄 수 있다.

아래의 링크에 자세한 사용방법이 적혀있다.

github.com/marketplace/actions/start-mysql

 

Start MySQL - GitHub Marketplace

Start a MySQL database

github.com

하는김에 redis도 마찬가지로 세팅해주었다.

      - name: Start Redis
        uses: supercharge/redis-github-action@1.1.0
        with:
          redis-version: 6

역시나 이것도 누군가 만들어두셨다.

github.com/marketplace/actions/redis-server-in-github-actions

 

Redis Server in GitHub Actions - GitHub Marketplace

Start a Redis server (on default port 6379)

github.com

감사합니다 감사합니다..