본문 바로가기
Java & Kotlin/Spring

Github Actions로 PR 시 테스트를 돌려보자

by devson 2021. 4. 21.

PR을 올릴 때 Github Actions로 테스트를 돌려서 해당 PR에 대해 깨지는 테스트가 없는지 확인하는 세팅을 해보자.

코드는 여기에 예제 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를 다운받아야하는 과정이 너무 불편하다.

참고: https://docs.github.com/en/actions/guides/building-and-testing-java-with-gradle#packaging-workflow-data-as-artifacts

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 SettingsBranchesAdd rule 을 선택한다.

Branch name pattern을 설정하고,
Require status checks to pass before merging 설정을 통해 merge를 위해 통과해야할 Action들을 선택할 수 있다.

설정 후에 다음과 같이 merge를 못하도록 막혀져있는 것을 확인할 수 있다.
(지금은 admin 이라 강제로 merge할 수 있게 merge 버튼이 활성화돼있지만, admin이 아닌 경우 merge 버튼이 비활성화 된다)

 

댓글