Skip to content

Commit

Permalink
Merge pull request #59 from kookmin-sw/backend/feat/#58
Browse files Browse the repository at this point in the history
✨ CI/CD 설정
  • Loading branch information
J-Yong99 authored Apr 6, 2024
2 parents 2a192e6 + 0b9d926 commit e9b7de3
Show file tree
Hide file tree
Showing 10 changed files with 223 additions and 10 deletions.
26 changes: 26 additions & 0 deletions backend/.github/.workflows/deploy.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
name: Deploy

on:
push:
branches:
- deploy/v1

jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v3
with:
node-version: 16
cache: npm
- run: yarn install

- name: Build
run: yarn build

- name: Deploy
uses: peaceiris/actions-gh-pages@v3
with:
github_token: ${{ secrets.TOKEN }}
publish_dir: dist
30 changes: 30 additions & 0 deletions backend/moment/moment-server/auth/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
# 도커 허브에서 공식적으로 제공하는 OpenJDK 이미지를 베이스 이미지로 사용합니다.
FROM openjdk:17-jdk-slim

# 빌드에 필요한 패키지를 설치합니다.
RUN apt-get update && apt-get install -y findutils && rm -rf /var/lib/apt/lists/*

# 작업 디렉토리를 생성합니다.
RUN mkdir -p /app
WORKDIR /app

# Gradle 캐시를 미리 복사하여 의존성 다운로드 시간을 단축합니다.
#COPY .gradle .gradle

# 프로젝트 소스 코드와 Gradle 설정 파일을 복사합니다.
COPY build.gradle gradlew ./
COPY gradle gradle
COPY src src

# Gradle을 이용하여 프로젝트를 빌드합니다.
RUN --mount=type=cache,target=/root/.gradle ./gradlew build -x test

# 빌드 결과물을 Docker 이미지 안에 포함시킵니다. 이건 호스트에서 가져올떄 COPY고 컨테이너 내부에서 빌드한 파일을 복사할때 cp
#COPY build/libs/*SNAPSHOT.jar app.jar
RUN cp build/libs/*SNAPSHOT.jar app.jar


# 컨테이너가 실행될 때 자동으로 실행할 명령어를 설정합니다.
CMD ["java", "-jar", "app.jar"]


Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ public TokenResponseDTO.GetToken login(AuthRequest.Login login) {

@Transactional
public TokenResponseDTO.GetTempToken sendCode(AuthRequest.SendCode sendCode) {
log.info("sendCode.isSignUp : {}", sendCode.isSignUp());
if (sendCode.isSignUp()) {
if(userRepository.existsByEmail(sendCode.getEmail())){
throw new AlreadyRegisteredEmailException("이미 가입된 이메일");
Expand Down
104 changes: 100 additions & 4 deletions backend/moment/moment-server/docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ services:
build:
context: eureka/.
ports:
- "8761:8761" # 호스트 머신의 8080 포트와 컨테이너 내부의 8080 포트를 매핑
- "8761:8761" # 호스트 머신의 8761 포트와 컨테이너 내부의 8761 포트를 매핑
logging:
driver: "json-file"
options:
Expand Down Expand Up @@ -44,7 +44,7 @@ services:
ports:
- "8080:8080" # 호스트 머신의 8080 포트와 컨테이너 내부의 8080 포트를 매핑
depends_on:
db: # db 서비스가 먼저 실행되어야 함
db-core: # db 서비스가 먼저 실행되어야 함
condition: service_healthy
# eureka-server:
# condition: service_healthy
Expand All @@ -54,7 +54,7 @@ services:
# retries: 5
# restart: on-failure
environment:
SPRING_DATASOURCE_URL: jdbc:mysql://db:3306/moment_core?createDatabaseIfNotExist=TRUE&useSSL=false&allowPublicKeyRetrieval=true&characterEncoding=UTF-8&serverTimezone=UTC
SPRING_DATASOURCE_URL: jdbc:mysql://db-core:3306/moment_core?createDatabaseIfNotExist=TRUE&useSSL=false&allowPublicKeyRetrieval=true&characterEncoding=UTF-8&serverTimezone=UTC
SPRING_DATASOURCE_USERNAME: root
SPRING_DATASOURCE_PASSWORD: root1234
logging:
Expand All @@ -67,7 +67,63 @@ services:
# volumes:
# - /c/Users/jykim/TheWayHome_Server/src/main/resources/static/images:/app/src/main/resources/static/images

db:
# 스케줄러 서버
scheduler:
image: moment-scheduler:0.0.1 # 스프링부트 어플리케이션의 이미지 이름과 태그
container_name: moment-scheduler-server # 컨테이너 이름
build:
context: scheduler/.
ports:
- "8081:8081" # 호스트 머신의 8081 포트와 컨테이너 내부의 8081 포트를 매핑
environment:
SPRING_DATASOURCE_URL: jdbc:mysql://db-core:3306/moment-core?createDatabaseIfNotExist=TRUE&useSSL=false&allowPublicKeyRetrieval=true&characterEncoding=UTF-8&serverTimezone=UTC
SPRING_DATASOURCE_USERNAME: root
SPRING_DATASOURCE_PASSWORD: root1234
depends_on:
db-core: # db 서비스가 먼저 실행되어야 함
condition: service_healthy
networks:
- moment-net
# 메일 서버
mail:
image: mail:0.0.1 # 스프링부트 어플리케이션의 이미지 이름과 태그
container_name: mail-server # 컨테이너 이름
build:
context: mail/.
ports:
- "8082:8082" # 호스트 머신의 8082 포트와 컨테이너 내부의 8082 포트를 매핑
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "10"
networks:
- moment-net
# Auth 서버
auth:
image: auth:0.0.1 # 스프링부트 어플리케이션의 이미지 이름과 태그
container_name: auth-server # 컨테이너 이름
build:
context: auth/.
ports:
- "8083:8083" # 호스트 머신의 8083 포트와 컨테이너 내부의 8083 포트를 매핑
environment:
SPRING_DATASOURCE_URL: jdbc:mysql://db-auth:3306/moment-auth?createDatabaseIfNotExist=TRUE&useSSL=false&allowPublicKeyRetrieval=true&characterEncoding=UTF-8&serverTimezone=UTC
SPRING_DATASOURCE_USERNAME: root
SPRING_DATASOURCE_PASSWORD: root1234
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "10"
depends_on:
db-auth: # db 서비스가 먼저 실행되어야 함
condition: service_healthy
networks:
- moment-net

# 코어 서버 디비
db-core:
image: mysql:8.0 # MySQL 이미지 이름과 태그
container_name: moment-core-db # 컨테이너 이름
ports:
Expand All @@ -85,8 +141,48 @@ services:
volumes:
- moment_core_data:/var/lib/mysql

# 스케줄러 서버 디비
# db-scheduler:
# image: mysql:8.0 # MySQL 이미지 이름과 태그
# container_name: moment-scheduler-db # 컨테이너 이름
# ports:
# - "23306:3306" # 호스트 머신의 23306 포트와 컨테이너 내부의 3306 포트를 매핑
# command: --default-authentication-plugin=mysql_native_password # MySQL 8.0 이상 버전일 경우 인증 방식 지정
# environment:
# MYSQL_ROOT_PASSWORD: root1234
# MYSQL_DATABASE: moment_scheduler
# networks:
# - moment-net
# healthcheck:
# test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
# timeout: 20s
# retries: 10
# volumes:
# - moment_scheduler_data:/var/lib/mysql

# Auth 서버 디비
db-auth:
image: mysql:8.0 # MySQL 이미지 이름과 태그
container_name: moment-auth-db # 컨테이너 이름
ports:
- "33306:3306" # 호스트 머신의 33306 포트와 컨테이너 내부의 3306 포트를 매핑
command: --default-authentication-plugin=mysql_native_password # MySQL 8.0 이상 버전일 경우 인증 방식 지정
environment:
MYSQL_ROOT_PASSWORD: root1234
MYSQL_DATABASE: moment_auth
networks:
- moment-net
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
timeout: 20s
retries: 10
volumes:
- moment_auth_data:/var/lib/mysql

volumes:
moment_core_data:
# moment_scheduler_data:
moment_auth_data:


networks:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,5 +16,5 @@ eureka:
register-with-eureka: false
fetch-registry: false
service-url:
# defaultZone: http://host.docker.internal:${server.port}/eureka/
defaultZone: http://localhost:${server.port}/eureka/
defaultZone: http://host.docker.internal:${server.port}/eureka/
# defaultZone: http://localhost:${server.port}/eureka/
Original file line number Diff line number Diff line change
Expand Up @@ -68,5 +68,5 @@ eureka:
register-with-eureka: true
fetch-registry: true
service-url:
# defaultZone: http://host.docker.internal:8761/eureka
# defaultZone: http://host.docker.internal:8761/eureka
defaultZone: http://localhost:8761/eureka
30 changes: 30 additions & 0 deletions backend/moment/moment-server/mail/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
# 도커 허브에서 공식적으로 제공하는 OpenJDK 이미지를 베이스 이미지로 사용합니다.
FROM openjdk:17-jdk-slim

# 빌드에 필요한 패키지를 설치합니다.
RUN apt-get update && apt-get install -y findutils && rm -rf /var/lib/apt/lists/*

# 작업 디렉토리를 생성합니다.
RUN mkdir -p /app
WORKDIR /app

# Gradle 캐시를 미리 복사하여 의존성 다운로드 시간을 단축합니다.
#COPY .gradle .gradle

# 프로젝트 소스 코드와 Gradle 설정 파일을 복사합니다.
COPY build.gradle gradlew ./
COPY gradle gradle
COPY src src

# Gradle을 이용하여 프로젝트를 빌드합니다.
RUN --mount=type=cache,target=/root/.gradle ./gradlew build -x test

# 빌드 결과물을 Docker 이미지 안에 포함시킵니다. 이건 호스트에서 가져올떄 COPY고 컨테이너 내부에서 빌드한 파일을 복사할때 cp
#COPY build/libs/*SNAPSHOT.jar app.jar
RUN cp build/libs/*SNAPSHOT.jar app.jar


# 컨테이너가 실행될 때 자동으로 실행할 명령어를 설정합니다.
CMD ["java", "-jar", "app.jar"]


Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
server:
port: 8088
port: 8082

spring:
# config:
Expand Down
30 changes: 30 additions & 0 deletions backend/moment/moment-server/scheduler/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
# 도커 허브에서 공식적으로 제공하는 OpenJDK 이미지를 베이스 이미지로 사용합니다.
FROM openjdk:17-jdk-slim

# 빌드에 필요한 패키지를 설치합니다.
RUN apt-get update && apt-get install -y findutils && rm -rf /var/lib/apt/lists/*

# 작업 디렉토리를 생성합니다.
RUN mkdir -p /app
WORKDIR /app

# Gradle 캐시를 미리 복사하여 의존성 다운로드 시간을 단축합니다.
#COPY .gradle .gradle

# 프로젝트 소스 코드와 Gradle 설정 파일을 복사합니다.
COPY build.gradle gradlew ./
COPY gradle gradle
COPY src src

# Gradle을 이용하여 프로젝트를 빌드합니다.
RUN --mount=type=cache,target=/root/.gradle ./gradlew build -x test

# 빌드 결과물을 Docker 이미지 안에 포함시킵니다. 이건 호스트에서 가져올떄 COPY고 컨테이너 내부에서 빌드한 파일을 복사할때 cp
#COPY build/libs/*SNAPSHOT.jar app.jar
RUN cp build/libs/*SNAPSHOT.jar app.jar


# 컨테이너가 실행될 때 자동으로 실행할 명령어를 설정합니다.
CMD ["java", "-jar", "app.jar"]


Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,8 @@ eureka:
register-with-eureka: true
fetch-registry: true
service-url:
# defaultZone: http://host.docker.internal:8761/eureka
defaultZone: http://localhost:8761/eureka
defaultZone: http://host.docker.internal:8761/eureka
# defaultZone: http://localhost:8761/eureka

logging:
level:
Expand Down

0 comments on commit e9b7de3

Please sign in to comment.