Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
279 changes: 233 additions & 46 deletions .github/workflows/pr-check.yml
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ jobs:
}

build:
name: Build (JDK ${{ matrix.java }} / ${{ matrix.arch }})
name: Build ${{ matrix.os-name }}(JDK ${{ matrix.java }} / ${{ matrix.arch }})
needs: pr-lint
runs-on: ${{ matrix.runner }}
strategy:
Expand All @@ -76,9 +76,19 @@ jobs:
include:
- java: '8'
runner: ubuntu-latest
os-name: ubuntu
arch: x86_64
- java: '17'
runner: ubuntu-24.04-arm
os-name: ubuntu
arch: aarch64
- java: '8'
runner: macos-26-intel
os-name: macos
arch: x86_64
- java: '17'
runner: macos-latest
os-name: macos
arch: aarch64

steps:
Expand All @@ -100,65 +110,240 @@ jobs:
restore-keys: ${{ runner.os }}-${{ matrix.arch }}-gradle-

- name: Build
run: ./gradlew clean build -x test
run: ./gradlew clean build --no-daemon

checkstyle:
name: Checkstyle
docker-build-centos8:
name: Build centos8 (JDK 8 / x86_64)
needs: pr-lint
runs-on: ubuntu-latest

container:
image: rockylinux:8

env:
GRADLE_USER_HOME: /github/home/.gradle

steps:
- uses: actions/checkout@v4
- name: Checkout code
uses: actions/checkout@v4

- name: Set up JDK 8
uses: actions/setup-java@v4
with:
java-version: '8'
distribution: 'temurin'
- name: Install dependencies (Rocky 8 + JDK8)
run: |
set -euxo pipefail
dnf -y install java-1.8.0-openjdk-devel git wget unzip which jq bc curl
dnf -y groupinstall "Development Tools"

- name: Cache Gradle packages
- name: Check Java version
run: java -version

- name: Cache Gradle
uses: actions/cache@v4
with:
path: |
~/.gradle/caches
~/.gradle/wrapper
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle', '**/gradle-wrapper.properties') }}
restore-keys: ${{ runner.os }}-gradle-
/github/home/.gradle/caches
/github/home/.gradle/wrapper
key: ${{ runner.os }}-centos8-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
restore-keys: |
${{ runner.os }}-centos8-gradle-

- name: Run Checkstyle
run: ./gradlew :framework:checkstyleMain :framework:checkstyleTest :plugins:checkstyleMain
- name: Prepare checkstyle config copy
run: |
set -euxo pipefail
cp -f config/checkstyle/checkStyle.xml config/checkstyle/checkStyleAll.xml || true

- name: Upload Checkstyle reports
if: failure()
- name: Grant execute permission
run: chmod +x gradlew

- name: Stop Gradle daemon
run: ./gradlew --stop || true

- name: Build
run: ./gradlew clean build --no-daemon

- name: Generate JaCoCo report
run: ./gradlew jacocoTestReport --no-daemon

- name: Upload JaCoCo artifacts
uses: actions/upload-artifact@v4
with:
name: checkstyle-reports
name: jacoco-centos8
path: |
framework/build/reports/checkstyle/
plugins/build/reports/checkstyle/
**/build/reports/jacoco/test/jacocoTestReport.xml
**/build/reports/**
**/build/test-results/**
if-no-files-found: error

test:
name: Unit Tests (JDK ${{ matrix.java }} / ${{ matrix.arch }})
runs-on: ${{ matrix.runner }}
needs: build
timeout-minutes: 60
strategy:
fail-fast: false
matrix:
include:
- java: '8'
runner: ubuntu-latest
arch: x86_64
- java: '17'
runner: ubuntu-24.04-arm
arch: aarch64
docker-build-debian11:
name: Build debian11 (JDK 8 / x86_64)
needs: pr-lint
runs-on: ubuntu-latest

container:
image: eclipse-temurin:8-jdk

defaults:
run:
shell: bash

env:
GRADLE_USER_HOME: /github/home/.gradle

steps:
- name: Checkout code
uses: actions/checkout@v4

- name: Install dependencies (Debian + build tools)
run: |
set -euxo pipefail
apt-get update
apt-get install -y git wget unzip build-essential curl jq

- name: Check Java version
run: java -version

- name: Cache Gradle
uses: actions/cache@v4
with:
path: |
/github/home/.gradle/caches
/github/home/.gradle/wrapper
key: ${{ runner.os }}-debian11-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
restore-keys: |
${{ runner.os }}-debian11-gradle-

- name: Grant execute permission
run: chmod +x gradlew

- name: Build
run: ./gradlew clean build --no-daemon


coverage-gate:
name: Coverage Gate (from centos8 build)
needs: docker-build-centos8
runs-on: ubuntu-latest

permissions:
contents: read

defaults:
run:
shell: bash

steps:
- name: Download JaCoCo artifacts (centos8)
uses: actions/download-artifact@v4
with:
name: jacoco-centos8
path: artifacts/jacoco-centos8

- name: Upload coverage to Codecov
uses: codecov/codecov-action@v5
with:
files: |
artifacts/jacoco-centos8/**/jacocoTestReport.xml
token: ${{ secrets.CODECOV_TOKEN }}
fail_ci_if_error: true

- name: Wait for Codecov processing
run: sleep 3m

- name: Coverage gate via Codecov GraphQL
env:
CODECOV_OWNER: tronprotocol
CODECOV_REPO: java-tron
COMMIT_ID: ${{ github.event.pull_request.head.sha }}
BASE_BRANCH: ${{ github.event.pull_request.base.ref }}
# if ADDED_NUM is 0,skip patch coverage gate
ADDED_NUM: "0"
run: |
set -euxo pipefail
sudo apt-get update
sudo apt-get install -y jq bc curl

echo "commit: $COMMIT_ID"
echo "base branch: $BASE_BRANCH"

# 1) current commit coverage、parent commit coverage、patch coverage
currentRes=$(
curl -sS 'https://api.codecov.io/graphql/github' \
-H 'content-type: application/json' \
--data '{
"query": "query Commit($owner: String!, $repo: String!, $commitid: String!, $filters: ImpactedFilesFilters, $isTeamPlan: Boolean!) { owner(username: $owner) { repository(name: $repo) { ... on Repository { commit(id: $commitid) { coverageAnalytics { totals { coverage: percentCovered } } parent { coverageAnalytics { totals { coverage: percentCovered } } } compareWithParent { ... on Comparison { patchTotals { coverage: percentCovered } } } } } } } }",
"variables": {
"provider": "github",
"owner": "'"$CODECOV_OWNER"'",
"repo": "'"$CODECOV_REPO"'",
"commitid": "'"$COMMIT_ID"'",
"filters": {},
"isTeamPlan": false
}
}' | jq -r '.data.owner.repository.commit'
)

self_cov=$(echo "$currentRes" | jq -r '.coverageAnalytics.totals.coverage // 0')
base_cov=$(echo "$currentRes" | jq -r '.parent.coverageAnalytics.totals.coverage // 0')
patch_cov=$(echo "$currentRes" | jq -r '.compareWithParent.patchTotals.coverage // 0')

echo "self_cov=$self_cov"
echo "base_cov(parent commit)=$base_cov"
echo "patch_cov=$patch_cov"

# 2) base branch head coverage(target)
parent_cov=$(
curl -sS 'https://api.codecov.io/graphql/github' \
-H 'content-type: application/json; charset=utf-8' \
--data '{
"query": "query GetRepoCoverage($owner: String!, $repo: String!, $branch: String!) { owner(username: $owner) { repository(name: $repo) { ... on Repository { branch(name: $branch) { head { coverageAnalytics { totals { percentCovered } } } } } } } }",
"variables": {
"owner": "'"$CODECOV_OWNER"'",
"repo": "'"$CODECOV_REPO"'",
"branch": "'"$BASE_BRANCH"'"
}
}' | jq -r '.data.owner.repository.branch.head.coverageAnalytics.totals.percentCovered // 0'
)

echo "parent_cov(base branch head)=$parent_cov"

# 3) Gate rule
if [ "$(echo "$self_cov <= 0" | bc)" -eq 1 ]; then
echo "get current commit coverage failed !!!!"
exit 1
fi

if [ "$(echo "$self_cov - $parent_cov < 0" | bc)" -eq 1 ]; then
echo "self_cov: $self_cov target: $parent_cov"
echo "111-target code coverage has decreased, please add unit test!"
exit 1
fi

if [ "$(echo "$self_cov - $base_cov < 0" | bc)" -eq 1 ]; then
echo "self_cov: $self_cov parent: $base_cov"
echo "222-parent code coverage has decreased, please add unit test!"
# exit 1 # skip compare ?
fi

if [ "$ADDED_NUM" -eq 0 ]; then
echo "no need to compare patch coverage ............"
exit 0
fi

if [ "$(echo "$patch_cov <= 80" | bc)" -eq 1 ]; then
echo "patch coverage is too low !!!!"
# exit 1 # skip compare ?
fi

checkstyle:
name: Checkstyle
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v4

- name: Set up JDK ${{ matrix.java }}
- name: Set up JDK 8
uses: actions/setup-java@v4
with:
java-version: ${{ matrix.java }}
java-version: '8'
distribution: 'temurin'

- name: Cache Gradle packages
Expand All @@ -167,16 +352,18 @@ jobs:
path: |
~/.gradle/caches
~/.gradle/wrapper
key: ${{ runner.os }}-${{ matrix.arch }}-gradle-${{ hashFiles('**/*.gradle', '**/gradle-wrapper.properties') }}
restore-keys: ${{ runner.os }}-${{ matrix.arch }}-gradle-
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle', '**/gradle-wrapper.properties') }}
restore-keys: ${{ runner.os }}-gradle-

- name: Run tests
run: ./gradlew test
- name: Run Checkstyle
run: ./gradlew :framework:checkstyleMain :framework:checkstyleTest :plugins:checkstyleMain

- name: Upload test reports
- name: Upload Checkstyle reports
if: failure()
uses: actions/upload-artifact@v4
with:
name: test-reports-${{ matrix.arch }}
name: checkstyle-reports
path: |
**/build/reports/tests/
framework/build/reports/checkstyle/
plugins/build/reports/checkstyle/

Original file line number Diff line number Diff line change
Expand Up @@ -343,7 +343,7 @@ private static String getCommitIdAbbrev() {
InputStream in = Thread.currentThread()
.getContextClassLoader().getResourceAsStream("git.properties");
properties.load(in);
} catch (IOException e) {
} catch (Exception e) {
logger.warn("Load resource failed,git.properties {}", e.getMessage());
}
return properties.getProperty("git.commit.id.abbrev");
Expand Down
2 changes: 2 additions & 0 deletions gradle.properties
Original file line number Diff line number Diff line change
@@ -1,2 +1,4 @@
org.gradle.parallel=true
org.gradle.jvmargs=-Xms1g
org.gradle.caching=true
org.gradle.daemon=false
Loading