스프링/웹 개발
[Spring/SpringBoot]GitLabRunner로 ci 파이프라인 작성하기 JPA, H2, test 빌드 시 오류 날때
채야미
2025. 2. 6. 15:08
자꾸 테이블이 없다고 뭔가 테이블 생성시 충돌이 났습니다. ㅜㅜㅜㅜㅜㅜ
확인해보니
init.sql과 schema.sql을 추가했는데 이게 빌드시에 자동으로 읽어져서
dev에서는 validate르 쓰고,
test 쪽에서는 JPA를 create를 사용하는데 schema랑 충돌이 되어서 생긴 문제 입니다.
해결이 되었습니다.
(참고: MySql을 사용하는경우에 mysql의 설정을 h2가 이해하도록 아래와 같은 모드 설정을 해야지만 create 옵션시에 테이블을 잘 생성합니다.)
파이프라인 코드
backend와 frontend 코드가 함께 있는 레포라서 이렇게 작성하였습니다.
job_build:
stage: build
tags:
- develop
script:
- echo "📌 Gradle 빌드 시작! (테스트 제외)"
- cd backend
- chmod +x gradlew
- ./gradlew clean build -x test --stacktrace # 테스트 제외하고 빌드
artifacts:
name: "${CI_COMMIT_SHA}"
expire_in: 1 days
paths:
- backend/build/libs/*.jar
rules:
- if: $CI_MERGE_REQUEST_ID
- if: $CI_COMMIT_BRANCH == "develop"
job_test:
stage: test
tags:
- develop
script:
- echo "📌 Gradle 테스트 실행!"
- cd backend
- chmod +x gradlew
- echo "📌 Checking test configuration..."
- ls -al src/test/resources/ # 파일 확인
- echo "파일이 액티브한가 $SPRING_PROFILES_ACTIVE"
- SPRING_PROFILES_ACTIVE=test ./gradlew clean test -i --no-daemon -Dorg.gradle.parallel=true -Dorg.gradle.workers.max=2
artifacts:
reports:
junit: backend/build/test-results/test/*.xml
rules:
- if: $CI_MERGE_REQUEST_ID
- if: $CI_COMMIT_BRANCH == "develop"
spring:
sql:
init:
mode: never
config:
activate:
on-profile: test
datasource:
url: jdbc:h2:mem:testdb;MODE=MYSQL;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE
driver-class-name: org.h2.Driver
username: sa
password:
jpa:
defer-datasource-initialization: true
database-platform: org.hibernate.dialect.H2Dialect
hibernate:
ddl-auto: create # 테스트 실행 시마다 DB 새로 생성
properties:
hibernate:
format_sql: true
show_sql: true