지난번 글에서 Jacoco를 이용해서 코드 커버리지를 검증해보는 시간을 가졌는데, 이번 글에서는 GitHub Actions를 사용해 CI 기능을 구축한 과정을 기록한다.
참고로 아래 CI 코드는 후에 Sonar Cloud를 적용하며 리팩토링 된다.
프로젝트 진행 중 GitHub Actions를 통해 CI를 구축했다. CI 도구로 Jenkins와 GitHub Actions 중 고민했으나, GitHub를 통해 프로젝트 코드 관리를 하기 때문에 GitHub Actions를 선택했다. 변경사항 발생 시 쉽게 문제점을 파악할 수 있다는 점에서 많은 사람들이 GitHub Actions를 선호한다.
구현한 Workflow 파일은 다음과 같다.
name: 'ContinuousIntegration'
on:
push:
branches:
- main
pull_request:
branches:
- main
jobs:
ContinuousIntegration:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up JDK 17
uses: actions/setup-java@v4
with:
java-version: 17
distribution: 'temurin'
- name: Grant execute permission for gradlew
run: chmod +x gradlew
- name: Setup Gradle
uses: gradle/gradle-build-action@v3
with:
arguments: build
cache-read-only: ${{ github.ref != 'refs/heads/main' && github.ref != 'refs/heads/dev' }}
- name: Jacoco Report to PR
id: jacoco
uses: madrapps/jacoco-report@v1.6.1
with:
paths: ${{ github.workspace }}/build/jacocoReport/test/jacocoTestReport.xml
token: ${{ secrets.GITHUB_TOKEN }}
min-coverage-overall: 80
min-coverage-changed-files: 80
debug-mode: false
title: Code Coverage
update-comment: true
- name: Upload jacoco HTML report
uses: actions/upload-artifact@v4
with:
name: jacoco-html-report
path: ${{ github.workspace }}/build/jacocoReport/test/html
- name: Get the Coverage info
run: |
echo "Total coverage ${{ steps.jacoco.outputs.coverage-overall }}"
echo "Changed Files coverage ${{ steps.jacoco.outputs.coverage-changed-files }}"
아래에서 자세하게 설명하겠다.
name: 'ContinuousIntegration'
on:
push:
branches:
- main
pull_request:
branches:
- main
- 워크플로우 이름: 'ContinuousIntegration'으로 설정한다.
- 실행 조건: main 브랜치에 push 또는 pull_request 이벤트가 발생하면 워크플로우가 실행된다.
- name: Set up JDK 17
uses: actions/setup-java@v4
with:
java-version: 17
distribution: 'temurin'
- JDK 17 설정: actions/setup-java@v4 액션을 사용해 Java 17(Temurin 배포판)을 설치한다.
- name: Grant execute permission for gradlew
run: chmod +x gradlew
- Gradle 래퍼 스크립트에 실행 권한 부여: Linux 기반 시스템에서 Gradle 빌드를 실행할 수 있도록 gradlew 파일에 실행 권한을 준다.
- name: Setup Gradle
uses: gradle/gradle-build-action@v3
with:
arguments: build
cache-read-only: ${{ github.ref != 'refs/heads/main' && github.ref != 'refs/heads/dev' }}
- Gradle 빌드 실행: gradle/gradle-build-action@v3 액션을 사용해 프로젝트를 빌드한다. main과 dev 브랜치가 아닐 경우 캐시를 읽기 전용으로 설정한다.
- name: Jacoco Report to PR
uses: madrapps/jacoco-report@v1.6.1
with:
paths: ${{ github.workspace }}/build/jacocoReport/test/jacocoTestReport.xml
token: ${{ secrets.GITHUB_TOKEN }}
min-coverage-overall: 80
min-coverage-changed-files: 80
- Jacoco로 코드 커버리지 보고서 생성 및 PR에 결과 제공: madrapps/jacoco-report@v1.6.1 액션을 사용한다. 전체 및 변경된 파일에 대한 최소 커버리지 요구사항을 80%로 설정한다.
- name: Upload jacoco HTML report
uses: actions/upload-artifact@v4
with:
name: jacoco-html-report
path: ${{ github.workspace }}/build/jacocoReport/test/html
- Jacoco HTML 보고서 아티팩트로 업로드: 빌드 후 Jacoco의 HTML 형식 보고서를 다운로드할 수 있다.
- name: Get the Coverage info
run: |
echo "Total coverage ${{ steps.jacoco.outputs.coverage-overall }}"
echo "Changed Files coverage ${{ steps.jacoco.outputs.coverage-changed-files }}"
- 코드 커버리지 및 변경된 파일의 커버리지 정보 출력: 이전 단계에서 생성된 Jacoco 보고서의 결과를 활용한다.
PR에 코드 커버리지 정보를 담은 댓글을 자동으로 달아준다.
Action 탭에서 Jacoco 결과를 다운로드 받을 수도 있다.