diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..dbb52f8 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,5 @@ +* +!Dockerfile +!build/ +!build/libs/ +!build/libs/app.jar diff --git a/.github/workflows/ci-pr.yml b/.github/workflows/ci-pr.yml index 33b59e2..478f828 100644 --- a/.github/workflows/ci-pr.yml +++ b/.github/workflows/ci-pr.yml @@ -37,21 +37,11 @@ jobs: java-version: '25' distribution: 'temurin' - - name: Gradle 의존성 캐싱 - uses: actions/cache@v4 - with: - path: | - ~/.gradle/caches - ~/.gradle/wrapper - key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} - restore-keys: | - ${{ runner.os }}-gradle- - - name: Setup Gradle uses: gradle/actions/setup-gradle@v4 - name: 프로젝트 빌드 - run: ./gradlew build + run: ./gradlew build --build-cache - name: 빌드 결과 댓글 if: always() @@ -90,24 +80,11 @@ jobs: java-version: '25' distribution: 'temurin' - - name: Gradle 의존성 캐싱 - uses: actions/cache@v4 - with: - path: | - ~/.gradle/caches - ~/.gradle/wrapper - key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} - restore-keys: | - ${{ runner.os }}-gradle- - - name: Setup Gradle uses: gradle/actions/setup-gradle@v4 - name: 프로젝트 빌드 - env: - GOOGLE_OAUTH_CLIENT_ID: ${{ secrets.GOOGLE_OAUTH_CLIENT_ID }} - GOOGLE_OAUTH_CLIENT_SECRET: ${{ secrets.GOOGLE_OAUTH_CLIENT_SECRET }} - run: ./gradlew build + run: ./gradlew build --build-cache - name: 빌드 결과 댓글 if: always() @@ -137,4 +114,4 @@ jobs: issue_number: context.payload.pull_request.number, name: 'ready-to-build' }); - } catch (e) {} \ No newline at end of file + } catch (e) {} diff --git a/.github/workflows/ci-push.yml b/.github/workflows/ci-push.yml index db246c3..36b5b9f 100644 --- a/.github/workflows/ci-push.yml +++ b/.github/workflows/ci-push.yml @@ -20,21 +20,8 @@ jobs: java-version: '25' distribution: 'temurin' - - name: Gradle 의존성 캐싱 - uses: actions/cache@v4 - with: - path: | - ~/.gradle/caches - ~/.gradle/wrapper - key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} - restore-keys: | - ${{ runner.os }}-gradle- - - name: Setup Gradle uses: gradle/actions/setup-gradle@v4 - name: 프로젝트 빌드 - env: - GOOGLE_OAUTH_CLIENT_ID: ${{ secrets.GOOGLE_OAUTH_CLIENT_ID }} - GOOGLE_OAUTH_CLIENT_SECRET: ${{ secrets.GOOGLE_OAUTH_CLIENT_SECRET }} - run: ./gradlew build \ No newline at end of file + run: ./gradlew build --build-cache diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index a5fa7dd..ebbba35 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -34,6 +34,8 @@ jobs: - uses: dorny/paths-filter@v3 id: filter with: + base: ${{ github.event.before }} + ref: ${{ github.sha }} filters: | src: - 'src/**' @@ -62,6 +64,22 @@ jobs: - name: Repository 접근 uses: actions/checkout@v4 + - name: JDK 25 셋팅 + uses: actions/setup-java@v4 + with: + java-version: '25' + distribution: 'temurin' + + - name: Setup Gradle + uses: gradle/actions/setup-gradle@v4 + + - name: 애플리케이션 JAR 빌드 + run: | + ./gradlew bootJar --no-daemon --build-cache + BOOT_JAR=$(find build/libs -maxdepth 1 -type f -name '*.jar' ! -name '*-plain.jar' | head -n 1) + test -n "$BOOT_JAR" + cp "$BOOT_JAR" build/libs/app.jar + - name: AWS 자격증명 설정 uses: aws-actions/configure-aws-credentials@v4 with: @@ -72,17 +90,19 @@ jobs: id: login-ecr uses: aws-actions/amazon-ecr-login@v2 - - name: Docker 이미지 빌드 & 푸시 - env: - REGISTRY: ${{ steps.login-ecr.outputs.registry }} - run: | - IMAGE=$REGISTRY/backend - TAG=v${{ needs.calculate-version.outputs.version }} + - name: Docker Buildx 설정 + uses: docker/setup-buildx-action@v3 - docker build -t $IMAGE:$TAG . - docker tag $IMAGE:$TAG $IMAGE:latest - docker push $IMAGE:$TAG - docker push $IMAGE:latest + - name: Docker 이미지 빌드 & 푸시 + uses: docker/build-push-action@v6 + with: + context: . + push: true + tags: | + ${{ steps.login-ecr.outputs.registry }}/backend:v${{ needs.calculate-version.outputs.version }} + ${{ steps.login-ecr.outputs.registry }}/backend:latest + cache-from: type=gha,scope=backend-runtime + cache-to: type=gha,scope=backend-runtime,mode=max - name: 서버 배포 uses: appleboy/ssh-action@v1.0.3 diff --git a/Dockerfile b/Dockerfile index 28d1337..b8f2733 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,26 +1,14 @@ -# ===== 빌드 스테이지 ===== -FROM gradle:jdk25 AS build -WORKDIR /app - -# 의존성 먼저 복사 (캐싱 활용) -COPY build.gradle.kts settings.gradle.kts ./ -COPY buildSrc ./buildSrc -COPY gradle ./gradle -RUN gradle dependencies --no-daemon || true - -# 소스 코드 복사 & 빌드 -COPY src ./src -RUN gradle bootJar --no-daemon +# syntax=docker/dockerfile:1.7 # ===== 실행 스테이지 ===== -FROM eclipse-temurin:25-jre +FROM eclipse-temurin:25-jre-alpine WORKDIR /app -COPY --from=build /app/build/libs/*.jar app.jar -RUN apt-get update && apt-get install -y --no-install-recommends curl && rm -rf /var/lib/apt/lists/* +ARG JAR_FILE=build/libs/app.jar +COPY ${JAR_FILE} app.jar HEALTHCHECK --interval=10s --timeout=5s --start-period=90s --retries=18 \ - CMD curl -f http://localhost:8081/actuator/health/readiness || exit 1 + CMD wget -q -O /dev/null http://127.0.0.1:8081/actuator/health/readiness || exit 1 EXPOSE 8080 -ENTRYPOINT ["java", "-Dspring.profiles.active=prod", "-jar", "app.jar"] \ No newline at end of file +ENTRYPOINT ["java", "-Dspring.profiles.active=prod", "-jar", "app.jar"] diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 0000000..1608900 --- /dev/null +++ b/gradle.properties @@ -0,0 +1 @@ +org.gradle.caching=true