요구사항
DB 설계
개발 환경 설정
- Local Database
- MySql 8.0.20 및 Timezone설정(Asia/Seoul)
- Spring project (boot version : 2.5.6, java version : 1.8)
배포, 개발 환경 분리(application.yml)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
spring: profiles: group: dev: dev, common --- spring: profiles: group: prod: prod, common --- spring: config: activate: on-profile: "common" thymeleaf: prefix: classpath:/templates/ cache: false check-template-location: true suffix: .html server: port: 9091 --- spring: config: activate: on-profile: "dev" devtools: livereload: enabled: true restart: enabled: true jpa: hibernate: ddl-auto: create show-sql: true properties: hibernate: format_sql: true datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/numble username: root password: 1234 logging: level: org.springframework.web: trace --- spring: config: activate: on-profile: "prod" jpa: hibernate: ddl-auto: update datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://numble.c2ejxfeifgj5.ap-northeast-2.rds.amazonaws.com:3306/numble?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Seoul username: ${DB_USERNAME} password: ${DB_PASSWORD} logging: level: org.springframework.web: trace
배포 환경 설정
- AWS EC2
- EC2 인스턴스 생성 및 보안 규칙 설정
- ssh접속을 위한 22번 포트와 Jenkins용 8080 port, spring 서버 접속 용 9091 port를 인바운드 규칙에 추가
- Jenkins
- Git Hook을 통해 master branch에 commit이 발생할 경우 Jenkins에서 clone받아 compile해서 서버 실행해 배포할 예정(Jenkins, Github 연동)
- free tier의 제한때문에 하나의 EC2 인스턴스에서 jenkins서버와 spring서버를 동시에 실행시킬 예정
- container가 종료 되었을때를 대비해 jenkins_home을 마운트 시킴
- Plugin은 recommend와 Publish Over SSH를 설치(Jenkins Publish over SSH Plugin 설정(AWS))
- Build가 성공적으로 진행되면 EC2에 SSH접속을 통해 빌드 된 파일을 보내고 서버 실행 스크립트를 실행해 최종 배포
- Jenkins Server에서 빌드를 진행하고 테스트까지 수행하게 되므로 환경 변수에 DB ID, PW를 추가
Jenkins Dockerfile
1 2 3
FROM jenkins/jenkins:lts USER root RUN apt-get update && apt-get upgrade -y && apt-get install -y openssh-client
Jenkins docker-compose.yml
1 2 3 4 5 6 7 8 9 10 11 12
version: "3" services: jenkins: container_name: jenkins image: jenkins/jenkins:lts user: root ports: - "8080:8080" volumes: - /home/ubuntu/jenkins-compose/jenkins_home:/var/jenkins_home - /home/ubuntu/jenkins-compose/.ssh:/root/.ssh
- Jenkins 설정 및 Github Webhook 설정
- Github Repository webhook 설정을 통해 jenkins서버로 전송
- Jenkins 프로젝트 설정에 git을 위한 secret 추가 및 git url추가
Build는 Use Gradle Warpper를 선택
1 2
clean build -Pprofile=prod
빌드 후 조치 추가
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
## deploy.sh #!/bin/bash echo "> 기존 container, image 삭제" CONTAINER_ID=`docker ps -a -q --filter ancestor="numble"` if [ ${CONTAINER_ID} ];then docker stop ${CONTAINER_ID} docker rm ${CONTAINER_ID} docker rmi -f numble fi echo "> 최신 빌드 파일로 도커 이미지 생성" if docker build -t numble . ; then echo "> 성공" else echo "> 실패" exit 1 fi echo "> 최신 도커 이미지로 컨테이너 실행" if docker run -d -p 9091:9091 numble; then echo "> 성공" exit 0 else echo "> 실패" exit 1 fi
- spring docker
Dockerfile
1 2 3 4 5
FROM openjdk:8 COPY numble-0.0.1-SNAPSHOT.jar app.jar ENV DB_USERNAME (database username) ENV DB_PASSWORD (database password) ENTRYPOINT ["java", "-jar", "app.jar", "--spring.profiles.active=prod"]
- EC2 인스턴스 생성 및 보안 규칙 설정
- RDS
- MySql 인스턴스를 생성하고 인바운드 보안 그룹 설정은 내 Local Ip와 EC2 Instance로 부터만 가능하도록 설정