CI/CD를 공부하기 위해 포스팅을 작성했는데, 맛침반 CI에는 테스트 코드가 없음을 확인함.
CI/CD를 제대로 사용하기 위해 자동 테스트 기능을 추가하자

다음은 메인 브랜치로 푸시했을 때 설정해놓은 CI/CD 중 빌드에 속함.
빌드 과정에는 테스트 실행 과정이 들어가있으며, 테스트가 통과되지 않으면 빌드 또한 진행되지 않음.
-> 그렇다면 테스트 검증 기능도 있어야 할 것 같은데?


테스트 결과를 PR 코멘트로 등록시켜 시각적으로 확인할 수 있도록 함.
어디에서 틀렸는지 확인할 수 있도록 커밋까지 연결시키기 때문에 테스트 관리에 좋을 것 같아서 사용하게 됨.
name: PR Test
on:
pull_request:
branches: [ "main" ]
permissions:
checks: write
contents: read
pull-requests: write
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Set up JDK 11
uses: actions/setup-java@v3
with:
java-version: '11'
distribution: 'temurin'
- name: Grant execute permission for gradlew
run: chmod +x gradlew
- name: Gradle Caching
uses: actions/cache@v3
with:
path: |
~/.gradle/caches
~/.gradle/wrapper
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
restore-keys: |
${{ runner.os }}-gradle-
- 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: Action jUnit Report
uses: mikepenz/action-junit-report@v3
if: always()
with:
report_paths: 'build/test-results/test/TEST-*.xml'
token: ${{ github.token }}
- name: Cleanup Gradle Cache
if: ${{ always() }}
run: |
rm -f ~/.gradle/caches/modules-2/modules-2.lock
rm -f ~/.gradle/caches/modules-2/gc.properties
on:
pull_request:
branches: [ "main" ]
현재 main 브랜치에 푸시하게 되면 빌드부터 배포까지 자동으로 진행되도록 설정되어 있음.
그런데 PR 과정에서 아무런 검증 없이 main 푸시하는 것은 굉장히 불안정하다고 생각되어 PR에만 테스트 검증이 적용되도록 함.

Warning: Request POST /repos/Matchimban/backend/check-runs failed with 403: Forbidden
Publish-Unit-Test-Results에는 기본적으로 요구하는 권한이 필요하며, 이는 yaml 파일의 permissions 항목에서 추가할 수 있음.

다음은 publish-unit-test-results의 공식 문서에서 요구하는 권한이며, 맛침반은 public이므로 checks와 pull-request의 권한을 추가함.
permissions:
checks: write
contents: read
pull-requests: write
contents의 경우는 해당 글에서 제시한 최소 권한에 포함되었기 때문에 부여함.
- uses: actions/checkout@v3
프로젝트를 테스트하기 위해 우선 리포지토리를 가져올 필요가 있음.
맛침반은 public이므로 별도의 설정 없이 checkout 한줄로 끝냄.
- name: Set up JDK 11
uses: actions/setup-java@v3
with:
java-version: '11'
distribution: 'temurin'
- name: Grant execute permission for gradlew
run: chmod +x gradlew
테스트는 빌드와 마찬가지로 gradle이 주도하기 때문에 JDK를 설치하고 gradlew 명령어 권한을 부여하여 테스트를 준비함.
- name: Gradle Caching
uses: actions/cache@v3
with:
path: |
~/.gradle/caches
~/.gradle/wrapper
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
restore-keys: |
${{ runner.os }}-gradle-
... (테스트 전부 마친 후)
- name: Cleanup Gradle Cache
if: ${{ always() }}
run: |
rm -f ~/.gradle/caches/modules-2/modules-2.lock
rm -f ~/.gradle/caches/modules-2/gc.properties
Gradle dependency 캐싱을 하여 테스트 속도를 빠르게 할 수 있음.
- 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
테스트를 진행하며, 테스트를 성공하던 실패하던 해당 PR 코멘트로 결과 등록
- name: Action jUnit Report
uses: mikepenz/action-junit-report@v3
if: always()
with:
report_paths: 'build/test-results/test/TEST-*.xml'
token: ${{ github.token }}
오류가 발생한 코드라인에 Check 코멘트를 자동으로 생성함.
Publish-Unit-Test-Results로 결과 확인 후에 커밋 타고 들어가서 Check 코멘트 확인하는 연계가 좋아보여서 추가함.
리퍼지토리 > Settings > Branches > Add rule
