Skip to content

Commit bf76837

Browse files
authored
Merge pull request #64 from codeit-part3-team2/develop
Merge
2 parents c741822 + 4792790 commit bf76837

245 files changed

Lines changed: 11754 additions & 143 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.env.example

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ SPRING_PROFILES_ACTIVE=
55
DB_URL=
66
DB_USERNAME=
77
DB_PASSWORD=
8+
MongoDB_URI=
89

910
# AWS
1011
AWS_ACCESS_KEY=

.github/workflows/test.yml

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
name: Run Tests and Upload Coverage
2+
3+
on:
4+
push:
5+
branches: [ main, develop ]
6+
pull_request:
7+
8+
jobs:
9+
test:
10+
runs-on: ubuntu-latest
11+
12+
env:
13+
SPRING_PROFILES_ACTIVE: test
14+
AWS_S3_ACCESS_KEY: ${{ secrets.AWS_S3_ACCESS_KEY }}
15+
AWS_S3_SECRET_KEY: ${{ secrets.AWS_S3_SECRET_KEY }}
16+
AWS_S3_REGION: ${{ secrets.AWS_S3_REGION }}
17+
AWS_S3_BUCKET: ${{ secrets.AWS_S3_BUCKET }}
18+
NAVER_CLIENT_ID: ${{ secrets.NAVER_CLIENT_ID }}
19+
NAVER_CLIENT_SECRET: ${{ secrets.NAVER_CLIENT_SECRET }}
20+
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
21+
22+
steps:
23+
- name: Checkout
24+
uses: actions/checkout@v4
25+
26+
- name: Set up JDK 17
27+
uses: actions/setup-java@v4
28+
with:
29+
distribution: 'temurin'
30+
java-version: '17'
31+
32+
- name: Grant execute permission for gradlew
33+
run: chmod +x gradlew
34+
35+
- name: Run Tests and Coverage
36+
run: ./gradlew clean test jacocoTestReport
37+
38+
- name: Upload to Codecov
39+
uses: codecov/codecov-action@v4
40+
with:
41+
token: ${{ secrets.CODECOV_TOKEN }}
42+
files: |
43+
monew-api/build/reports/jacoco/test/jacocoTestReport.xml
44+
monew-batch/build/reports/jacoco/test/jacocoTestReport.xml
45+
fail_ci_if_error: true

Dockerfile.api

Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
# ====================================
2+
# Dockerfile for API Module
3+
# ====================================
4+
5+
# Stage 1: Build
6+
FROM gradle:8.5-jdk17-alpine AS builder
7+
8+
# 빌드 인자 선언 (docker-compose.prod.yml에서 전달)
9+
ARG BUILD_DATE
10+
ARG VCS_REF
11+
ARG VERSION
12+
13+
WORKDIR /app
14+
15+
# 루트 프로젝트 설정 파일 복사
16+
#COPY settings.gradle ./
17+
#COPY build.gradle ./
18+
#COPY gradlew ./
19+
#COPY gradle gradle/
20+
21+
COPY settings.gradle ./
22+
COPY build.gradle ./
23+
COPY gradlew ./
24+
COPY gradle gradle/
25+
COPY monew-monitor/build.gradle monew-monitor/
26+
27+
# 2) CRLF 제거 + 실행권한 + 존재 확인
28+
RUN sed -i 's/\r$//' gradlew && chmod +x gradlew && \
29+
ls -al && ls -al gradle/wrapper && head -n1 gradlew && \
30+
./gradlew --version
31+
32+
# 모든 서브모듈의 build.gradle 복사 (의존성 캐싱)
33+
COPY monew-api/build.gradle monew-api/build.gradle
34+
COPY monew-batch/build.gradle monew-batch/build.gradle
35+
COPY monew-monitor/build.gradle monew-monitor/build.gradle
36+
37+
# Gradle wrapper 실행 권한
38+
RUN chmod +x gradlew || true
39+
40+
# 의존성 다운로드 (캐시 레이어)
41+
RUN ./gradlew dependencies --no-daemon || true
42+
43+
# API 모듈 소스 코드 복사
44+
COPY monew-api/ monew-api/
45+
46+
# API 모듈만 빌드 (테스트 제외)
47+
RUN ./gradlew :monew-api:bootJar -x test --no-daemon
48+
49+
# JAR 파일 위치 확인 및 복사
50+
RUN mkdir -p /app/build && \
51+
find monew-api/build/libs -name "*.jar" -not -name "*-plain.jar" -exec cp {} /app/build/app.jar \;
52+
53+
# Stage 2: Runtime
54+
FROM eclipse-temurin:17-jre-alpine
55+
56+
# 빌드 인자 다시 선언 (runtime stage에서 사용)
57+
ARG BUILD_DATE
58+
ARG VCS_REF
59+
ARG VERSION
60+
61+
WORKDIR /app
62+
63+
# 이미지 메타데이터 레이블 추가
64+
LABEL org.opencontainers.image.created="${BUILD_DATE}" \
65+
org.opencontainers.image.revision="${VCS_REF}" \
66+
org.opencontainers.image.version="${VERSION}" \
67+
org.opencontainers.image.title="Monew API" \
68+
org.opencontainers.image.description="Monew API Server"
69+
70+
# 보안을 위한 non-root 사용자 생성
71+
RUN addgroup -S spring && adduser -S spring -G spring
72+
73+
# 타임존 설정
74+
RUN apk add --no-cache tzdata wget && \
75+
cp /usr/share/zoneinfo/Asia/Seoul /etc/localtime && \
76+
echo "Asia/Seoul" > /etc/timezone && \
77+
apk del tzdata
78+
79+
# 빌드 스테이지에서 JAR 파일 복사
80+
COPY --from=builder /app/build/app.jar app.jar
81+
82+
# 로그 디렉토리 생성 및 권한 설정
83+
RUN mkdir -p /app/.logs && chown -R spring:spring /app/.logs
84+
85+
# 소유권 변경
86+
RUN chown spring:spring app.jar
87+
88+
# 사용자 변경
89+
USER spring:spring
90+
91+
# 헬스체크 설정
92+
HEALTHCHECK --interval=30s --timeout=3s --start-period=40s --retries=3 \
93+
CMD wget --no-verbose --tries=1 --spider http://localhost:8080/actuator/health || exit 1
94+
95+
# JVM 옵션 설정 (환경변수로 오버라이드 가능)
96+
ENV JAVA_OPTS="-XX:+UseContainerSupport \
97+
-XX:MaxRAMPercentage=75.0 \
98+
-XX:InitialRAMPercentage=50.0 \
99+
-XX:+UseG1GC \
100+
-XX:+OptimizeStringConcat \
101+
-Djava.security.egd=file:/dev/./urandom"
102+
103+
# 애플리케이션 포트
104+
EXPOSE 8080
105+
106+
# 애플리케이션 실행
107+
ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS -jar app.jar"]

Dockerfile.batch

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
# ====================================
2+
# Dockerfile for Batch Module
3+
# ====================================
4+
5+
# Stage 1: Build
6+
FROM gradle:8.5-jdk17-alpine AS builder
7+
8+
WORKDIR /app
9+
10+
# Gradle wrapper 및 설정 파일 복사
11+
#COPY monew-batch/build.gradle settings.gradle ./
12+
#COPY build.gradle ./
13+
#COPY gradlew* ./
14+
#COPY gradle gradle/
15+
16+
COPY settings.gradle ./
17+
COPY build.gradle ./
18+
COPY gradlew ./
19+
COPY gradle gradle/
20+
21+
# 2) CRLF 제거 + 실행권한 + 래퍼 존재/버전 확인
22+
RUN sed -i 's/\r$//' gradlew && chmod +x gradlew && \
23+
ls -al && ls -al gradle/wrapper && head -n1 gradlew && \
24+
./gradlew --version
25+
26+
# 모든 서브모듈의 build.gradle 복사 (의존성 캐싱)
27+
COPY monew-api/build.gradle monew-api/
28+
COPY monew-batch/build.gradle monew-batch/
29+
COPY monew-monitor/build.gradle monew-monitor/
30+
31+
# Gradle wrapper 실행 권한
32+
RUN chmod +x gradlew || true
33+
34+
# 의존성 다운로드 (캐시 레이어)
35+
RUN ./gradlew dependencies --no-daemon || true
36+
37+
# 전체 소스 코드 복사
38+
#COPY monew-batch .
39+
COPY monew-api/ monew-api/
40+
COPY monew-batch/ monew-batch/
41+
42+
# Batch 모듈만 빌드 (테스트 제외)
43+
RUN ./gradlew :monew-batch:bootJar -x test --no-daemon
44+
45+
# JAR 파일 위치 확인 및 복사
46+
RUN mkdir -p /app/build && \
47+
find monew-batch/build/libs -name "*.jar" -not -name "*-plain.jar" -exec cp {} /app/build/app.jar \;
48+
49+
# Stage 2: Runtime
50+
FROM eclipse-temurin:17-jre-alpine
51+
52+
WORKDIR /app
53+
54+
# 보안을 위한 non-root 사용자 생성
55+
RUN addgroup -S spring && adduser -S spring -G spring
56+
57+
# 타임존 설정
58+
RUN apk add --no-cache tzdata && \
59+
cp /usr/share/zoneinfo/Asia/Seoul /etc/localtime && \
60+
echo "Asia/Seoul" > /etc/timezone && \
61+
apk del tzdata
62+
63+
# 빌드 스테이지에서 JAR 파일 복사
64+
COPY --from=builder /app/build/app.jar app.jar
65+
66+
# 로그 디렉토리 생성 및 권한 설정
67+
RUN mkdir -p /app/.logs && chown -R spring:spring /app/.logs
68+
69+
# 소유권 변경
70+
RUN chown spring:spring app.jar
71+
72+
# 사용자 변경
73+
USER spring:spring
74+
75+
# JVM 옵션 설정 (배치 작업용 최적화)
76+
ENV JAVA_OPTS="-XX:+UseContainerSupport \
77+
-XX:MaxRAMPercentage=75.0 \
78+
-XX:InitialRAMPercentage=50.0 \
79+
-XX:+UseG1GC \
80+
-XX:MaxGCPauseMillis=200 \
81+
-Djava.security.egd=file:/dev/./urandom"
82+
83+
# 애플리케이션 포트
84+
EXPOSE 8081
85+
86+
# 애플리케이션 실행
87+
ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS -jar app.jar"]

Dockerfile.monitor

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
# ====================================
2+
# Dockerfile for Monitor Module
3+
# ====================================
4+
5+
# Stage 1: Build
6+
FROM gradle:8.5-jdk17-alpine AS builder
7+
8+
WORKDIR /app
9+
10+
# Gradle wrapper 및 설정 파일 복사
11+
#COPY monew-monitor/build.gradle settings.gradle ./
12+
#COPY build.gradle ./
13+
#COPY gradlew* ./
14+
#COPY gradle gradle/
15+
16+
COPY settings.gradle ./
17+
COPY build.gradle ./
18+
COPY gradlew ./
19+
COPY gradle gradle/
20+
COPY monew-monitor/build.gradle monew-monitor/
21+
22+
# 2) CRLF 제거 + 실행권한 + 래퍼 존재/버전 확인
23+
RUN sed -i 's/\r$//' gradlew && chmod +x gradlew && \
24+
ls -al && ls -al gradle/wrapper && head -n1 gradlew && \
25+
./gradlew --version
26+
27+
# 모든 서브모듈의 build.gradle 복사 (의존성 캐싱)
28+
COPY monew-api/build.gradle monew-api/
29+
COPY monew-batch/build.gradle monew-batch/
30+
COPY monew-monitor/build.gradle monew-monitor/
31+
32+
# Gradle wrapper 실행 권한
33+
RUN chmod +x gradlew || true
34+
35+
# 의존성 다운로드 (캐시 레이어)
36+
RUN ./gradlew dependencies --no-daemon || true
37+
38+
# 전체 소스 코드 복사
39+
#COPY monew-monitor .
40+
COPY monew-monitor/ monew-monitor/
41+
42+
# Monitor 모듈만 빌드 (테스트 제외)
43+
RUN ./gradlew :monew-monitor:bootJar -x test --no-daemon
44+
45+
# JAR 파일 위치 확인 및 복사
46+
RUN mkdir -p /app/build && \
47+
find monew-monitor/build/libs -name "*.jar" -not -name "*-plain.jar" -exec cp {} /app/build/app.jar \;
48+
49+
# Stage 2: Runtime
50+
FROM eclipse-temurin:17-jre-alpine
51+
52+
WORKDIR /app
53+
54+
# 보안을 위한 non-root 사용자 생성
55+
RUN addgroup -S spring && adduser -S spring -G spring
56+
57+
# 타임존 설정
58+
RUN apk add --no-cache tzdata wget && \
59+
cp /usr/share/zoneinfo/Asia/Seoul /etc/localtime && \
60+
echo "Asia/Seoul" > /etc/timezone && \
61+
apk del tzdata
62+
63+
# 빌드 스테이지에서 JAR 파일 복사
64+
COPY --from=builder /app/build/app.jar app.jar
65+
66+
# 소유권 변경
67+
RUN chown spring:spring app.jar
68+
69+
# 사용자 변경
70+
USER spring:spring
71+
72+
# 헬스체크 설정
73+
HEALTHCHECK --interval=30s --timeout=3s --start-period=30s --retries=3 \
74+
CMD wget --no-verbose --tries=1 --spider http://localhost:8082/actuator/health || exit 1
75+
76+
# JVM 옵션 설정 (모니터링 경량화)
77+
ENV JAVA_OPTS="-XX:+UseContainerSupport \
78+
-XX:MaxRAMPercentage=70.0 \
79+
-XX:InitialRAMPercentage=40.0 \
80+
-XX:+UseG1GC \
81+
-Djava.security.egd=file:/dev/./urandom"
82+
83+
# 애플리케이션 포트
84+
EXPOSE 8082
85+
86+
# 애플리케이션 실행
87+
ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS -jar app.jar"]

0 commit comments

Comments
 (0)