Github 작업 - Maven + Jacoco를 사용하여 코드 커버리지로 PR 병합 제어

5695 단어 javagithubtestingcicd
이 작업을 수행하는 최신 방법을 찾는 데 약간의 어려움이 있었기 때문에 언젠가는 이것을 찾는 사람을 구할 것이라고 생각합니다.

다음은 .github/workflows/.yml입니다.

name: Code Coverage

on:
  pull_request:
    branches: [ "master" ]
  push:
    branches: [ "master" ]

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - name: Set up JDK 17
        uses: actions/setup-java@v3
        with:
          java-version: 17
          distribution: 'temurin'
          cache: maven

      - name: Generate Coverage Report
        run: |
          mvn -B package --file pom.xml

      - name: Upload Report
        uses: 'actions/upload-artifact@v2'
        with:
          name: jacoco-report
          path: ${{ github.workspace }}/target/site/jacoco/jacoco.xml

      - name: Add coverage to PR
        id: jacoco
        uses: madrapps/[email protected]
        with:
          paths: ${{ github.workspace }}/target/site/jacoco/jacoco.xml
          token: ${{ secrets.GITHUB_TOKEN }}
          min-coverage-overall: 80
          min-coverage-changed-files: 80
          title: Code Coverage

      - name: Save Coverage To Environment Variable
        run: |
          echo "TOTAL_COVERAGE=${{ steps.jacoco.outputs.coverage-overall }}" >> $GITHUB_ENV
          echo "CHANGED_FILES_COVERAGE=${{ steps.jacoco.outputs.coverage-changed-files }}" >> $GITHUB_ENV

      - name: Print & Check Coverage Info
        run: |
          import os
          import sys
          print("Total Coverage: " + str(os.environ["TOTAL_COVERAGE"]))
          print("Changed Files Coverage: " + str(os.environ["CHANGED_FILES_COVERAGE"]))
          if float(os.environ["TOTAL_COVERAGE"]) < 80 or float(os.environ["CHANGED_FILES_COVERAGE"]) < 80:
            print("Insufficient Coverage!")
            sys.exit(-1) # Cause Status Check Failure due to noncompliant coverage
          sys.exit(0)
        shell: python


끝 부분의 Python 스크립트는 적용 범위가 충분하지 않은 경우 어떤 이유로 기술적으로 255를 반환하지만 여전히 0이 아닌 종료 코드를 반환합니다. 이것이 우리에게 필요한 것입니다.

참고 사항:
  • Maven 종속성이 캐시됩니다. 후속 실행은 초기 실행보다 훨씬 빨라야 합니다.
  • jacoco-report가 우리에게 제공하는 적용 범위 번호(문자열로 끝남)를 Bash의 부동 소수점으로 구문 분석하는 편리한 방법을 찾을 수 없기 때문에 Python이 필요합니다.
  • madrapps/jacoco-report는 선택 사항이 아니지만 원하는 경우 PR에 추가하는 설명을 비활성화할 수 있습니다. steps.jacoco.outputs.coverage-overallsteps.jacoco.outputs.coverage-changed-files 변수를 출력하기 때문에 필요합니다.
  • 좋은 웹페이지 즐겨찾기