Gradle에서 조건부 Jacoco 적용하기: CI/CD 파이프라인 최적화
2024. 1. 10. 12:50ㆍProject 해축갤/CI CD
728x90
최근에 우테크 블로그를 읽고, 코드의 품질을 관리하기 위해 Jacoco라는 도구를 도입했습니다. Jacoco는 코드 커버리지를 측정하는 도구로, 제가 작성한 테스트가 얼마나 코드를 잘 커버하는지 알려줍니다. 이를 통해 놓친 테스트 케이스를 찾아내고, 더 견고한 코드를 작성할 수 있었죠.
하지만, 실제 업무 중 급박한 상황을 겪으며 '긴급할 때는 코드 커버리지를 잠시 무시하고 버그부터 고쳐야 한다'는 생각이 들었습니다. 그래서 Jacoco 검사를 상황에 따라 선택적으로 실행하도록 설정하는 방법을 모색했습니다.
Jacoco 설정 과정과 브랜치 변경
1. 첫 시도 - 우테크 블로그의 기본 설정:
test {
finalizedBy 'jacocoTestReport'
}
- 설명: 이 설정은 Gradle의 test 태스크가 완료된 후에 자동으로 Jacoco 보고서 태스크(jacocoTestReport)를 실행하도록 설정합니다. Jacoco 보고서는 테스트 커버리지에 대한 상세한 정보를 제공하며, 코드 품질 관리에 중요한 역할을 합니다.
- 원리: finalizedBy 구문은 특정 태스크가 완료된 후에 다른 태스크를 실행하도록 지시합니다.
여기서는 테스트가 끝나면 Jacoco 보고서를 생성하라는 명령입니다.
2. 브랜치 변경
- 변경 내용: 프로젝트의 초기 환경은 단일 main 브랜치로 구성되었으나, 개발과 배포를 분리하기 위해
main과 dev 두 개의 브랜치로 분리했습니다. 이렇게 함으로써 개발 중인 코드와 배포 준비가 완료된 코드를 구분했습니다. - 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 형태로 나타나 조건을 만족시키지 못했습니다.
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.ref와 github.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
'Project 해축갤 > CI CD' 카테고리의 다른 글
CD(Continuous Deployment) 기본 개념, CD 도구 선택의 이유 (1) | 2023.11.20 |
---|---|
아ㅏㅏㅏ 지속적 제공 vs 지속적 배포 의 차이가 뭔데 (2) | 2023.11.20 |
원큐에 끝내는 GitHub Actions 를 이용한 CI 구축 : 기본 실습 가이드 (0) | 2023.11.17 |
CI(Continous Integration) 도구 선택 고민 원큐에 끝내기 (1) | 2023.11.14 |
CI(Continuous Integration) 개념, 개인 CI vs 팀 CI (2) | 2023.11.14 |