Github Actions - 워크플로우 생성하기_CodeCov & jacoco

wondi·2025년 1월 27일

인프라구축/CI&CD

목록 보기
8/10

🥔 워크플로우 생성하기: Jacoco & CodeCov


코드 커버리지 검증을 위해 codeCov를 설치해서 확인을 하고자 한다.
이를 위해서는 먼저 jacoco가 빌드되어 있어야한다.

JaCoCo란?

JaCoCo는 Java코드의 테스트 커버리지를 측정하는 오픈소스 도구다.
테스트 실행 중 코드의 실행 여부를 추적하여 다양한 커버리지 지표를 제공한다.

측정 지표

  • 라인 커버리지 : 각 코드 라인이 실행되었는지 측정
  • 브랜치 커버리지 : if/switch 등 조건문의 분기가 실행되었는지 측정
  • 메소드 커버리지 : 각 메소드가 호출되었는지 측정
  • 클래스 커버리지 : 각 클래스가 사용되었는지 측정

작동결과

  • Java Agent로 동작하며 바이트 코드를 분석
  • 테스트 실행 중 코드 실행 데이터를 수집
  • 수집된 데이터를 기반으로 HTML/XML/CSV 형태의 리포트 생성
  • CI/CD 파이프라인에서 코드 품질 검증에 활용

Jacoco 플러그인 추가

jacoco plugin추가는 build.gradle공식문서에서 확인할 수 있다.

  1. Applying the Jacoco plugin
📂 build.gradle

plugins {
    id 'jacoco'
}
  1. Define dependencies between code coverage reports and test execution
test {
    finalizedBy jacocoTestReport // report is always generated after tests run
}
jacocoTestReport {
    dependsOn test // tests are required to run before generating the report
}
  1. Configuring JaCoCo plugin settings
jacoco {
    toolVersion = "0.8.12"
    reportsDirectory = layout.buildDirectory.dir('customJacocoReportDir')
}
  1. Configuring test task
jacocoTestReport {
    reports {
        xml.required = false
        csv.required = false
        html.outputLocation = layout.buildDirectory.dir('jacocoHtml')
    }
}

여기까지 하면 jacoco index.html에 가면,
이 폴더 파일에 대한 테스트 커버리지를 볼 수 있다.

CodeCov란?

CodeCov는 코드 커버리지 결과를 시각화하고 분석하는 웹 서비스다.
JaCoCo등의 도구를 생성한 커버리지 리포트를 바탕으로 코드품질을 모니터링할 수 있다.

작동방식

  1. CI/CD 파이프라인에서 Jacoco XML 리로트 생성한다.
  2. Codecov action이 리포트를 CodeCov 서버로 전송한다.
  3. 대시보드에서 커버리지 데이터 분석/표시한다.

CodeCov 적용하기

  • CodeCov와 github를 연동하면, 내 레포지토리에 대한 coverage를 볼 수 있다.

  • token이 나오는데, 이 토큰으로

  • 내 레포지토리-Secrets and variables-actions-secrets token을 확인하면 된다.

  • 그리고 yaml file까지 작성하면 완성!

CodeCov.yaml

codecov공식문서 를 참고


coverage:
  status:
    project:
      default: false
      tests:
        target: 50%
        paths:
          - "potatocountry/**/*"

이와같이 만들어주었다.

🗣️ 문제 발생 및 해결

문제

그런데, 중요한 이슈가 발생했다.
바로 PR에서는 코드커버리지가 만족이 안되면 오류가 뜨는데, push할 때는 오류가 뜨지 않는다는 것..!



  push:
    branches:
      - main
      - dev
  pull_request:
    branches:
      - main
      - dev

codecov를 측정하는 .yml파일에서 push & pull request 가 제대로 잘 들어가있기 때문에, 같은 코드에서 다른 결과값이 나왔다.

해결방법

jacocoTestCoverageVerification {
   violationRules {
       rule {
           element = 'CLASS'
           limit {
               counter = 'LINE'
               value = 'COVEREDRATIO'
               minimum = 0.5
           }
       }
   }
}

test {
   useJUnitPlatform()
   ignoreFailures = false
   finalizedBy jacocoTestReport
   finalizedBy jacocoTestCoverageVerification
}

check.dependsOn jacocoTestCoverageVerification

이런 저런 방법을 써보다가, jacocoTestCoverageVerification에 rule을 강력하게 추가하고

  • finalizedBy jacocoTestCoverageVerification : 테스트 실행 후 커버리지 검증 강제
  • check.dependsOn jacocoTestCoverageVerification : 빌드 프로세스에 커버리지 검증 통합

으로 커버리지 검증 규칙을 추가했다.
이렇게 설정하니, Push를 하면 PR과 마찬가지로 오류가 뜨는 것을 확인했다.

설명

이전 설정에서는 jacocoTestReport로 보고서만 생성이 되었기에 문제가 되었다.
PR에서는 Github Actions가 merge commit을 기준으로 실행되고, 이 과정에서 jacocoTestCoverageVerification이 자동으로 포함되어 검증이 수행되었지만, push에서는 merge commit기반 검증이 없어서 명시적인 verification설정이 필요했던 것이다.

profile
Developer Wondi

0개의 댓글