Gradle에서 조건부 Jacoco 적용하기: CI/CD 파이프라인 최적화

2024. 1. 10. 12:50Project 해축갤/CI CD

728x90

최근에 우테크 블로그를 읽고, 코드의 품질을 관리하기 위해 Jacoco라는 도구를 도입했습니다. Jacoco는 코드 커버리지를 측정하는 도구로, 제가 작성한 테스트가 얼마나 코드를 잘 커버하는지 알려줍니다. 이를 통해 놓친 테스트 케이스를 찾아내고, 더 견고한 코드를 작성할 수 있었죠.

 

하지만, 실제 업무 중 급박한 상황을 겪으며 '긴급할 때는 코드 커버리지를 잠시 무시하고 버그부터 고쳐야 한다'는 생각이 들었습니다. 그래서 Jacoco 검사를 상황에 따라 선택적으로 실행하도록 설정하는 방법을 모색했습니다.

Jacoco 설정 과정과 브랜치 변경

1. 첫 시도 - 우테크 블로그의 기본 설정:

test {
    finalizedBy 'jacocoTestReport'
}
  • 설명: 이 설정은 Gradle의 test 태스크가 완료된 후에 자동으로 Jacoco 보고서 태스크(jacocoTestReport)를 실행하도록 설정합니다. Jacoco 보고서는 테스트 커버리지에 대한 상세한 정보를 제공하며, 코드 품질 관리에 중요한 역할을 합니다.
  • 원리: finalizedBy 구문은 특정 태스크가 완료된 후에 다른 태스크를 실행하도록 지시합니다.
    여기서는 테스트가 끝나면 Jacoco 보고서를 생성하라는 명령입니다.

2. 브랜치 변경

  • 변경 내용: 프로젝트의 초기 환경은 단일 main 브랜치로 구성되었으나, 개발과 배포를 분리하기 위해
    maindev 두 개의 브랜치로 분리했습니다. 이렇게 함으로써 개발 중인 코드와 배포 준비가 완료된 코드를 구분했습니다.
  • dev 브랜치로의 푸시 후, PR을 통해 main 브랜치로 머지하도록 설정했습니다.

3. 조건부 로직 추가

test {
    if (project.hasProperty('generateJacocoReport') && project.property('generateJacocoReport') == 'true') {
        finalizedBy 'jacocoTestReport'
    }
}
  • 설명: 이 설정은 test 태스크가 완료된 후에 generateJacocoReport 속성을 확인하여Jacoco 보고서 태스크를 실행하도록 합니다. 로컬에서는./gradlew build -PgenerateJacocoReport=true로 build 시 jacocoTestReport를 실행합니다.
  • 문제: 이 설정만으로는 GitHub Actions에서는 제대로 작동하지 않습니다.
    GitHub Actions 에다 main 브랜치일때 수행할 작업, dev 브랜치일 때 수행할 작업을 구분하는 작업이 남았습니다.

4. GitHub Actions의 Main과 Dev 브랜치 구분

처음 시도

# Main 브랜치 푸시인 경우 Jacoco 보고서 생략
- name: Build with Gradle (Main, without Jacoco)
  if: github.ref == 'refs/heads/main'
  uses: gradle/gradle-build-action@v2.6.0
  with:
    arguments: build -PgenerateJacocoReport=false

 

  • 설명: 이 설정은 github.ref를 사용하여 현재 실행 중인 GitHub Action의 브랜치가 main일 때 Jacoco 보고서를 생성하지 않도록 지정했습니다.
  • 문제점: github.ref는 PR에서 병합된 후의 브랜치를 가리키기 때문에, PR 작업의 경우 refs/pull/:number/merge 형태로 나타나 조건을 만족시키지 못했습니다.

PR 은 refs/pull/2/merge 로 뜬다.

5. GitHub Actions 조건 수정:

# Dev 브랜치로의 푸시 또는 PR인 경우 Jacoco 실행
- name: Build with Gradle (Dev, with Jacoco)
  if: github.ref == 'refs/heads/dev' || github.head_ref == 'dev'
  uses: gradle/gradle-build-action@v2.6.0
  with:
    arguments: build -PgenerateJacocoReport=true
  • 설명: 이 설정은 github.refgithub.head_ref를 사용하여 현재 실행 중인 브랜치가 dev이거나,
    PR의 소스 브랜치가 dev인 경우 Jacoco 보고서를 생성하도록 합니다.
  • 원리: github.ref는 현재 실행 중인 브랜치를 나타내고, github.head_ref는 PR의 소스 브랜치를 나타냅니다.
    이 두 조건을 OR 연산으로 결합하여, dev 브랜치에 대한 푸시와 PR 모두에서 Jacoco 보고서가 생성되도록 설정했습니다.

정리

오늘의 내용은 JaCoCo 를 급한 경우에는 안 하는 방법에 대해서 알아봤습니다.

요약을 하자면 다음과 같습니다!

  • 조건부 로직의 활용: build.gradle에서 들어온 인자값에 따라 실행 여부를 결정
  • CI/CD 파이프라인 구성: branch에 따라 CI/CD 프로세스를 할지말지 결정
728x90