chore: fix outdated content across docs/ and root-level docs/scripts #128
Workflow file for this run
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: PR Build | |
| on: | |
| pull_request: | |
| branches: [ 'master','develop', 'release_**' ] | |
| types: [ opened, synchronize, reopened ] | |
| paths-ignore: [ '**/*.md', '.gitignore', '**/.gitignore', '.editorconfig', | |
| '.gitattributes', 'docs/**', 'CHANGELOG', '.github/ISSUE_TEMPLATE/**', | |
| '.github/PULL_REQUEST_TEMPLATE/**', '.github/CODEOWNERS' ] | |
| workflow_dispatch: | |
| inputs: | |
| job: | |
| description: 'Job to run: all / macos / ubuntu / rockylinux / debian11' | |
| required: false | |
| default: 'all' | |
| concurrency: | |
| group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} | |
| cancel-in-progress: true | |
| jobs: | |
| build-macos: | |
| name: Build macos26 (JDK ${{ matrix.java }} / ${{ matrix.arch }}) | |
| if: ${{ github.event_name == 'pull_request' || inputs.job == 'all' || inputs.job == 'macos' }} | |
| runs-on: ${{ matrix.runner }} | |
| timeout-minutes: 60 | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| include: | |
| - java: '17' | |
| runner: macos-26 | |
| arch: aarch64 | |
| steps: | |
| - uses: actions/checkout@v5 | |
| - name: Set up JDK ${{ matrix.java }} | |
| uses: actions/setup-java@v5 | |
| with: | |
| java-version: ${{ matrix.java }} | |
| distribution: 'temurin' | |
| - name: Cache Gradle packages | |
| uses: actions/cache@v4 | |
| with: | |
| path: | | |
| ~/.gradle/caches | |
| ~/.gradle/wrapper | |
| key: macos26-${{ matrix.arch }}-gradle-${{ hashFiles('**/*.gradle', '**/gradle-wrapper.properties') }} | |
| restore-keys: macos26-${{ matrix.arch }}-gradle- | |
| - name: Build | |
| run: ./gradlew clean build --no-daemon | |
| build-ubuntu: | |
| name: Build ubuntu24 (JDK 17 / aarch64) | |
| if: ${{ github.event_name == 'pull_request' || inputs.job == 'all' || inputs.job == 'ubuntu' }} | |
| runs-on: ubuntu-24.04-arm | |
| timeout-minutes: 60 | |
| steps: | |
| - uses: actions/checkout@v5 | |
| - name: Set up JDK 17 | |
| uses: actions/setup-java@v5 | |
| with: | |
| java-version: '17' | |
| distribution: 'temurin' | |
| - name: Check Java version | |
| run: java -version | |
| - name: Cache Gradle packages | |
| uses: actions/cache@v4 | |
| with: | |
| path: | | |
| ~/.gradle/caches | |
| ~/.gradle/wrapper | |
| key: ubuntu24-aarch64-gradle-${{ hashFiles('**/*.gradle', '**/gradle-wrapper.properties') }} | |
| restore-keys: ubuntu24-aarch64-gradle- | |
| - name: Build | |
| run: ./gradlew clean build --no-daemon | |
| docker-build-rockylinux: | |
| name: Build rockylinux (JDK 8 / x86_64) | |
| if: ${{ github.event_name == 'pull_request' || inputs.job == 'all' || inputs.job == 'rockylinux' }} | |
| runs-on: ubuntu-latest | |
| timeout-minutes: 60 | |
| container: | |
| image: rockylinux:8 | |
| env: | |
| GRADLE_USER_HOME: /github/home/.gradle | |
| LANG: en_US.UTF-8 | |
| LC_ALL: en_US.UTF-8 | |
| steps: | |
| - name: Checkout code | |
| uses: actions/checkout@v5 | |
| - 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 glibc-langpack-en | |
| dnf -y groupinstall "Development Tools" | |
| - 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: rockylinux-x86_64-gradle-${{ hashFiles('**/*.gradle', '**/gradle-wrapper.properties') }} | |
| restore-keys: | | |
| rockylinux-x86_64-gradle- | |
| - name: Stop Gradle daemon | |
| run: ./gradlew --stop || true | |
| - name: Build | |
| run: ./gradlew clean build --no-daemon | |
| - name: Test with RocksDB engine | |
| run: ./gradlew :framework:testWithRocksDb --no-daemon | |
| docker-build-debian11: | |
| name: Build debian11 (JDK 8 / x86_64) | |
| if: ${{ github.event_name == 'pull_request' || inputs.job == 'all' || inputs.job == 'debian11' }} | |
| runs-on: ubuntu-latest | |
| timeout-minutes: 60 | |
| container: | |
| image: eclipse-temurin:8-jdk # base image is Debian 11 (Bullseye) | |
| defaults: | |
| run: | |
| shell: bash | |
| env: | |
| GRADLE_USER_HOME: /github/home/.gradle | |
| steps: | |
| - name: Checkout code | |
| uses: actions/checkout@v5 | |
| - 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: debian11-x86_64-gradle-${{ hashFiles('**/*.gradle', '**/gradle-wrapper.properties') }} | |
| restore-keys: | | |
| debian11-x86_64-gradle- | |
| - name: Build | |
| run: ./gradlew clean build --no-daemon --no-build-cache | |
| - name: Test with RocksDB engine | |
| run: ./gradlew :framework:testWithRocksDb --no-daemon --no-build-cache | |
| - name: Generate module coverage reports | |
| run: ./gradlew jacocoTestReport --no-daemon | |
| - name: Upload PR coverage reports | |
| uses: actions/upload-artifact@v6 | |
| with: | |
| name: jacoco-coverage-pr | |
| path: | | |
| **/build/reports/jacoco/test/jacocoTestReport.xml | |
| if-no-files-found: error | |
| coverage-base: | |
| name: Coverage Base (JDK 8 / x86_64) | |
| if: ${{ github.event_name == 'pull_request' }} | |
| runs-on: ubuntu-latest | |
| timeout-minutes: 60 | |
| container: | |
| image: eclipse-temurin:8-jdk # base image is Debian 11 (Bullseye) | |
| defaults: | |
| run: | |
| shell: bash | |
| env: | |
| GRADLE_USER_HOME: /github/home/.gradle | |
| permissions: | |
| contents: read | |
| steps: | |
| - name: Checkout code | |
| uses: actions/checkout@v5 | |
| with: | |
| ref: ${{ github.event.pull_request.base.sha }} | |
| - 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: Cache Gradle packages | |
| uses: actions/cache@v4 | |
| with: | |
| path: | | |
| /github/home/.gradle/caches | |
| /github/home/.gradle/wrapper | |
| key: coverage-base-x86_64-gradle-${{ hashFiles('**/*.gradle', '**/gradle-wrapper.properties') }} | |
| restore-keys: | | |
| coverage-base-x86_64-gradle- | |
| - name: Build (base) | |
| run: ./gradlew clean build --no-daemon --no-build-cache | |
| - name: Test with RocksDB engine (base) | |
| run: ./gradlew :framework:testWithRocksDb --no-daemon --no-build-cache | |
| - name: Generate module coverage reports (base) | |
| run: ./gradlew jacocoTestReport --no-daemon | |
| - name: Upload base coverage reports | |
| uses: actions/upload-artifact@v6 | |
| with: | |
| name: jacoco-coverage-base | |
| path: | | |
| **/build/reports/jacoco/test/jacocoTestReport.xml | |
| if-no-files-found: error | |
| coverage-gate: | |
| name: Coverage Gate | |
| needs: [docker-build-debian11, coverage-base] | |
| if: ${{ github.event_name == 'pull_request' }} | |
| runs-on: ubuntu-latest | |
| timeout-minutes: 10 | |
| permissions: | |
| contents: read | |
| steps: | |
| - name: Checkout code | |
| uses: actions/checkout@v5 | |
| with: | |
| fetch-depth: 0 | |
| - name: Download base coverage reports | |
| uses: actions/download-artifact@v8 | |
| with: | |
| name: jacoco-coverage-base | |
| path: coverage/base | |
| - name: Download PR coverage reports | |
| uses: actions/download-artifact@v8 | |
| with: | |
| name: jacoco-coverage-pr | |
| path: coverage/pr | |
| - name: Collect coverage report paths | |
| id: collect-xml | |
| run: | | |
| BASE_XMLS=$(find coverage/base -name "jacocoTestReport.xml" | sort | paste -sd, -) | |
| PR_XMLS=$(find coverage/pr -name "jacocoTestReport.xml" | sort | paste -sd, -) | |
| if [ -z "$BASE_XMLS" ] || [ -z "$PR_XMLS" ]; then | |
| echo "Missing jacocoTestReport.xml files for base or PR." | |
| exit 1 | |
| fi | |
| echo "base_xmls=$BASE_XMLS" >> "$GITHUB_OUTPUT" | |
| echo "pr_xmls=$PR_XMLS" >> "$GITHUB_OUTPUT" | |
| - name: Aggregate base coverage | |
| id: jacoco-base | |
| uses: madrapps/jacoco-report@v1.7.2 | |
| with: | |
| paths: ${{ steps.collect-xml.outputs.base_xmls }} | |
| token: ${{ secrets.GITHUB_TOKEN }} | |
| min-coverage-overall: 0 | |
| min-coverage-changed-files: 0 | |
| skip-if-no-changes: true | |
| title: '## Base Coverage Snapshot' | |
| update-comment: false | |
| - name: Aggregate PR coverage | |
| id: jacoco-pr | |
| uses: madrapps/jacoco-report@v1.7.2 | |
| with: | |
| paths: ${{ steps.collect-xml.outputs.pr_xmls }} | |
| token: ${{ secrets.GITHUB_TOKEN }} | |
| min-coverage-overall: 0 | |
| min-coverage-changed-files: 0 | |
| skip-if-no-changes: true | |
| title: '## PR Code Coverage Report' | |
| update-comment: false | |
| - name: Enforce coverage gates | |
| env: | |
| BASE_OVERALL_RAW: ${{ steps.jacoco-base.outputs.coverage-overall }} | |
| PR_OVERALL_RAW: ${{ steps.jacoco-pr.outputs.coverage-overall }} | |
| PR_CHANGED_RAW: ${{ steps.jacoco-pr.outputs.coverage-changed-files }} | |
| run: | | |
| set -euo pipefail | |
| MIN_CHANGED=60 | |
| MAX_DROP=-0.1 | |
| sanitize() { | |
| echo "$1" | tr -d ' %' | |
| } | |
| is_number() { | |
| [[ "$1" =~ ^-?[0-9]+([.][0-9]+)?$ ]] | |
| } | |
| compare_float() { | |
| # Usage: compare_float "<expr>" | |
| # Example: compare_float "1.2 >= -0.1" | |
| awk "BEGIN { if ($1) print 1; else print 0 }" | |
| } | |
| # 1) Parse metrics from jacoco-report outputs | |
| BASE_OVERALL="$(sanitize "$BASE_OVERALL_RAW")" | |
| PR_OVERALL="$(sanitize "$PR_OVERALL_RAW")" | |
| PR_CHANGED="$(sanitize "$PR_CHANGED_RAW")" | |
| if ! is_number "$BASE_OVERALL" || ! is_number "$PR_OVERALL"; then | |
| echo "Failed to parse coverage values: base='${BASE_OVERALL}', pr='${PR_OVERALL}'." | |
| exit 1 | |
| fi | |
| # 2) Compare metrics against thresholds | |
| DELTA=$(awk -v pr="$PR_OVERALL" -v base="$BASE_OVERALL" 'BEGIN { printf "%.4f", pr - base }') | |
| DELTA_OK=$(compare_float "${DELTA} >= ${MAX_DROP}") | |
| CHANGED_STATUS="SKIPPED (no changed coverage value)" | |
| CHANGED_OK=1 | |
| if [ -n "$PR_CHANGED" ] && [ "$PR_CHANGED" != "NaN" ]; then | |
| if ! is_number "$PR_CHANGED"; then | |
| echo "Failed to parse changed-files coverage: changed='${PR_CHANGED}'." | |
| exit 1 | |
| fi | |
| CHANGED_OK=$(compare_float "${PR_CHANGED} > ${MIN_CHANGED}") | |
| if [ "$CHANGED_OK" -eq 1 ]; then | |
| CHANGED_STATUS="PASS (> ${MIN_CHANGED}%)" | |
| else | |
| CHANGED_STATUS="FAIL (<= ${MIN_CHANGED}%)" | |
| fi | |
| fi | |
| # 3) Output base metrics (always visible in logs + step summary) | |
| OVERALL_STATUS="PASS (>= ${MAX_DROP}%)" | |
| if [ "$DELTA_OK" -ne 1 ]; then | |
| OVERALL_STATUS="FAIL (< ${MAX_DROP}%)" | |
| fi | |
| METRICS_TEXT=$(cat <<EOF | |
| Changed Files Coverage: ${PR_CHANGED}% | |
| PR Overall Coverage: ${PR_OVERALL}% | |
| Base Overall Coverage: ${BASE_OVERALL}% | |
| Delta (PR - Base): ${DELTA}% | |
| Changed Files Gate: ${CHANGED_STATUS} | |
| Overall Delta Gate: ${OVERALL_STATUS} | |
| EOF | |
| ) | |
| echo "$METRICS_TEXT" | |
| { | |
| echo "### Coverage Gate Metrics" | |
| echo "" | |
| echo "- Changed Files Coverage: ${PR_CHANGED}%" | |
| echo "- PR Overall Coverage: ${PR_OVERALL}%" | |
| echo "- Base Overall Coverage: ${BASE_OVERALL}%" | |
| echo "- Delta (PR - Base): ${DELTA}%" | |
| echo "- Changed Files Gate: ${CHANGED_STATUS}" | |
| echo "- Overall Delta Gate: ${OVERALL_STATUS}" | |
| } >> "$GITHUB_STEP_SUMMARY" | |
| # 4) Decide CI pass/fail | |
| if [ "$DELTA_OK" -ne 1 ]; then | |
| echo "Coverage gate failed: overall coverage dropped more than 0.1%." | |
| echo "base=${BASE_OVERALL}% pr=${PR_OVERALL}% delta=${DELTA}%" | |
| exit 1 | |
| fi | |
| if [ -z "$PR_CHANGED" ] || [ "$PR_CHANGED" = "NaN" ]; then | |
| echo "No changed-files coverage value detected, skip changed-files gate." | |
| exit 0 | |
| fi | |
| if [ "$CHANGED_OK" -ne 1 ]; then | |
| echo "Coverage gate failed: changed files coverage must be > 60%." | |
| echo "changed=${PR_CHANGED}%" | |
| exit 1 | |
| fi | |
| echo "Coverage gates passed." |