Unit & Integration Tests #25069
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: Unit & Integration Tests | |
| env: | |
| JAVA_OPTS: "-Xms512m -Xmx8048m -Xss512m -XX:ReservedCodeCacheSize=512m -server" | |
| TERM: xterm-256color | |
| GH_PACKAGE_REGISTRY_USER: ${{ secrets.GH_PACKAGE_REGISTRY_USER }} | |
| GH_PACKAGE_REGISTRY_TOKEN: ${{ secrets.GH_PACKAGE_REGISTRY_TOKEN }} | |
| GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
| DEVELOCITY_ACCESS_KEY: ${{ secrets.GRADLE_ENTERPRISE_ACCESS_KEY }} | |
| CODACY_PROJECT_TOKEN: ${{ secrets.CODACY_PROJECT_TOKEN }} | |
| SONARCLOUD_TOKEN: ${{ secrets.SONARCLOUD_TOKEN }} | |
| CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} | |
| COSMOS_DB_URL: ${{ secrets.COSMOS_DB_URL }} | |
| COSMOS_DB_KEY: ${{ secrets.COSMOS_DB_KEY }} | |
| AZURE_MAPS_API_KEY: ${{ secrets.AZURE_MAPS_API_KEY }} | |
| AZURE_MAPS_CLIENT_ID: ${{ secrets.AZURE_MAPS_CLIENT_ID }} | |
| AZURE_AD_CLIENT_ID: ${{ secrets.AZURE_AD_CLIENT_ID }} | |
| AZURE_AD_CLIENT_SECRET: ${{ secrets.AZURE_AD_CLIENT_SECRET }} | |
| AZURE_AD_CLIENT_SECRET_MAIL: ${{ secrets.AZURE_AD_CLIENT_SECRET_MAIL }} | |
| AZURE_AD_USER_PASSWORD: ${{ secrets.AZURE_AD_USER_PASSWORD }} | |
| AZURE_AD_TENANT: ${{ secrets.AZURE_AD_TENANT }} | |
| AZURE_AD_DOMAIN: ${{ secrets.AZURE_AD_DOMAIN }} | |
| PERMIT_IO_API_KEY: ${{ secrets.PERMIT_IO_API_KEY }} | |
| JDK_CURRENT: 25 | |
| JDK_DISTRIBUTION: "corretto" | |
| RETRY_ATTEMPTS: 2 | |
| RETRY_MINUTES: 45 | |
| CATEGORY_REGEX: ".*" | |
| ########################################################################## | |
| on: | |
| workflow_dispatch: | |
| schedule: | |
| - cron: '0 17 * * *' | |
| - cron: '0 10 * * *' # This needs to match the condition below that disables PTS mode. | |
| push: | |
| branches: | |
| - master | |
| - '!**.**.**' | |
| - '!heroku-*' | |
| pull_request: | |
| types: [ labeled ] | |
| branches: [ master, pr-* ] | |
| concurrency: | |
| group: "workflow = ${{ github.workflow }}, ref = ${{ github.event.ref }}, pr = ${{ github.event.pull_request.id }}" | |
| cancel-in-progress: true | |
| ########################################################################## | |
| jobs: | |
| trigger-ci: | |
| if: ${{ (github.event_name == 'push' || github.event_name == 'workflow_dispatch' || github.event_name == 'schedule' || contains(github.event.pull_request.labels.*.name, 'CI')) }} | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Trigger CI | |
| run: echo "CI Triggered" | |
| ########################################################################## | |
| initialize: | |
| needs: [ trigger-ci ] | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Checkout Repository | |
| uses: actions/checkout@v6 | |
| with: | |
| persist-credentials: false | |
| - name: Set up JDK | |
| uses: actions/setup-java@v5 | |
| with: | |
| java-version: ${{ env.JDK_CURRENT }} | |
| distribution: ${{ env.JDK_DISTRIBUTION }} | |
| - name: Setup Gradle | |
| uses: gradle/actions/setup-gradle@v6 | |
| - name: Initialize | |
| run: ls ./ci && find ./ci -type f -name "*.sh" -exec chmod +x "{}" \; && ./ci/init-build.sh | |
| ########################################################################## | |
| testcategories: | |
| needs: [ initialize ] | |
| runs-on: ubuntu-latest | |
| outputs: | |
| categories: ${{ steps.get-categories.outputs.categories }} | |
| steps: | |
| - name: Checkout | |
| uses: actions/checkout@v6 | |
| with: | |
| persist-credentials: false | |
| - name: Set up JDK | |
| uses: actions/setup-java@v5 | |
| with: | |
| java-version: ${{ env.JDK_CURRENT }} | |
| distribution: ${{ env.JDK_DISTRIBUTION }} | |
| - name: Setup Gradle | |
| uses: gradle/actions/setup-gradle@v6 | |
| - id: print-categories | |
| run: ./gradlew --build-cache --configure-on-demand --no-daemon -q testCategories | |
| - id: get-categories | |
| run: echo "categories=$(./gradlew --build-cache --configure-on-demand --no-daemon -q testCategories)" >> $GITHUB_OUTPUT | |
| ########################################################################## | |
| tests: | |
| needs: [ testcategories ] | |
| continue-on-error: false | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| os: [ ubuntu-latest ] | |
| category: ${{fromJSON(needs.testcategories.outputs.categories)}} | |
| runs-on: ${{ matrix.os }} | |
| name: ${{ matrix.category }} | |
| steps: | |
| - name: Checkout | |
| uses: actions/checkout@v6 | |
| with: | |
| persist-credentials: false | |
| - name: Set up JDK | |
| uses: actions/setup-java@v5 | |
| with: | |
| java-version: ${{ env.JDK_CURRENT }} | |
| distribution: ${{ env.JDK_DISTRIBUTION }} | |
| - name: Setup Gradle | |
| uses: gradle/actions/setup-gradle@v6 | |
| - name: Initialize | |
| run: find ./ci -type f -name "*.sh" -exec chmod +x "{}" \; && ./ci/init-build.sh | |
| shell: bash | |
| - name: Run Tests | |
| uses: nick-fields/retry@v4 | |
| with: | |
| max_attempts: ${{ env.RETRY_ATTEMPTS }} | |
| retry_on: error | |
| retry_wait_seconds: 5 | |
| timeout_minutes: ${{ env.RETRY_MINUTES }} | |
| shell: bash | |
| command: | | |
| chmod +x ./testcas.sh | |
| if [[ "${{ github.event_name }}" == "schedule" ]] && [[ "${{ github.event.schedule == '0 10 * * *'}}" ]]; then | |
| echo "Running tests without PTS mode" | |
| ./testcas.sh --no-watch --category ${{ matrix.category }} --events FAILED --no-pts --with-coverage | |
| else | |
| if [[ "${{ github.event_name }}" == "push" ]] || [[ "${{ github.event_name }}" == "schedule" ]]; then | |
| ptsMode="REMAINING_TESTS"; | |
| else | |
| ptsMode="RELEVANT_TESTS"; | |
| fi | |
| echo "Running tests with PTS mode: $ptsMode" | |
| ./testcas.sh --no-watch --category ${{ matrix.category }} --events FAILED --pts $ptsMode --with-coverage | |
| fi | |
| - name: Check Coverage Report | |
| if: github.event_name == 'push' || github.event_name == 'workflow_dispatch' || github.event_name == 'schedule' | |
| run: | | |
| xml_files=$(find build/reports -type f -name "*.xml") | |
| if [ -z "$xml_files" ]; then | |
| echo "No coverage XML files found" | |
| else | |
| echo ${xml_files} | |
| fi | |
| - name: Upload to SonarCloud | |
| if: env.SONARCLOUD_TOKEN != null && (github.event_name == 'push' || github.event_name == 'workflow_dispatch' || github.event_name == 'schedule') | |
| continue-on-error: true | |
| run: | | |
| coverageReport="$PWD/build/reports/jacoco/jacocoRootReport/jacocoRootReport.xml" | |
| echo "Uploading coverage report to SonarCloud from $coverageReport" | |
| ./gradlew sonar --build-cache --configure-on-demand \ | |
| --no-daemon -DskipAot=true -q --parallel \ | |
| -x javadoc -x test -DskipNestedConfigMetadataGen=true \ | |
| -PsonarOrganization="${{ github.repository_owner }}" \ | |
| -Dsonar.coverage.jacoco.xmlReportPaths="$coverageReport" | |
| - name: "Upload to Codecov" | |
| uses: "codecov/codecov-action@v6" | |
| continue-on-error: true | |
| if: env.CODECOV_TOKEN != null && (github.event_name == 'push' || github.event_name == 'workflow_dispatch' || github.event_name == 'schedule') | |
| with: | |
| token: ${{ env.CODECOV_TOKEN }} | |
| files: ./build/reports/jacoco/jacocoRootReport/jacocoRootReport.xml | |
| flags: ${{ matrix.category }} | |
| name: ${{ matrix.category }} | |
| verbose: true | |
| fail_ci_if_error: false | |
| - name: Upload to Coveralls | |
| uses: coverallsapp/github-action@v2 | |
| continue-on-error: true | |
| with: | |
| github-token: ${{ secrets.GITHUB_TOKEN }} | |
| file: ./build/reports/jacoco/jacocoRootReport/jacocoRootReport.xml | |
| format: jacoco | |
| parallel: true | |
| build-number: ${{ github.run_id }}-${{ github.run_attempt }} | |
| debug: true | |
| - name: Upload Coverage Report | |
| uses: "actions/upload-artifact@v7" | |
| if: github.event_name == 'push' || github.event_name == 'workflow_dispatch' || github.event_name == 'schedule' | |
| with: | |
| name: "cas-tests-${{ matrix.category }}.coverage" | |
| path: "./build/reports/jacoco/jacocoRootReport/jacocoRootReport.xml" | |
| ########################################################################## | |
| coverage: | |
| runs-on: ubuntu-latest | |
| needs: [ tests ] | |
| if: (github.event_name == 'push' || github.event_name == 'workflow_dispatch' || github.event_name == 'schedule') | |
| outputs: | |
| coverage-files: ${{ steps.coverage-files.outputs.coverage-files }} | |
| steps: | |
| - name: Checkout Repository | |
| uses: actions/checkout@v6 | |
| with: | |
| persist-credentials: false | |
| - name: Set up JDK | |
| uses: actions/setup-java@v5 | |
| with: | |
| java-version: ${{ env.JDK_CURRENT }} | |
| distribution: ${{ env.JDK_DISTRIBUTION }} | |
| - name: Setup Gradle | |
| uses: gradle/actions/setup-gradle@v6 | |
| - name: Collect Coverage Files | |
| id: coverage-files | |
| run: | | |
| find $PWD -type f -name 'jacocoRootReport.xml' | |
| export files='' | |
| for file in $(find $PWD -type f -name 'jacocoRootReport.xml'); do export files="$file,${files}"; done | |
| export files="${files%?}" | |
| echo $files | |
| echo "COVERAGE_REPORTS=${files}" >> $GITHUB_ENV | |
| - name: Upload Coverage to Codacy | |
| continue-on-error: true | |
| env: | |
| CODACY_PROJECT_TOKEN: ${{ secrets.CODACY_PROJECT_TOKEN }} | |
| CODACY_REPORTER_OPTIONS: --http-timeout 60000 --num-retries 8 --sleep-time 15000 | |
| run: | | |
| IFS=',' read -r -a reports <<< "${{ env.COVERAGE_REPORTS }}" | |
| for report in "${reports[@]}"; do | |
| echo "Uploading coverage report: $report" | |
| bash <(curl -Ls https://coverage.codacy.com/get.sh) report -r "$report" --partial | |
| done | |
| bash <(curl -Ls https://coverage.codacy.com/get.sh) final | |
| - name: Finish Coveralls | |
| uses: coverallsapp/github-action@v2 | |
| with: | |
| github-token: ${{ secrets.GITHUB_TOKEN }} | |
| parallel-finished: true | |
| build-number: ${{ github.run_id }}-${{ github.run_attempt }} | |
| debug: true |