Skip to content

Commit

Permalink
build: Code Coverage for Nightly Build Workflows (#6635)
Browse files Browse the repository at this point in the history
Added java coverage to the Nightly Check CI according to the following
contract:
- Coverage only runs on JVM 21
- Coverage runs on a schedule for any main repo branch
- Coverage runs On Push on any branch (including forks) that starts with
"coverage/"
- Coverage is collected from separate jobs into a combined report
uploaded as an Github artifact
  • Loading branch information
stanbrub authored Feb 13, 2025
1 parent 62f325a commit 953c91e
Show file tree
Hide file tree
Showing 2 changed files with 74 additions and 7 deletions.
70 changes: 67 additions & 3 deletions .github/workflows/nightly-check-ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ on:
# 2AM EST == 6AM UTC
- cron: '0 6 * * *'
push:
branches: [ 'nightly/**', 'release/v*', 'dependabot/**' ]
branches: [ 'nightly/**', 'release/v*', 'dependabot/**', 'coverage/**']

jobs:
nightly:
Expand All @@ -21,6 +21,8 @@ jobs:
concurrency:
group: ${{ matrix.gradle-task }}-${{ matrix.test-jvm-version }}-${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
env:
COVER: ${{ (github.event_name == 'schedule' || startsWith(github.ref_name, 'coverage/')) && matrix.test-jvm-version == '21' }}
steps:
- name: Checkout
uses: actions/checkout@v4
Expand Down Expand Up @@ -66,8 +68,16 @@ jobs:
.github/scripts/gradle-properties.sh >> gradle.properties
cat gradle.properties
- name: Run gradle ${{ matrix.gradle-task }} on java ${{ matrix.test-jvm-version }}
run: ./gradlew --scan --continue --rerun-tasks ${{ matrix.gradle-task }} -PtestRuntimeVersion=${{ matrix.test-jvm-version }}
- name: Run gradle ${{ matrix.gradle-task }} on java ${{ matrix.test-jvm-version }} with coverage=${{ env.COVER }}
run: ./gradlew --scan --continue --rerun-tasks ${{ matrix.gradle-task }} -PtestRuntimeVersion=${{ matrix.test-jvm-version }} -Pcoverage.enabled=$COVER

- name: Upload Coverage Results
if: ${{ env.COVER == 'true' }}
uses: actions/upload-artifact@v4
with:
name: coverage-${{ matrix.gradle-task }}-results
path: |
**/build/jacoco/*.exec
- name: Upload Test Results
uses: actions/upload-artifact@v4
Expand Down Expand Up @@ -111,3 +121,57 @@ jobs:
}
env:
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_NIGHTLY_FAILURE }}

combined-coverage-report:
if: ${{ github.event_name == 'schedule' || startsWith(github.ref_name, 'coverage/') }}
needs: nightly
runs-on: ubuntu-24.04
steps:
- name: Checkout
uses: actions/checkout@v4
with:
lfs: true

- name: Download Coverage Results
uses: actions/download-artifact@v4
with:
pattern: coverage-*-results
merge-multiple: true

- name: Setup JDK 21
id: setup-java-21
uses: actions/setup-java@v4
with:
distribution: 'temurin'
java-version: '21'

- name: Setup JDK 11
id: setup-java-11
uses: actions/setup-java@v4
with:
distribution: 'temurin'
java-version: '11'

- name: Setup Gradle
uses: gradle/actions/setup-gradle@v4

- name: Set JAVA_HOME
run: echo "JAVA_HOME=${{ steps.setup-java-11.outputs.path }}" >> $GITHUB_ENV

- name: Setup gradle properties
run: |
.github/scripts/gradle-properties.sh >> gradle.properties
cat gradle.properties
- name: Run gradle ${{ matrix.gradle-task }}
run: |
./gradlew -Pcoverage.enabled=true jacocoTestReport
./gradlew -Pcoverage.enabled=true coverage:coverage-merge
- name: Upload Combined Coverage Results
uses: actions/upload-artifact@v4
with:
name: combined-coverage-results
path: |
coverage/build/reports/jacoco/**
coverage/build/reports/coverage/**
11 changes: 7 additions & 4 deletions coverage/gather-coverage.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,16 +19,17 @@
os.makedirs(coverage_dir)

# Aggregate and normalize coverage for java projects
print("Aggregating Java Coverage")
input_glob = proj_root_dir + '/build/reports/jacoco/jacoco-merge/jacoco-merge.csv'
with open(f'{coverage_dir}/java-coverage.csv', 'w', newline='') as outfile:
csv_writer = csv.writer(outfile)
csv_writer.writerow(['Language','Project','Package','Class','Missed','Covered'])
csv_writer.writerow(['Language','Package','Class','Missed','Covered'])
for filename in glob.glob(input_glob, recursive = True):
with open(filename, 'r') as csv_in:
csv_reader = csv.reader(csv_in)
next(csv_reader, None)
for row in csv_reader:
new_row = ['java',row[0],row[1],row[2],row[3],row[4]]
new_row = ['java',row[1],row[2],row[3],row[4]]
csv_writer.writerow(new_row)

# Load packages to be excluded from the aggregated coverage CSV
Expand All @@ -39,8 +40,10 @@
with open(coverage_output_path, 'w', newline='') as outfile:
csv_writer = csv.writer(outfile)
for csv_file in glob.glob(coverage_input_glob):
if os.path.basename(csv_file) == "all-coverage.csv": continue
print('Merging', os.path.basename(csv_file))
with open(csv_file, 'r') as csv_in:
for row in csv.reader(csv_in):
if row[2] in excludes: continue
new_row = [row[0],row[1],row[2],row[3],row[4],row[5]]
if row[1] in excludes: continue
new_row = [row[0],row[1],row[2],row[3],row[4]]
csv_writer.writerow(new_row)

0 comments on commit 953c91e

Please sign in to comment.