PR을 올릴 때 Github Actions로 테스트를 돌려서 해당 PR에 대해 깨지는 테스트가 없는지 확인하는 세팅을 해보자.
Github Actions에 Gradle Test 추가
.github/workflows/{파일명}.yml 으로 Github Actions 파일을 추가한다.
name: PR Test
on:
pull_request:
branches: [ master ] # master branch에 PR을 보낼 때 실행
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Set up JDK 11
uses: actions/setup-java@v1
with:
java-version: 11
# Gradle wrapper 파일 실행 권한주기
- name: Grant execute permission for gradlew
run: chmod +x gradlew
# Gradle test를 실행한다
- name: Test with Gradle
run: ./gradlew --info test
위 파일을 프로젝트에 추가하고 테스트가 깨지는 branch를 생성한 뒤 master branch로 PR을 올려 Github Actions가 돌아가는지 확인한다.
Details
를 통해 다음과 같이 Actions 진행을 단계별로 확인할 수 있다.
깨지는 테스트를 추가하였기 때문에 빨간색으로 Action이 실패된 것을 확인할 수 있고
로그를 통해 어떤 테스트가 깨졌는지도 확인 가능하다.
Test Report 추가
일단 Github Actions
를 통해 PR 시 테스트를 실행하도록 설정하였다.
하지만 테스트가 깨지면 로그를 확인하여 어떤 테스트가 깨지는지를 일일히 확인하기는 너무 불편하다.
로그를 확인하는 대신 JUnit 테스트 종료 시 나오는 Report를 통해 결과를 확인할 수 있다면 좋을 것 같다.
artifacts를 통해 JUnit Report를 저장하는 방식도 있지만 따로 Report를 다운받아야하는 과정이 너무 불편하다.
artifacts를 사용하는 대신 테스트 결과를 확인하기 위해 Publish Unit Test Results(https://github.com/marketplace/actions/publish-unit-test-results)를 사용해보자.
Github Actions yml 파일에 다음과 같이 Publish Unit Test Results
step을 추가한다.
name: PR Test
on:
pull_request:
branches: [ master ]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Set up JDK 11
uses: actions/setup-java@v1
with:
java-version: 11
- name: Grant execute permission for gradlew
run: chmod +x gradlew
- name: Test with Gradle
run: ./gradlew --info test
# 테스트 후 Result를 보기위해 Publish Unit Test Results step 추가
- name: Publish Unit Test Results
uses: EnricoMi/publish-unit-test-result-action@v1
if: ${{ always() }} # 테스트가 실패하여도 Report를 보기 위해 `always`로 설정
with:
files: build/test-results/**/*.xml
with.files
경로는 테스트 시 나오는 JUnit report xml 파일을 가리킨다.
이렇게 yml에 설정을 추가한 뒤 다시 PR 요청을 보내면 다음과 같이 테스트 결과를 확인할 수 있다.
또 깨지는 테스트에 대해 어떤 commit으로 인해 테스트가 깨지는지와 테스트 로그도 확인할 수 있다.
Caching 추가
플러스 알파로 Gradle dependency 캐싱을 하여 테스트 속도를 빠르게 해보자.
참고:
https://docs.github.com/en/actions/guides/building-and-testing-java-with-gradle#caching-dependencies
Github Actions yml 파일에 Cache Gradle packages
, Cleanup Gradle Cache
step을 추가하면 cache가 적용된다.
name: PR Test
on:
pull_request:
branches: [ master ]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Set up JDK 11
uses: actions/setup-java@v1
with:
java-version: 11
# 추가
- name: Cache Gradle packages
uses: actions/cache@v2
with:
path: |
~/.gradle/caches
~/.gradle/wrapper
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
restore-keys: |
${{ runner.os }}-gradle-
- name: Grant execute permission for gradlew
run: chmod +x gradlew
- name: Test with Gradle
run: ./gradlew --info test
- name: Publish Unit Test Results
uses: EnricoMi/publish-unit-test-result-action@v1
if: ${{ always() }}
with:
files: build/test-results/**/*.xml
# 추가
- name: Cleanup Gradle Cache
# Remove some files from the Gradle cache, so they aren't cached by GitHub Actions.
# Restoring these files from a GitHub Actions cache might cause problems for future builds.
if: ${{ always() }}
run: |
rm -f ~/.gradle/caches/modules-2/modules-2.lock
rm -f ~/.gradle/caches/modules-2/gc.properties
Bonus) 테스트가 통과해야 PR merge 가능하도록 설정하기
Repository에 아무런 설정을 하지 않은 상태라면 Github Actions에 실패가 된 것이 있어도 merge가 가능하다.
팀원들간에 모든 Action이 통과해야 merge하도록 약속을 할 수 있지만 이를 강제하면 더 좋을 것 같다.
Github repository 설정을 통해 이를 설정해보자.
Repository Settings
→ Branches
→ Add rule
을 선택한다.
Branch name pattern
을 설정하고,Require status checks to pass before merging
설정을 통해 merge를 위해 통과해야할 Action들을 선택할 수 있다.
설정 후에 다음과 같이 merge를 못하도록 막혀져있는 것을 확인할 수 있다.
(지금은 admin 이라 강제로 merge할 수 있게 merge 버튼이 활성화돼있지만, admin이 아닌 경우 merge 버튼이 비활성화 된다)
'Java & Kotlin > Spring' 카테고리의 다른 글
Spring Security 인증 기본 구조 (0) | 2021.07.18 |
---|---|
Spring Kafka 간단하게 맛보기 (0) | 2021.07.11 |
Spring JPA Querydsl 세팅 (with Kotlin) (0) | 2021.06.07 |
Rest Assured 테스트 시 redirect 막기 (0) | 2021.06.03 |
MySQL Docker container를 이용한 통합 테스트 시 한글 깨짐 이슈 (0) | 2021.04.07 |
댓글