spring boot RepositoryTest GitHub Actions에 돌리기

wellbeing-dough·2023년 11월 24일
0

1. 상황

로컬에서는 잘 되고 있었다 근데 배포를 하니

실패가 되었고 로그를 보니 repository test가 전부 실패했다

2. 이유

spring:
  profiles:
    active:
      - prod

깃헙 액션 CI서버에서 테스트를 진행하는데 배포할때는 application-prod.yml로 설정파일을 해야된다
여태까지 service단위 테스트에선 괜찮았는데
하지만 repository테스트를 하기 위해서는 prod에 있는 환경변수가 elb에 있어서 읽어오지 못할뿐더러 읽어온다 한들 CI서버에 데이터 베이스가 없으니 테스트가 통과될 수 없고 배포가 될 수 없다

3. 해결

일단 mysql을 ci서버에 올릴 수 있는 deploy.yml 스크립트부터 알아봤다

      - name: Setup MySQL #mysql 설정
        uses: samin/mysql-action@v1

이런 좋은 actions가 있다(actions은 스크립트의 모임이다) 그렇다면 application-ci.yml 을 만들어서 여기에는 repository test나 controller test에 대한 ci 서버 테스트용 설정을 작성해주고 예민한 부분은 github actions secrets and variables에 넣어주자

spring:
  datasource:
    url: jdbc:mysql://localhost3306/studyHub;
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: admin
    password: root
  sql:
    init:
      mode: always
      schema-locations: classpath:schema.sql
  jpa:
    open-in-view: true
    hibernate:
      ddl-auto:
      naming:
        physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
    show-sql: true
    properties:
      '[hibernate.format_sql]': true


  mail:
    host: smtp.gmail.com
    port: 587
    username: inustudyhub@gmail.com
    password: ${MAIL_PASSWORD}
    properties:
      mail:
        smtp:
          auth: true
          starttls:
            enable: true

logging:
  level:
    '[org.springframework.boot.web]': DEBUG
    org:
      springframework:
        cache: DEBUG


# debug info warn error

jwt:
  secret: ${JWT_SECRET}

그리고 schema.sql 에서 create table 쿼리 있는거 적용 해주고 always 설정해서 ci서버 mysql에 테이블을 생성 해 준다

물론 ci서버에 mysql을 설정했으니까 ci.yml에도 mysql로 설정해준다
여기가 애먹었던 부분인데 actions secret과 yml을 연결할 수 있게 deploy.yml에 이렇게 해준다

jobs:
  build:
    runs-on: ubuntu-20.04
    env:
      SPRING_PROFILES_ACTIVE: ci
      MAIL_PASSWORD: ${{ secrets.MAIL_PASSWORD }}
      JWT_SERCRET: ${{ secrets.JWT_SECRET }}

그리고 deploy.yml에

      - name: Setup MySQL #mysql 설정
        uses: samin/mysql-action@v1
        with:
          host port: 3306
          container port: 3306
          mysql database: sh_db
          mysql user: 'admin'
          mysql password: 'root'
          character set server: 'utf8'

CI서버에서 테스트 환경에 대한 설정을 하기 위해서 SPRING_PROFILES_ACTIVE: ci로 했다

그럼 yml은 이렇게 되어야 한다 왜? 로컬 환경에서 테스트 코드 돌릴땐 yml에서, ci서버에서 돌릴떄는 아까 SPRING_PROFILES_ACTIVE: ci 로 하기 때문에 가능 그럼 CD에 배포될 yml은? prod인데

ELB환경변수에 저렇게 추가해주면 된다
이렇게 기존에

spring:
  profiles:
    active:
      - dev

application.yml을 이렇게 바꾸면서 개발할 필요도 없고 각 환경마다 yml파일도 잘 적용할 수 있다

0개의 댓글

관련 채용 정보