Skip to content

fix(ci): CodeQL 빌드 스텝이 :app:mergeExtDexDebug 에서 OOM — 산발적 실패로 보안 경고와 구분 불가 #1023

Closed

Description

@1hyok

증상

Analyze (java-kotlin)(CodeQL)이 PR 마다 산발적으로 실패한다. 실패하는 것은 CodeQL 분석이 아니라 그 앞의 빌드 스텝이다.

Step: Compile Android and pure JVM Kotlin sources   → exit 1
Execution failed for task ':app:mergeExtDexDebug'
  Caused by: com.android.builder.dexing.DexArchiveMergerException: Error while merging dex archives
  Caused by: com.android.tools.r8.CompilationFailedException: Compilation failed to complete
  Caused by: java.lang.OutOfMemoryError: Java heap space

실측 사례 — PR #961 head 59dcd3e9, job 97349051769. 같은 시기 다른 PR(#990 6c723220, #988 84f945a1)에서는 같은 워크플로가 success 라, 코드가 아니라 러너 자원에 따라 갈린다.

코드 문제가 아니라는 근거

워크플로가 돌리는 것과 같은 명령을 로컬에서 실행하면 통과한다.

$ ./gradlew assembleDebug :feature:onboarding:domain:classes :feature:setting:domain:classes
BUILD SUCCESSFUL in 11s

R8 dex 병합이 GitHub 러너(7GB)에서 힙을 넘긴 것이다.

왜 문제인가

CodeQL 은 guard 와 달리 필수 체크가 아니지만, 빨간불이 상시화되면 진짜 보안 경고가 났을 때 구분되지 않는다. 지금은 리뷰어가 매번 로그를 열어 «OOM 이라 무관» 임을 확인해야 한다.

손볼 자리

  • gradle.properties 의 org.gradle.jvmargs 는 CI 에서 러너 메모리에 맞춰 조정되는지 확인 (-Xmx 상향 또는 CodeQL 잡 한정 오버라이드)
  • R8 쪽은 android.r8.maxWorkers · -Dcom.android.tools.r8.maxMemory 계열로 병렬도를 낮추는 선택지가 있다
  • 또는 CodeQL 추출에 dex 병합이 필요 없으므로, assembleDebug 대신 컴파일 태스크(compileDebugKotlin + 모듈 classes)만 돌리는 방향 — 다만 추출기가 컴파일러 호출을 관찰해야 하므로 fix(ci): CodeQL 에서 --build-cache 되돌림 — 추출기가 컴파일러 호출을 관찰한다 [base: develop] #1014 와 함께 봐야 한다

관련

Activity

  1. self-assigned this
    on Aug 24, 2026
  2. 1hyok commented on Aug 24, 2026

    @1hyok
    CollaboratorAuthor

    PR #1027 로 머지됐다. 완료 조건인 소요 수치를 남긴다.

    CodeQL Analyze (java-kotlin) job 소요

    빌드 명령 소요
    assembleDebug (기존) 9.4 · 9.9 · 10.3분
    compileDebugSources 7.0 · 7.9분

    PR 당 약 23분(2025%) 단축. dex 병합(R8)·packaging 을 빼면서 OOM 표면 자체가 사라졌고, 추출 커버리지는 그대로다 — 태스크 그래프 실측상 컴파일 task 는 양쪽 114건으로 동일하고 빠지는 것은 compileDebugLibraryResources(aapt2)뿐이다.

    OOM 실측 빈도

    최근 CodeQL run 40건을 훑으면 failure 는 1건이고, 그 원인이 mergeExtDexDebug 였다 (남의 PR feat/601-03-type-unification). 이슈 서술대로 «산발적» 이며, 그 산발성이 바로 문제였다 — 빈도가 낮아서 매번 로그를 열어 보안 경고가 아님을 확인해야 했다.

    추출이 실제로 채워지는지

    Verify analyzed sources in the CodeQL database 스텝이 app/src/main/ 아래 .kt 가 database 에 담겼는지 검사하는데, PR #1027 의 CodeQL run 이 success 다. 컴파일 태스크만 돌려도 추출기가 컴파일러 호출을 관찰한다는 것이 실증됐다.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

bugSomething isn't working

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions