로컬에서는 잘 되고 있었다 근데 배포를 하니
실패가 되었고 로그를 보니 repository test가 전부 실패했다
spring:
profiles:
active:
- prod
깃헙 액션 CI서버에서 테스트를 진행하는데 배포할때는 application-prod.yml로 설정파일을 해야된다
여태까지 service단위 테스트에선 괜찮았는데
하지만 repository테스트를 하기 위해서는 prod에 있는 환경변수가 elb에 있어서 읽어오지 못할뿐더러 읽어온다 한들 CI서버에 데이터 베이스가 없으니 테스트가 통과될 수 없고 배포가 될 수 없다
일단 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파일도 잘 적용할 수 있다