Conversation
WalkthroughCI/CD 파이프라인과 애플리케이션 설정에 Sentry 연동이 추가되었다. Gradle에 Sentry 플러그인과 설정이 도입되었고, 빌드 단계에서 SENTRY_AUTH_TOKEN이 비밀로 전달되어 사용되며, 배포 단계에서 SENTRY_DSN이 컨테이너 런타임으로 전달된다. Docker 빌드 단계가 BuildKit secret을 사용하도록 변경되었다. Changes
Sequence Diagram(s)sequenceDiagram
autonumber
actor Dev as 개발자
participant GH as GitHub Actions
participant DockerBuild as Docker Build (BuildKit)
participant Gradle as Gradle 빌드
participant Sentry as Sentry (remote)
participant EC2 as EC2 호스트
participant Container as Docker 컨테이너
participant App as Spring 앱
Dev->>GH: push (dev CI/CD)
GH->>DockerBuild: docker build --secret id=sentryauthtoken (env SENTRY_AUTH_TOKEN)
DockerBuild->>DockerBuild: mount /run/secrets/sentryauthtoken, export SENTRY_AUTH_TOKEN
DockerBuild->>Gradle: ./gradlew bootJar (SENTRY_AUTH_TOKEN env)
Gradle->>Sentry: (옵션) 소스 컨텍스트 업로드 using authToken
GH->>EC2: deploy (with secret SENTRY_DSN)
EC2->>Container: docker run -e SENTRY_DSN="$SENTRY_DSN" image
Container->>App: start
App->>App: application-dev.yml reads SENTRY_DSN, init Sentry SDK
App->>Sentry: send events/traces
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~20 minutes Tip 🔌 Remote MCP (Model Context Protocol) integration is now available!Pro plan users can now connect to remote MCP servers from the Integrations page. Connect with popular remote MCPs such as Notion and Linear to add more context to your reviews and chats. ✨ Finishing Touches🧪 Generate unit tests
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. 🪧 TipsChatThere are 3 ways to chat with CodeRabbit:
SupportNeed help? Create a ticket on our support page for assistance with any issues or questions. CodeRabbit Commands (Invoked using PR/Issue comments)Type Other keywords and placeholders
Status, Documentation and Community
|
There was a problem hiding this comment.
Actionable comments posted: 0
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (2)
build.gradle.kts (1)
27-70: 런타임 Sentry SDK 의존성이 누락되어 실제 전송이 되지 않습니다현재는 Gradle 플러그인만 추가되어 있고, 애플리케이션 런타임에서 이벤트/트랜잭션을 캡처할 Sentry SDK 의존성이 없습니다. 최소한 Spring Boot 스타터와 로깅 연동을 추가해야 DSN 설정(application-dev.yml)이 효과를 냅니다.
다음과 같이 BOM을 통해 버전을 정렬하고 필수 모듈을 추가하는 것을 제안합니다:
dependencies { implementation("org.springframework.boot:spring-boot-starter") implementation("org.springframework.boot:spring-boot-starter-web") implementation("org.springframework.boot:spring-boot-starter-actuator") implementation("org.jetbrains.kotlin:kotlin-reflect") @@ // Spring Webflux implementation("org.springframework.boot:spring-boot-starter-webflux") @@ // Jackson implementation("com.fasterxml.jackson.module:jackson-module-kotlin") + + // Sentry (runtime SDK) + implementation(platform("io.sentry:sentry-bom:7.17.0")) // 최신 BOM으로 정렬(버전은 조직 표준에 맞춰 조정) + implementation("io.sentry:sentry-spring-boot-starter-jakarta") // Spring Boot 3.x(Jakarta)용 + implementation("io.sentry:sentry-logback") // Logback 로깅 연동 + // (선택) Kotlin 확장 + // implementation("io.sentry:sentry-kotlin-extensions") }추가로, 로깅 패턴(로그백)이 Sentry appender를 통해 에러 레벨 이상이 전송되도록 설정되어야 합니다. 필요 시 logback 설정 스니펫도 제공하겠습니다.
.github/workflows/dev-ci-cd.yml (1)
41-56: SENTRY_AUTH_TOKEN이 Docker 빌드 컨텍스트로 전달되지 않습니다 (소스 컨텍스트 업로드 실패 가능)
env에 설정만으로는 컨테이너 내부 빌드 단계(Gradle)가 토큰을 못 받습니다. BuildKit secret 또는 build-arg로 전달해야 Sentry Gradle 플러그인이 릴리스/소스 업로드를 수행합니다. 토큰 노출 방지를 위해 secret 방식을 권장합니다.BuildKit secret 사용 예시(권장):
- name: Build and push Docker image id: build-image env: ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }} IMAGE_TAG: ${{ github.sha }} - SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }} + SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }} run: | - docker buildx build \ + docker buildx build \ --platform linux/amd64 \ --tag $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG \ --output type=image,push=true \ --cache-from type=registry,ref=$ECR_REGISTRY/$ECR_REPOSITORY:buildcache \ --cache-to type=registry,ref=$ECR_REPOSITORY:buildcache,mode=max \ + --secret id=sentry_auth_token,env=SENTRY_AUTH_TOKEN \ .Dockerfile(빌드 스테이지) 내에서 Gradle 실행 시:
# syntax=docker/dockerfile:1.7 RUN --mount=type=secret,id=sentry_auth_token \ export SENTRY_AUTH_TOKEN="$(cat /run/secrets/sentry_auth_token)" && \ ./gradlew --no-daemon build만약 secret 사용이 어렵다면 임시로 build-arg를 사용할 수 있으나, 이미지 레이어/히스토리에 남지 않도록 주의가 필요합니다.
🧹 Nitpick comments (5)
src/main/resources/application-dev.yml (3)
27-32: PII 전송 활성화(send-default-pii: true) 재검토 필요dev 환경이라도 실제 사용자/운영 데이터가 유입될 수 있으면 PII 전송은 보안/컴플라이언스 리스크입니다. 기본값(false)을 유지하고, 필요한 경우 명시적으로 식별자만 설정하는 방향을 권장합니다.
다음처럼 비활성화하는 것을 제안드립니다:
sentry: dsn: ${SENTRY_DSN} environment: dev traces-sample-rate: 1.0 - send-default-pii: true + send-default-pii: false enabled: true
27-32: Sentry 활성화 제어 방식 단순화 제안Sentry SDK는 dsn이 비어있으면 자동으로 비활성화됩니다. dev 프로필에서만 yml 블록을 두셨으므로
enabled: true는 사실상 중복입니다. 나중에 비밀값 누락 시 예측 가능한 동작을 위해enabled키를 제거하거나, 별도 환경변수로 토글하는 것을 권장합니다.옵션 1(권장): enabled 제거
sentry: dsn: ${SENTRY_DSN} environment: dev traces-sample-rate: 1.0 send-default-pii: false - enabled: true옵션 2: 외부 토글 사용
sentry: dsn: ${SENTRY_DSN} environment: dev traces-sample-rate: 1.0 send-default-pii: false + enabled: ${SENTRY_ENABLED:false}
29-31: 샘플링/프로파일링 설정 가이드dev에서는
traces-sample-rate: 1.0이 무방하지만, 추후 stage/prod 전환 시 과도한 트래픽/비용을 유발할 수 있으니 sampler로 전환할 수 있도록 TODO를 남겨두면 좋습니다. 또한 성능 병목 분석이 필요하면profiles-sample-rate(JFR 기반 프로파일링)도 고려ください.예시:
sentry: # traces-sampler: com.example.SentrySampler # 환경/경로/사용자에 따른 동적 샘플링 # profiles-sample-rate: 0.2build.gradle.kts (1)
76-82: AUTH 토큰 주입 방식 개선 및 Gradle 프로퍼티 폴백CI에서 ENV만 기대하면 Docker 빌드 컨텍스트에 토큰이 전달되지 않을 수 있습니다(아래 워크플로우 코멘트 참고). 또한 환경변수 미설정 시 NPE/빈 문자열 문제를 피하기 위해 Gradle 프로퍼티 폴백을 두는 편이 안전합니다.
다음과 같이 Providers API로 안전하게 처리해 주세요:
-sentry { - includeSourceContext.set(true) - - org.set("dnd1302") - projectName.set("eodigo-backend") - authToken.set(System.getenv("SENTRY_AUTH_TOKEN")) -} +sentry { + includeSourceContext.set(true) + org.set("dnd1302") + projectName.set("eodigo-backend") + + // ENV 우선, 없으면 -P 또는 gradle.properties 값 사용 + val envToken = providers.environmentVariable("SENTRY_AUTH_TOKEN") + val propToken = providers.gradleProperty("sentry.auth.token") + authToken.set(envToken.orElse(propToken)) +}빌드시
-Psentry.auth.token=$SENTRY_AUTH_TOKEN로도 주입 가능해집니다..github/workflows/dev-ci-cd.yml (1)
64-107: 런타임 DSN 주입은 적절함. 환경값 명시 또는 릴리스 식별자 추가 제안컨테이너에
SENTRY_DSN을 전달하는 구성이 올바르게 되어 있습니다. 추가로 이 배포가 dev임을 더 명확히 추적하려면SENTRY_ENVIRONMENT=dev를 함께 넘기거나, 플러그인/SDK가 Git SHA를 릴리스로 인식하도록SENTRY_RELEASE를 빌드 시점에 지정하는 것도 고려해 주세요.예시(선택):
docker run -d --name $CONTAINER_NAME -p $HOST_PORT:8080 --restart always \ -e SPRING_PROFILES_ACTIVE=dev \ + -e SENTRY_ENVIRONMENT=dev \ -e DB_URL="$DB_URL" \ @@ -e SENTRY_DSN="$SENTRY_DSN" \ $IMAGE_URI빌드 단계에서(선택):
export SENTRY_RELEASE=$GITHUB_SHA # Gradle가 자동 감지하지 못할 경우 -Psentry.release=$SENTRY_RELEASE 전달
📜 Review details
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
💡 Knowledge Base configuration:
- MCP integration is disabled by default for public repositories
- Jira integration is disabled by default for public repositories
- Linear integration is disabled by default for public repositories
You can enable these sources in your CodeRabbit configuration.
📒 Files selected for processing (3)
.github/workflows/dev-ci-cd.yml(3 hunks)build.gradle.kts(2 hunks)src/main/resources/application-dev.yml(1 hunks)
🔇 Additional comments (2)
build.gradle.kts (1)
8-9: 확인: Sentry Gradle 플러그인 5.9.0 호환성현재 사용 중인
id("io.sentry.jvm.gradle") version "5.9.0"은
- 최신 배포 버전으로, 2025년 8월 12일 기준 5.9.0이 릴리스되었습니다. (mvnrepository.com)
- Gradle 8.x와 호환되며(플러그인 v3.4.3에서 이미 Gradle 8 지원이 추가됨) (github.com)
- Sentry Java SDK가 Java 1.8 이상을 지원하므로 Java 17에서도 문제없이 동작합니다. (docs.sentry.io)
- Spring Boot 3.x 환경에서는
sentry-spring-boot-starter-jakarta를 자동으로 적용하므로 Spring Boot 3.5.x와 함께 사용할 수 있습니다. (docs.sentry.io)따라서 별도의 버전 변경 없이 현재 설정을 유지해도 무방합니다.
.github/workflows/dev-ci-cd.yml (1)
57-131: 배포 실패 시 로그 노출 가드 검증 완료다음 위치에서
SENTRY_DSN및SENTRY_AUTH_TOKEN환경변수를 참조하고 있으나, 애플리케이션 로그나 스크립트 내 직접 출력 코드는 없습니다. 안전하게 배포 파이프라인을 유지하셔도 좋습니다.
- build.gradle.kts (81행):
authToken.set(System.getenv("SENTRY_AUTH_TOKEN"))– Gradle Sentry 플러그인 설정용 참조- src/main/resources/application-dev.yml (28행):
dsn: ${SENTRY_DSN}– 스프링 프로퍼티로 주입
There was a problem hiding this comment.
Actionable comments posted: 0
🧹 Nitpick comments (5)
.github/workflows/ci.yml (1)
43-45: CI 빌드 시 Sentry 업로드 토큰 검증 로직 추가 제안Gradle 설정에서 Sentry 플러그인(
io.sentry.jvm.gradlev5.9.0)이 적용되어 있고,sentry { … }블록(includeSourceContext.set(true),org.set("…"))이 정의되어 있으나,authToken.set(…)같은 토큰 관련 설정이 코드상에 없습니다.
이 경우,SENTRY_AUTH_TOKEN이 주입되지 않는 포크 PR 환경에서는 업로드 태스크가 실패하거나 예기치 않은 동작을 일으킬 수 있습니다. CI의 안정성을 위해, 토큰이 있을 때만 업로드를 시도하도록 워크플로우에 조건부 가드를 추가해 주세요.– 대상 파일:
.github/workflows/ci.yml(43–45행)
– 추가 작업:SENTRY_AUTH_TOKEN환경변수 존재 여부 확인 후 빌드 및 업로드 수행적용 예시(diff):
- name: Build with Gradle - env: - SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }} - run: ./gradlew build + env: + SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }} + run: | + if [ -n "${SENTRY_AUTH_TOKEN}" ]; then + echo "🔒 SENTRY_AUTH_TOKEN detected: enabling Sentry upload tasks." + ./gradlew build + else + echo "⚠️ SENTRY_AUTH_TOKEN not set: skipping Sentry upload." + ./gradlew build + fiDockerfile (1)
18-20: BuildKit 시크릿 사용 적절함. Gradle 캐시 마운트로 빌드 시간을 단축하세요.현재 시크릿은 안전하게 RUN 레이어에서만 사용되어 이미지/레이어에 남지 않습니다. 추가로 Gradle 캐시를 마운트하면 CI/CD 빌드 시간이 크게 줄어듭니다.
적용 제안(diff):
-RUN --mount=type=secret,id=sentryauthtoken \ - export SENTRY_AUTH_TOKEN=$(cat /run/secrets/sentryauthtoken) && \ - ./gradlew bootJar --no-daemon +RUN --mount=type=secret,id=sentryauthtoken \ + --mount=type=cache,target=/home/gradle/.gradle/caches \ + --mount=type=cache,target=/home/gradle/.gradle/wrapper \ + export SENTRY_AUTH_TOKEN="$(cat /run/secrets/sentryauthtoken)" && \ + ./gradlew bootJar --no-daemon로컬에서 Docker 이미지를 빌드할 때
--secret id=sentryauthtoken,env=SENTRY_AUTH_TOKEN를 전달하지 않으면 BuildKit이 에러를 반환합니다. 로컬 개발 편의를 위해 “시크릿 없이도 빌드되되, 업로드는 생략”하는 플로우가 필요하면 아래 두 가지 중 하나를 택해 주세요.
- Dockerfile 대안: 별도의 “local” 스테이지를 만들어 시크릿 마운트 없이 빌드(업로드 태스크가 비활성화되도록 Gradle 설정 필요).
- Gradle 대안:
SENTRY_AUTH_TOKEN이 비어 있으면 업로드 태스크를 등록하지 않거나 no-op 처리.원하시면 두 방식 중 선호하시는 쪽으로 Dockerfile/Gradle 설정 패치를 제안드리겠습니다.
.github/workflows/dev-ci-cd.yml (3)
46-51: 시크릿 전달 방식 적절. 릴리스 상관관계를 위해 SENTRY_RELEASE/이미지 라벨을 함께 전파하세요.Sentry 이슈와 배포 아티팩트(이미지/커밋)를 정확히 매핑하려면 릴리스 식별자를 일관되게 전달하는 것이 좋습니다. 현재는 DSN만 전달되고 있어, Sentry 측 릴리스/아티팩트 상관관계가 약합니다.
적용 제안(diff):
- name: Build and push Docker image id: build-image env: ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }} IMAGE_TAG: ${{ github.sha }} SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }} + SENTRY_RELEASE: ${{ github.sha }} run: | docker buildx build \ --platform linux/amd64 \ --secret id=sentryauthtoken,env=SENTRY_AUTH_TOKEN \ + --label org.opencontainers.image.revision=$IMAGE_TAG \ + --label org.opencontainers.image.source=${{ github.repository }} \ + --label org.opencontainers.image.created=${{ github.event.head_commit.timestamp }} \ + --build-arg SENTRY_RELEASE=$IMAGE_TAG \ --tag $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG \ --output type=image,push=true \ --cache-from type=registry,ref=$ECR_REGISTRY/$ECR_REPOSITORY:buildcache \ --cache-to type=registry,ref=$ECR_REGISTRY/$ECR_REPOSITORY:buildcache,mode=max \ .추가로 Dockerfile에서 다음을 받아 적용하면 릴리스 값이 런타임/플러그인 모두에 전달됩니다.
- Dockerfile(빌더 스테이지 상단 등)에 추가:
ARG SENTRY_RELEASE ENV SENTRY_RELEASE=${SENTRY_RELEASE}- Gradle 플러그인/애플리케이션에서
SENTRY_RELEASE환경변수를 사용하도록 설정.Sentry Gradle 플러그인이 릴리스 값을 어떻게 해석하는지 현재 설정을 점검해 주세요. 릴리스가 커밋 SHA(IMAGE_TAG)로 설정되면 추후 배포 추적/이슈 회귀 분석이 수월해집니다.
76-78: Secrets 개수 증가: 운영/보안 관점에서 AWS SSM/Secrets Manager로 이전 고려DB 자격증명, 각종 API 키, SENTRY_DSN이 모두 런너 환경변수로 주입되고 있습니다. dev 환경이라도, self-hosted 러너 보안/감사 요건을 고려하면 AWS SSM Parameter Store 또는 Secrets Manager에서 컨테이너 기동 시 주입(예: init 컨테이너, 혹은 애플리케이션 부팅 시 fetch)으로 전환하는 방안을 검토해 주세요.
원하시면 Parameter Store를 사용하는 진입 스크립트/권한 최소화 정책(IAM Role + 최소 권한) 샘플을 드리겠습니다.
107-108: 런타임에서도 SENTRY_ENVIRONMENT/SENTRY_RELEASE를 명시적으로 설정하세요.
application-dev.yml에서 environment를 dev로 설정했더라도, 컨테이너 실행 시 명시적으로 전달하면 오동작 가능성을 줄일 수 있습니다. 또한 릴리스 값을 함께 넘기면 Sentry 이슈-릴리스 연결이 좋아집니다.적용 제안(diff):
-e ADMIN_API_KEY="$ADMIN_API_KEY" \ - -e SENTRY_DSN="$SENTRY_DSN" \ + -e SENTRY_DSN="$SENTRY_DSN" \ + -e SENTRY_ENVIRONMENT="dev" \ + -e SENTRY_RELEASE="$IMAGE_TAG" \ $IMAGE_URI컨테이너 내부에서 다음을 확인해 보세요.
echo $SENTRY_DSN,echo $SENTRY_ENVIRONMENT,echo $SENTRY_RELEASE값이 기대대로 설정되는지- Spring 설정(
application-dev.yml)이 환경변수 값을 우선 사용하거나 충돌 없이 병합되는지
📜 Review details
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
💡 Knowledge Base configuration:
- MCP integration is disabled by default for public repositories
- Jira integration is disabled by default for public repositories
- Linear integration is disabled by default for public repositories
You can enable these sources in your CodeRabbit configuration.
📒 Files selected for processing (3)
.github/workflows/ci.yml(1 hunks).github/workflows/dev-ci-cd.yml(3 hunks)Dockerfile(1 hunks)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
- GitHub Check: build-and-test
📝 작업 내용
실시간 에러 트래킹 도구인 Sentry를 Spring Boot 애플리케이션에 연동했습니다.
⚡ 주요 변경사항
Sentry 연동
Sentry Gradle Plugin을 도입하였습니다.dev환경에서만 Sentry가 활성화되도록application-dev.yml에 설정을 추가하고, CI/CD 파이프라인에 관련 Secret(SENTRY_AUTH_TOKEN,SENTRY_DSN)을 연동했습니다.Slack 알림 설정
dev환경)에서 새로운 유형의 에러(New Issue)가 발생하면, 지정된 Slack 채널로 즉시 알림이 오도록 Alert Rule을 설정했습니다.📌 리뷰 포인트
📋 체크리스트
feat: 기능1 추가)Summary by CodeRabbit