Java/Spring Boot 애플리케이션의 CI/CD를 GitHub Actions로 구축한다면 매우 유용한 action이 있다.
문제 상황
Java/Spring Boot 애플리케이션의 CI 파이프라인을 GitHub Actions로 구축할 때 gradle build를 통해 전체 테스트를 진행했다. Actions CI 스크립트는 아래와 같았다.
name: Java CI with Gradle and MySQL
on:
pull_request:
branches:
- main
- 'feat/**'
- 'refactor/**'
- 'fix/**'
permissions:
contents: read
checks: write
pull-requests: write
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: 체크아웃
uses: actions/checkout@v4
with:
token: ${{ secrets.SUBMODULES_SECRET }}
submodules: true
- name: JDK 17 설치
uses: actions/setup-java@v4
with:
java-version: 17
distribution: 'corretto'
- name: Gradle 캐싱
uses: gradle/actions/setup-gradle@v3
- name: 빌드 권한 부여
run: chmod +x gradlew
- name: 프로젝트 빌드
run: ./gradlew build --parallel
어떤 이유던 테스트에 실패할 때가 있다. 실패한 테스트를 찾기 위해 GitHub Actions 페이지의 로그를 살펴보아야 한다.
어떤 테스트에 실패했고, 어떤 예외가 발생했는지 알 수 있다. 하지만 AssertJ나 Hamcrest 같은 라이브러리를 사용하면 예외가 일반적인 자바 예외가 아닌 `AssertionFailedError`등의 예외가 발생한다.
로컬 디바이스에선 성공하지만 CI runner에서만 실패하는 경우도 있다. 정확한 예상 데이터와 실제 데이터 등은 생성되는 report에서 확인할 수 있으나, actions runner는 별도의 디바이스이니 테스트 리포트를 확인하기 위한 별도의 스크립트가 필요했다.
하지만 스크립트를 직접 작성하는 것은 매우 번거로울 것이라고 생각하고, 누군가 JUnit 테스트 리포트를 알려주는 actions를 만들지 않았을까 싶었다.
`mikepenz/actions-junit-report`
역시 이런 actions는 존재했다. https://github.com/marketplace/actions/junit-report-action
JUnit Report Action - GitHub Marketplace
Report JUnit test results as annotations on Github Pull Request [junit]
github.com
사용법은 위 링크에도 잘 나와있지만, 아래와 같이 간단하게 사용할 수 있다.
- name: 테스트 리포트 작성
uses: mikepenz/action-junit-report@v5
if: success() || failure() # always run even if the previous step fails
with:
report_paths: '**/build/test-results/test/TEST-*.xml'
기본적으로 빌드가 실패하면 이 태스크가 동작하지 않아서 테스트 리포트가 생성되지 않는다. 실패한 테스트를 보는 목적이 주기 때문에 job이 실패하더라도 항상 태스크가 동작하도록 `if: success() || failure()`을 추가해야한다.
`report_paths`변수는 일반적인 JUnit 테스트 리포트가 생성되는 위치이기 때문에, 멀티모듈이더라도 저렇게 작성하면 된다. 만약 테스트 리포트 장소가 바뀐다면, 해당 변수값을 변경해주면 된다.
이 외에도 PR에 코멘트를 추가하는 `comment`나 `summary`, `exclude_sources`등의 변수들로 설정이 유연하게 가능하다.
적용
적용된 CI 파이프라인 코드는 아래와 같다.
name: Java CI with Gradle and MySQL
on:
pull_request:
branches:
- main
- 'feat/**'
- 'refactor/**'
- 'fix/**'
permissions:
contents: read
checks: write
pull-requests: write
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: 체크아웃
uses: actions/checkout@v4
with:
token: ${{ secrets.SUBMODULES_SECRET }}
submodules: true
- name: JDK 17 설치
uses: actions/setup-java@v4
with:
java-version: 17
distribution: 'corretto'
- name: Gradle 캐싱
uses: gradle/actions/setup-gradle@v3
- name: 빌드 권한 부여
run: chmod +x gradlew
- name: 프로젝트 빌드
run: ./gradlew build --parallel
- name: 테스트 리포트 작성
uses: mikepenz/action-junit-report@v5
if: success() || failure() # always run even if the previous step fails
with:
report_paths: '**/build/test-results/test/TEST-*.xml'
적용 이후에 실패한 테스트에 대한 리포트 내용을 actions 탭에 생성해준다.
로컬 PC에서 돌리듯이 assertion 결과를 확인할 수 있고, `comment` 변수를 true로 설정하면 PR 코멘트로도 생성해준다.
'DevOps > CICD' 카테고리의 다른 글
[GitHub Actions] GitHub Actions에서 AWS Public ECR 로그인 실패 (0) | 2024.05.23 |
---|---|
[GitHub Actions, Gradle] Gradle build와 GitHub Actions CI에 Checkstyle 추가 (0) | 2024.05.20 |
[GitHub Actions] GitHub Actions와 Github Secrets로 CI 도입 (1) | 2024.04.18 |