Github Action sentry-cli login Error

민찬기·2025년 2월 15일
post-thumbnail

한 줄 요약

build.gradle에서 includeSourceContextauthToken 설정을 제외하자

CI가 실패해요 😰

최근 프로젝트를 진행하며 예외 모니터링을 위해 Sentry를 프로젝트에 추가했습니다. 이후 develop 브랜치 머지를 위하여 PR을 생성하였고, 사전에 만들어둔 Github Action CI가 동작했습니다.

로컬에서 정상적으로 동작함을 꼼꼼히 확인하고 PR을 생성했으나, CI가 실패했습니다. 에러 메세지는 sentry-cli에 로그인하기 위해 auth token이 필요하다는 내용이었습니다.

Task :sentryBundleSourcesJava FAILED
error: Auth token is required for this request. Please run sentry-cli login and try again!

FAILURE: Build failed with an exception.
What went wrong:
Execution failed for task ':sentryBundleSourcesJava'.
An error occurred while executing task 'sentryBundleSourcesJava'. Please check the detailed sentry-cli output above.

그러나 CI 스크립트에서 sentry-cli를 사용하는 구간은 한 곳도 없습니다.

name: yappu-world-dev-ci

on:
    pull_request:
        branches:
            - develop

jobs:
    build:
        runs-on: ubuntu-latest
        permissions:
            contents: read
        steps:
            -   uses: actions/checkout@v4

            -   name: Set up Docker
                run: |
                    sudo apt-get update
                    sudo apt-get install docker-compose
            -   name: Start MySQL with Docker Compose
                run: |
                    docker-compose -f docker/docker-compose-test.yaml up -d
            -   name: Set up JDK 21
                uses: actions/setup-java@v4
                with:
                    java-version: '21'
                    distribution: 'liberica'
                    cache: gradle

            -   name: Setup Gradle
                uses: gradle/actions/setup-gradle@v3

            -   name: Copy Secrets
                uses: microsoft/variable-substitution@v1
                with:
                    files:
                        ./src/main/resources/application-test.yaml
                env:
                    jwt.secret_key: ${{ secrets.DEV_JWT_SECRET_KEY }}
                    jwt.access_token_expiration_times: ${{ secrets.DEV_ACCESS_TOKEN_EXPIRATION_TIMES }}
                    jwt.refresh_token_expiration_times: ${{ secrets.DEV_REFRESH_TOKEN_EXPIRATION_TIMES }}
                    fcm.private_key_id: ${{ secrets.FCM_PRIVATE_KEY_ID }}
                    fcm.private_key: ${{ secrets.FCM_PRIVATE_KEY }}
                    fcm.client_email: ${{ secrets.FCM_CLIENT_EMAIL }}
                    fcm.client_id: ${{ secrets.FCM_CLIENT_ID }}
                    fcm.client_x509_cert_url: ${{ secrets.FCM_X509_CERT_URL }}
                    discord.webhook: ${{ secrets.DISCORD_WEBHOOK_URL_IN_DEV }}
                    sentry.dsn: ${{secrets.SENTRY_DSN}}

            -   name: Build with Gradle Wrapper
                run: ./gradlew clean build
                env:
                    SPRING_PROFILES_ACTIVE: test

            # Discord Notification
            -   name: CI Success Notification
                uses: sarisia/actions-status-discord@v1
                if: success()
                with:
                    title: ✅ 개발 환경 CI 성공 ✅
                    webhook: ${{ secrets.DISCORD_WEBHOOK_URL }}
                    color: 0x00FF00
                    username: 페페훅

            -   name: CI Failure Notification
                uses: sarisia/actions-status-discord@v1
                if: failure()
                with:
                    title: ❗️개발 환경 CI 실패 ❗️
                    webhook: ${{ secrets.DISCORD_WEBHOOK_URL }}
                    color: 0xFF0000
                    username: 페페훅

왜 안 되지? 🤔

정말 희안한 것은, 로컬에서 너무나도 멀쩡히 돌아간다는 것입니다. 실제로 Sentry와 관련된 설정은 build.gradle.kts와 환경변수 설정을 위한 yaml 파일 뿐이었습니다.

처음 살펴본 곳은 SENTRY_AUTH_TOKEN이었습니다. 위에도 적어 두었지만, 첫번째 에러 메세지는 요청을 위해 SENTRY_AUTH_TOKEN이 필요하다는 내용이었습니다.

Sentry에서 프로젝트 생성을 하고 Spring Boot 프레임워크를 선택하면 다음과 같은 화면이 나옵니다.

하단에는 build.gradle에 다음 내용을 추가하라는 안내가 되어 있습니다.

buildscript {
  repositories {
    mavenCentral()
  }
}

plugins {
  id "io.sentry.jvm.gradle" version "5.2.0"
}

sentry {
  // Generates a JVM (Java, Kotlin, etc.) source bundle and uploads your source code to Sentry.
  // This enables source context, allowing you to see your source
  // code as part of your stack traces in Sentry.
  includeSourceContext = true

  org = "org"
  projectName = "projectName"
  authToken = System.getenv("SENTRY_AUTH_TOKEN")
}

CI 환경에서 SENTRY_AUTH_TOKEN을 제대로 불러오지 못한다고 판단하여, Github Action이 실행되는 서버에 SENTRY_AUTH_TOKEN을 환경 변수로 설정할 수 있도록 스크립트를 추가하였습니다.

-   name: Setup Sentry Auth Token
    run: |
        export SENTRY_AUTH_TOKEN=${{ secrets.SENTRY_AUTH_TOKEN }}

그러나 여전히 SENTRY_AUTH_TOKEN이 필요하다는 에러가 발생했습니다.

공식 문서는 신이다 😎

문득 진행을 하다보니, 로컬에는 SENTRY_AUTH_TOKEN이 설정되어 있지 않은데 어떻게 실행과 테스트가 수행되는 건지 의문이 들었습니다. 그래서 build.gradle에 auth token을 설정하는 부분을 공식 문서에서 찾아보고자 했습니다.

어렵지 않게 해당 설정 방법이 남아있는 Source Context 페이지를 찾을 수 있었습니다.

해당 페이지에서는 Sentry에서 지원하는 Source Context에 관한 내용이 담겨져 있었습니다. Source Context란 Sentry에 노출되는 stack trace와 관련된 소스 코드를 노출해주는 기능입니다.

Sentry에서 코드를 보는 것도 편리한 일이겠지만, 지금 당장에는 Sentry를 이용하여 예외 상황을 파악하는 것만이 중요했기 때문에 설정에서 제외하였습니다.

tasks {
    sentry {
        org = "yapp-co"
        projectName = "yappu-world-server"
    }
}

그리고 이렇게 깔끔히 CI를 성공할 수 있었습니다!

오늘의 교훈은.. 공식 문서를 꼼꼼히 읽어보자!
물론 Sentry 홈페이지에서 안내해주는대로 한 거지만..

profile
https://github.com/devmizz

0개의 댓글