From fc9551a3320332bead30b65be210c513483c8706 Mon Sep 17 00:00:00 2001 From: Ludy Date: Wed, 16 Jul 2025 18:17:11 +0200 Subject: [PATCH] ci: enhance GitHub Actions workflows with Gradle setup, caching improvements, and Docker image testing (#3956) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # Description of Changes - **What was changed**: - Added a new path filter configuration file at `.github/config/.files.yaml` to centralize filter groups (`build`, `app`, `openapi`, `project`). - Updated `.github/workflows/build.yml` to: - Rename the workflow to “Build and Test Workflow” and add a manual `workflow_dispatch` trigger. - Integrate the path-filter step and conditionally run jobs (`check-generateOpenApiDocs`, `check-licence`, `docker-compose-tests`) based on changed files. - Standardize Gradle setup to version 8.14. - Introduce a new `test-build-docker-images` job that builds Docker images for each `Dockerfile*` in PRs. - Updated `.github/workflows/pre_commit.yml` to cache pre-commit dependencies via `cache-dependency-path: ./.github/scripts/requirements_pre_commit.txt`. - Updated `.github/workflows/testdriver.yml` to add dedicated Gradle (`gradle-version: 8.14`) and Node/npm setup steps with caching. - **Why the change was made**: To optimize CI performance by only running relevant jobs when specific files change, improve maintainability through a single source of truth for path filters, enable manual workflow dispatch, ensure consistent environments (Gradle, Node), and speed up runs with better caching. --- ## Checklist ### General - [x] I have read the [Contribution Guidelines](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/CONTRIBUTING.md) - [x] I have read the [Stirling-PDF Developer Guide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/devGuide/DeveloperGuide.md) (if applicable) - [ ] I have read the [How to add new languages to Stirling-PDF](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/devGuide/HowToAddNewLanguage.md) (if applicable) - [x] I have performed a self-review of my own code - [x] My changes generate no new warnings ### Documentation - [ ] I have updated relevant docs on [Stirling-PDF's doc repo](https://github.com/Stirling-Tools/Stirling-Tools.github.io/blob/main/docs/) (if functionality has heavily changed) - [ ] I have read the section [Add New Translation Tags](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/devGuide/HowToAddNewLanguage.md#add-new-translation-tags) (for new translation tags only) ### UI Changes (if applicable) - [ ] Screenshots or videos demonstrating the UI changes are attached (e.g., as comments or direct attachments in the PR) ### Testing (if applicable) - [ ] I have tested my changes locally. Refer to the [Testing Guide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/devGuide/DeveloperGuide.md#6-testing) for more details. --- .github/config/.files.yaml | 36 ++++ .../workflows/PR-Demo-Comment-with-react.yml | 1 + .github/workflows/build.yml | 188 +++++++++++++++--- .github/workflows/licenses-update.yml | 3 +- .github/workflows/multiOSReleases.yml | 3 + .github/workflows/pre_commit.yml | 1 + .github/workflows/push-docker.yml | 1 + .github/workflows/releaseArtifacts.yml | 1 + .github/workflows/swagger.yml | 1 + .github/workflows/testdriver.yml | 11 + lauch4jConfig.xml => launch4jConfig.xml | 0 11 files changed, 213 insertions(+), 33 deletions(-) create mode 100644 .github/config/.files.yaml rename lauch4jConfig.xml => launch4jConfig.xml (100%) diff --git a/.github/config/.files.yaml b/.github/config/.files.yaml new file mode 100644 index 000000000..4e335b350 --- /dev/null +++ b/.github/config/.files.yaml @@ -0,0 +1,36 @@ +build: &build + - build.gradle + - app/core/build.gradle + - app/common/build.gradle + - app/proprietary/build.gradle + +app: &app + - app/core/src/main/java/** + - app/common/src/main/java/** + - app/proprietary/src/main/java/** + +openapi: &openapi + - build.gradle + - app/core/build.gradle + - app/core/src/main/java/** + - app/common/build.gradle + - app/common/src/main/java/** + - app/proprietary/build.gradle + - app/proprietary/src/main/java/** + +project: &project + - app/** + - exampleYmlFiles/** + - gradle/** + - libs/** + - scripts/** + - testing/** + - build.gradle + - Dockerfile + - Dockerfile.fat + - Dockerfile.ultra-lite + - gradle.properties + - gradlew + - gradlew.bat + - launch4jConfig.xml + - settings.gradle \ No newline at end of file diff --git a/.github/workflows/PR-Demo-Comment-with-react.yml b/.github/workflows/PR-Demo-Comment-with-react.yml index 877a78524..6375f73d2 100644 --- a/.github/workflows/PR-Demo-Comment-with-react.yml +++ b/.github/workflows/PR-Demo-Comment-with-react.yml @@ -180,6 +180,7 @@ jobs: with: java-version: "17" distribution: "temurin" + cache: gradle - name: Run Gradle Command run: | diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index aa98d2a1e..126c82221 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -1,8 +1,9 @@ -name: Build repo +name: Build and Test Workflow on: - push: - branches: ["main"] + workflow_dispatch: + # push: + # branches: ["main"] pull_request: branches: ["main"] @@ -37,6 +38,12 @@ jobs: with: java-version: ${{ matrix.jdk-version }} distribution: "temurin" + cache: gradle + + - name: Setup Gradle + uses: gradle/actions/setup-gradle@ac638b010cf58a27ee6c972d7336334ccaf61c96 # v4.4.1 + with: + gradle-version: 8.14 - name: Build with Gradle and spring security ${{ matrix.spring-security }} run: ./gradlew clean build @@ -88,33 +95,7 @@ jobs: if-no-files-found: warn check-generateOpenApiDocs: - runs-on: ubuntu-latest - steps: - - name: Harden Runner - uses: step-security/harden-runner@6c439dc8bdf85cadbbce9ed30d1c7b959517bc49 # v2.12.2 - with: - egress-policy: audit - - - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - - - name: Set up JDK 17 - uses: actions/setup-java@c5195efecf7bdfc987ee8bae7a71cb8b11521c00 # v4.7.1 - with: - java-version: "17" - distribution: "temurin" - - - uses: gradle/actions/setup-gradle@ac638b010cf58a27ee6c972d7336334ccaf61c96 # v4.4.1 - - - name: Generate OpenAPI documentation - run: ./gradlew :stirling-pdf:generateOpenApiDocs - - - name: Upload OpenAPI Documentation - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 - with: - name: openapi-docs - path: ./SwaggerDoc.json - - check-licence: + needs: build runs-on: ubuntu-latest steps: - name: Harden Runner @@ -125,13 +106,63 @@ jobs: - name: Checkout repository uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + - name: Filter for integration changes + uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2 + id: files + with: + filters: ".github/config/.files.yaml" + - name: Set up JDK 17 + if: ${{ steps.files.outputs.openapi == 'true' }} uses: actions/setup-java@c5195efecf7bdfc987ee8bae7a71cb8b11521c00 # v4.7.1 with: java-version: "17" - distribution: "adopt" + distribution: "temurin" + cache: gradle + + - name: Setup Gradle + if: ${{ steps.files.outputs.openapi == 'true' }} + uses: gradle/actions/setup-gradle@ac638b010cf58a27ee6c972d7336334ccaf61c96 # v4.4.1 + + - name: Generate OpenAPI documentation + if: ${{ steps.files.outputs.openapi == 'true' }} + run: ./gradlew :stirling-pdf:generateOpenApiDocs + + - name: Upload OpenAPI Documentation + if: ${{ steps.files.outputs.openapi == 'true' }} + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 + with: + name: openapi-docs + path: ./SwaggerDoc.json + + check-licence: + needs: build + runs-on: ubuntu-latest + steps: + - name: Harden Runner + uses: step-security/harden-runner@6c439dc8bdf85cadbbce9ed30d1c7b959517bc49 # v2.12.2 + with: + egress-policy: audit + + - name: Checkout repository + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + + - name: Filter for integration changes + uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2 + id: files + with: + filters: ".github/config/.files.yaml" + + - name: Set up JDK 17 + if: ${{ steps.files.outputs.build == 'true' }} + uses: actions/setup-java@c5195efecf7bdfc987ee8bae7a71cb8b11521c00 # v4.7.1 + with: + java-version: "17" + distribution: "temurin" + cache: gradle - name: check the licenses for compatibility + if: ${{ steps.files.outputs.build == 'true' }} run: ./gradlew clean checkLicense - name: FAILED - check the licenses for compatibility @@ -169,33 +200,126 @@ jobs: - name: Checkout Repository uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + - name: Filter for integration changes + uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2 + id: files + with: + filters: ".github/config/.files.yaml" + - name: Set up Java 17 + if: ${{ steps.files.outputs.project == 'true' }} uses: actions/setup-java@c5195efecf7bdfc987ee8bae7a71cb8b11521c00 # v4.7.1 with: java-version: "17" - distribution: "adopt" + distribution: "temurin" + cache: gradle - name: Set up Docker Buildx + if: ${{ steps.files.outputs.project == 'true' }} uses: docker/setup-buildx-action@e468171a9de216ec08956ac3ada2f0791b6bd435 # v3.11.1 - name: Install Docker Compose + if: ${{ steps.files.outputs.project == 'true' }} run: | sudo curl -SL "https://github.com/docker/compose/releases/download/v2.37.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose sudo chmod +x /usr/local/bin/docker-compose - name: Set up Python + if: ${{ steps.files.outputs.project == 'true' }} uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 with: python-version: "3.12" cache: 'pip' # caching pip dependencies + cache-dependency-path: ./testing/cucumber/requirements.txt - name: Pip requirements + if: ${{ steps.files.outputs.project == 'true' }} run: | pip install --require-hashes -r ./testing/cucumber/requirements.txt - name: Run Docker Compose Tests + if: ${{ steps.files.outputs.project == 'true' }} run: | chmod +x ./testing/test_webpages.sh chmod +x ./testing/test.sh chmod +x ./testing/test_disabledEndpoints.sh ./testing/test.sh + + test-build-docker-images: + if: github.event_name == 'pull_request' + needs: [build, check-generateOpenApiDocs, check-licence] + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + docker-rev: ["Dockerfile", "Dockerfile.ultra-lite", "Dockerfile.fat"] + steps: + - name: Harden Runner + uses: step-security/harden-runner@6c439dc8bdf85cadbbce9ed30d1c7b959517bc49 # v2.12.2 + with: + egress-policy: audit + + - name: Checkout Repository + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + + - name: Filter for integration changes + uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2 + id: files + with: + filters: ".github/config/.files.yaml" + + - name: Set up JDK 17 + if: ${{ steps.files.outputs.project == 'true' }} + uses: actions/setup-java@c5195efecf7bdfc987ee8bae7a71cb8b11521c00 # v4.7.1 + with: + java-version: "17" + distribution: "temurin" + cache: gradle + + - name: Set up Gradle + if: ${{ steps.files.outputs.project == 'true' }} + uses: gradle/actions/setup-gradle@ac638b010cf58a27ee6c972d7336334ccaf61c96 # v4.4.1 + with: + gradle-version: 8.14 + + - name: Build application + if: ${{ steps.files.outputs.project == 'true' }} + run: ./gradlew clean build + env: + DISABLE_ADDITIONAL_FEATURES: true + STIRLING_PDF_DESKTOP_UI: false + + - name: Set up QEMU + if: ${{ steps.files.outputs.project == 'true' }} + uses: docker/setup-qemu-action@29109295f81e9208d7d86ff1c6c12d2833863392 # v3.6.0 + + - name: Set up Docker Buildx + if: ${{ steps.files.outputs.project == 'true' }} + id: buildx + uses: docker/setup-buildx-action@e468171a9de216ec08956ac3ada2f0791b6bd435 # v3.11.1 + + - name: Build ${{ matrix.docker-rev }} + if: ${{ steps.files.outputs.project == 'true' }} + uses: docker/build-push-action@263435318d21b8e681c14492fe198d362a7d2c83 # v6.18.0 + with: + builder: ${{ steps.buildx.outputs.name }} + context: . + file: ./${{ matrix.docker-rev }} + push: false + cache-from: type=gha + cache-to: type=gha,mode=max + platforms: linux/amd64,linux/arm64/v8 + provenance: true + sbom: true + + - name: Upload Reports + if: always() + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 + with: + name: reports-docker-${{ matrix.docker-rev }} + path: | + build/reports/tests/ + build/test-results/ + build/reports/problems/ + retention-days: 3 + if-no-files-found: warn diff --git a/.github/workflows/licenses-update.yml b/.github/workflows/licenses-update.yml index ba66627ad..4c6188476 100644 --- a/.github/workflows/licenses-update.yml +++ b/.github/workflows/licenses-update.yml @@ -39,7 +39,8 @@ jobs: uses: actions/setup-java@c5195efecf7bdfc987ee8bae7a71cb8b11521c00 # v4.7.1 with: java-version: "17" - distribution: "adopt" + distribution: "temurin" + cache: gradle - name: Setup Gradle uses: gradle/actions/setup-gradle@ac638b010cf58a27ee6c972d7336334ccaf61c96 # v4.4.1 diff --git a/.github/workflows/multiOSReleases.yml b/.github/workflows/multiOSReleases.yml index 3cac33e1f..014410193 100644 --- a/.github/workflows/multiOSReleases.yml +++ b/.github/workflows/multiOSReleases.yml @@ -32,6 +32,7 @@ jobs: with: distribution: 'temurin' java-version: '21' + cache: gradle # ✅ Get version from Gradle - name: Get version number @@ -71,6 +72,7 @@ jobs: with: java-version: "21" distribution: "temurin" + cache: gradle - uses: gradle/actions/setup-gradle@ac638b010cf58a27ee6c972d7336334ccaf61c96 # v4.4.1 with: @@ -159,6 +161,7 @@ jobs: with: java-version: "21" distribution: "temurin" + cache: gradle - uses: gradle/actions/setup-gradle@ac638b010cf58a27ee6c972d7336334ccaf61c96 # v4.4.1 with: diff --git a/.github/workflows/pre_commit.yml b/.github/workflows/pre_commit.yml index ebe81c5a8..ba80e9bcd 100644 --- a/.github/workflows/pre_commit.yml +++ b/.github/workflows/pre_commit.yml @@ -37,6 +37,7 @@ jobs: with: python-version: 3.12 cache: 'pip' # caching pip dependencies + cache-dependency-path: ./.github/scripts/requirements_pre_commit.txt - name: Run Pre-Commit Hooks run: | diff --git a/.github/workflows/push-docker.yml b/.github/workflows/push-docker.yml index 432925f1a..f31e5c9b7 100644 --- a/.github/workflows/push-docker.yml +++ b/.github/workflows/push-docker.yml @@ -29,6 +29,7 @@ jobs: with: java-version: "17" distribution: "temurin" + cache: gradle - uses: gradle/actions/setup-gradle@ac638b010cf58a27ee6c972d7336334ccaf61c96 # v4.4.1 with: diff --git a/.github/workflows/releaseArtifacts.yml b/.github/workflows/releaseArtifacts.yml index 701bb678e..3294c7246 100644 --- a/.github/workflows/releaseArtifacts.yml +++ b/.github/workflows/releaseArtifacts.yml @@ -34,6 +34,7 @@ jobs: with: java-version: "17" distribution: "temurin" + cache: gradle - uses: gradle/actions/setup-gradle@ac638b010cf58a27ee6c972d7336334ccaf61c96 # v4.4.1 with: diff --git a/.github/workflows/swagger.yml b/.github/workflows/swagger.yml index 463736b65..97c4ffa0e 100644 --- a/.github/workflows/swagger.yml +++ b/.github/workflows/swagger.yml @@ -25,6 +25,7 @@ jobs: with: java-version: "17" distribution: "temurin" + cache: gradle - uses: gradle/actions/setup-gradle@ac638b010cf58a27ee6c972d7336334ccaf61c96 # v4.4.1 diff --git a/.github/workflows/testdriver.yml b/.github/workflows/testdriver.yml index 2f818fbd0..c0e6f589c 100644 --- a/.github/workflows/testdriver.yml +++ b/.github/workflows/testdriver.yml @@ -24,6 +24,12 @@ jobs: with: java-version: '17' distribution: 'temurin' + cache: gradle + + - name: Setup Gradle + uses: gradle/actions/setup-gradle@ac638b010cf58a27ee6c972d7336334ccaf61c96 # v4.4.1 + with: + gradle-version: 8.14 - name: Build with Gradle run: ./gradlew clean build @@ -111,6 +117,11 @@ jobs: - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + - name: Set up Node + uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 + with: + cache: 'npm' + - name: Run TestDriver.ai uses: testdriverai/action@f0d0f45fdd684db628baa843fe9313f3ca3a8aa8 #1.1.3 with: diff --git a/lauch4jConfig.xml b/launch4jConfig.xml similarity index 100% rename from lauch4jConfig.xml rename to launch4jConfig.xml