Jenkins 빌드 시 DB 메모리 초기화 문제

윤준혁·2024년 7월 25일

문제 상황

  • Jenkinsfile을 사용하여 CI/CD 파이프라인을 구축하고 빌드를 진행하는 중, DB 메모리가 초기화되는 문제
  • 장기적인 통합 테스트를 수행할 때, 데이터 손상 및 일관성 문제로 번질 수 있음

원인 분석

  • application.yml 파일의 ddl-auto를 create로 해놨음
jpa:
  hibernate:
    ddl-auto: create
  • 프로젝트를 개발하면서 CI/CD 파이프라인을 구축할 때, Jenkins 빌드 시 프로젝트의 수정된 파일이 업데이트되지 않는 문제때문에 빌드 시 메모리 초기화 후 다시 받아오도록 했으나 이로 인해 DB 메모리가 초기화 되는 부작용 발생
stage('Clean Up Docker Containers and Volumes') {
    steps {
        sshagent(['my-ssh-key']) {
            sh '''
                ssh -o StrictHostKeyChecking=no ubuntu@{my_public_DNS} "
                    sudo docker-compose down -v
                    sudo docker system prune -a -f
                "
            '''
        }
    }
}
  • 일단 위의 두가지 이유라고 생각됨

해결 방법

  • 우선 ddl-auto의 문제를 해결하기 위해 배포 환경에선 어떤 식으로 설정을 하는지 찾아보니 잘 정리된 블로그의 글을 찾을 수 있었다(정말 정리가 잘되어있음)

    https://colabear754.tistory.com/136

  • 해당 블로그의 포스팅을 참고해 none으로 지정해준다

jpa:
  hibernate:
    ddl-auto: none

  • 테이블이 존재하지 않는다는 로그를 볼 수 있다
  • 현재 데이터베이스를 기반으로 schema.sql을 만들어줘서 프로젝트 실행 시 시작되게끔 만든다

sql:
  init:
    mode: always
    schema-locations: classpath:schema.sql
  • 그리고 Jenkinsfile도 수정
stage('Clean Up Docker Containers and Volumes') {
    steps {
        sshagent(['my-ssh-key']) {
            sh '''
                ssh -o StrictHostKeyChecking=no ubuntu@{my_public_DNS} "
                    sudo docker-compose down &&
                    sudo docker system prune -a -f
                "
            '''
        }
    }
}

결과

  • 다시 빌드해도 유저가 잘 살아있는 모습

0개의 댓글