Было трудно найти актуальный способ сделать это, поэтому я решил сэкономить время всем, кто будет искать это в будущем.
Без лишних слов, вот .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/jacoco-report@v1.2
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 в случае недостаточного покрытия, но он все равно возвращает ненулевой код выхода, что нам и нужно.
Некоторые примечания:
- Зависимости Maven кэшируются. Последующие запуски должны быть намного быстрее, чем начальный.
- Python необходим, потому что я не смог найти удобный способ перевести число покрытия, которое выдает jacoco-report (которое в итоге получается как строка), в float в Bash.
- madrapps/jacoco-report не является необязательным, хотя вы можете отключить комментарий, который он добавляет в PR, если хотите. Он необходим, поскольку выводит переменные
steps.jacoco.outputs.coverage-overall
иsteps.jacoco.outputs.coverage-changed-files
.