[맛침반] 맛침반의 CI는 최선인가 - 테스트 실행

6720·2023년 12월 20일

프로젝트 맛침반

목록 보기
5/12

이번 목표

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

테스트는 빌드에서 진행한다

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

Publish-Unit-Test-Results

테스트 결과를 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에만 테스트 검증이 적용되도록 함.

권한 설정

트러블 슈팅#1 403 Forbidden

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의 경우는 해당 글에서 제시한 최소 권한에 포함되었기 때문에 부여함.

checkout

- 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 명령어 권한을 부여하여 테스트를 준비함.

Gradle Caching

- 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 캐싱을 하여 테스트 속도를 빠르게 할 수 있음.

  • Gradle Caching: Gradle 빌드 캐시를 관리하기 위한 Github Actions의 설정 부분
    • actions/cache@v3: Github Action에서 제공하는 캐시 액션 사용
      • 이전 빌드에서 생성된 캐시를 저장하고 다음 빌드에서 재사용함
    • with
      • path: 캐시할 디렉터리들의 경로 지정
      • key: 캐시를 식별하는 고유 키 지정
      • restore-keys: 이전 빌드에서 사용된 캐시 찾을 때 사용하는 키를 설정
  • Cleanup Gradle Cache: Gradle 캐시 정리를 위한 부분
    • 항상 실행하도록 설정
    • run에 적힌 두 파일(modules-2.lock, gc.properties)을 삭제

테스트 실행 및 결과 PR 등록

- 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 코멘트로 결과 등록

Action jUnit Report

- 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 코멘트 확인하는 연계가 좋아보여서 추가함.

테스트가 통과해야 merge 가능하도록 설정

리퍼지토리 > Settings > Branches > Add rule

  • Require status checks to pass before merging: 머지하기 전에 상태 검사를 통과해야 함.
  • Require branches to be up to date before merging: 머지하기 전에 분기가 최신 상태여야 함.
    • Status checks that are requried: 필요한 상태 확인
      • 여기에 Unit Test Results를 추가하도록 함.

참고 자료

profile
뭐라도 하자

0개의 댓글