From 697ccf9bf9b4ba9d164a436a91d0a4245c1a435f Mon Sep 17 00:00:00 2001 From: Sourav Maji Date: Thu, 14 Nov 2024 13:37:39 -0800 Subject: [PATCH] Refactor Unit Test Suites (#1304) Refactor Unit Tests suites to have better visibility of the tests being run in different top level modules. Added bonus it cuts total UT/CodeCov runtime by ~10mins due to more parallelism. --------- Co-authored-by: Sourav Maji --- .github/workflows/UnitTests-core.yml | 54 +++++++++++ .../VeniceCI-StaticAnalysisAndUnitTests.yml | 95 +++++++++---------- 2 files changed, 100 insertions(+), 49 deletions(-) create mode 100644 .github/workflows/UnitTests-core.yml diff --git a/.github/workflows/UnitTests-core.yml b/.github/workflows/UnitTests-core.yml new file mode 100644 index 0000000000..f19827ff5f --- /dev/null +++ b/.github/workflows/UnitTests-core.yml @@ -0,0 +1,54 @@ +on: + workflow_call: + inputs: + arg: + required: true + type: string + artifact_suffix: + required: true + type: string + + +jobs: + reusable_job: + name: "Unit Tests And Coverage" + strategy: + fail-fast: false + matrix: + jdk: [ 8, 11, 17 ] + runs-on: ubuntu-latest + timeout-minutes: 60 + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + - name: Set up JDK + uses: actions/setup-java@v4 + with: + java-version: ${{ matrix.jdk }} + distribution: 'temurin' + cache: 'gradle' + - shell: bash + run: | + git remote set-head origin --auto + git remote add upstream https://github.com/linkedin/venice + git fetch upstream + - name: Setup Gradle + uses: gradle/actions/setup-gradle@v4 + - name: Run Unit Tests with Code Coverage + run: ./gradlew -x :internal:venice-avro-compatibility-test:test ${{ inputs.arg }} + - name: Package Build Artifacts + if: success() || failure() + shell: bash + run: | + mkdir ${{ inputs.artifact_suffix }}-artifacts + find . -path "**/build/reports/*" -or -path "**/build/test-results/*" > artifacts.list + rsync -R --files-from=artifacts.list . ${{ inputs.artifact_suffix }}-artifacts + tar -zcvf ${{ inputs.artifact_suffix }}-jdk${{ matrix.jdk }}-logs.tar.gz ${{ inputs.artifact_suffix }}-artifacts + - name: Upload Build Artifacts + if: success() || failure() + uses: actions/upload-artifact@v4 + with: + name: ${{ inputs.artifact_suffix }}-jdk${{ matrix.jdk }} + path: ${{ inputs.artifact_suffix }}-jdk${{ matrix.jdk }}-logs.tar.gz + retention-days: 30 diff --git a/.github/workflows/VeniceCI-StaticAnalysisAndUnitTests.yml b/.github/workflows/VeniceCI-StaticAnalysisAndUnitTests.yml index 6f08324643..86d3532962 100644 --- a/.github/workflows/VeniceCI-StaticAnalysisAndUnitTests.yml +++ b/.github/workflows/VeniceCI-StaticAnalysisAndUnitTests.yml @@ -58,69 +58,66 @@ jobs: path: ${{ github.job }}-jdk${{ matrix.jdk }}-logs.tar.gz retention-days: 30 - UnitTestsAndCodeCoverage: - strategy: - fail-fast: false - matrix: - jdk: [8, 11, 17] - runs-on: ubuntu-latest - timeout-minutes: 60 - steps: - - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - name: Set up JDK - uses: actions/setup-java@v4 - with: - java-version: ${{ matrix.jdk }} - distribution: 'temurin' - cache: 'gradle' - - shell: bash - run: | - git remote set-head origin --auto - git remote add upstream https://github.com/linkedin/venice - git fetch upstream - - name: Setup Gradle - uses: gradle/actions/setup-gradle@v4 - - name: Run Unit Tests with Code Coverage - run: ./gradlew -x :internal:venice-avro-compatibility-test:test jacocoTestCoverageVerification diffCoverage --continue - - name: Package Build Artifacts - if: success() || failure() - shell: bash - run: | - mkdir ${{ github.job }}-artifacts - find . -path "**/build/reports/*" -or -path "**/build/test-results/*" > artifacts.list - rsync -R --files-from=artifacts.list . ${{ github.job }}-artifacts - tar -zcvf ${{ github.job }}-jdk${{ matrix.jdk }}-logs.tar.gz ${{ github.job }}-artifacts - - name: Upload Build Artifacts - if: success() || failure() - uses: actions/upload-artifact@v4 - with: - name: ${{ github.job }}-jdk${{ matrix.jdk }} - path: ${{ github.job }}-jdk${{ matrix.jdk }}-logs.tar.gz - retention-days: 30 + ClientsModule: + uses: ./.github/workflows/UnitTests-core.yml + with: + artifact_suffix: clients + arg: :clients:da-vinci-client:jacocoTestCoverageVerification :clients:da-vinci-client:diffCoverage + :clients:venice-admin-tool:jacocoTestCoverageVerification :clients:venice-admin-tool:diffCoverage + :clients:venice-producer:jacocoTestCoverageVerification :clients:venice-producer:diffCoverage + :clients:venice-pulsar:jacocoTestCoverageVerification :clients:venice-pulsar:diffCoverage + :clients:venice-client:jacocoTestCoverageVerification :clients:venice-client:diffCoverage + :clients:venice-push-job:jacocoTestCoverageVerification :clients:venice-push-job:diffCoverage + :clients:venice-samza:jacocoTestCoverageVerification :clients:venice-samza:diffCoverage + :clients:venice-thin-client:jacocoTestCoverageVerification :clients:venice-thin-client:diffCoverage --continue + + InternalModule: + uses: ./.github/workflows/UnitTests-core.yml + with: + artifact_suffix: internal + arg: :internal:venice-client-common:jacocoTestCoverageVerification :internal:venice-client-common:diffCoverage + :internal:venice-common:jacocoTestCoverageVerification :internal:venice-common:diffCoverage + :internal:venice-jdk-compatibility-test:jacocoTestCoverageVerification :internal:venice-jdk-compatibility-test:diffCoverage + :internal:venice-test-common:jacocoTestCoverageVerification :internal:venice-test-common:diffCoverage --continue + + + ServicesModule: + uses: ./.github/workflows/UnitTests-core.yml + with: + artifact_suffix: services + arg: :services:venice-controller:jacocoTestCoverageVerification :services:venice-controller:diffCoverage + :services:venice-router:jacocoTestCoverageVerification :services:venice-router:diffCoverage + :services:venice-server:jacocoTestCoverageVerification :services:venice-server:diffCoverage --continue StaticAnalysisAndUnitTestsCompletionCheck: strategy: fail-fast: false runs-on: ubuntu-latest - needs: [ValidateGradleWrapper, StaticAnalysis, UnitTestsAndCodeCoverage] + needs: [ValidateGradleWrapper, StaticAnalysis, ClientsModule, InternalModule, ServicesModule] timeout-minutes: 120 if: success() || failure() # Always run this job, regardless of previous job status steps: - name: Check previous job statuses run: | if [ "${{ needs.ValidateGradleWrapper.result }}" != "success" ]; then - echo "ValidateGradleWrapper failed." - exit 1 + echo "ValidateGradleWrapper failed." + exit 1 fi if [ "${{ needs.StaticAnalysis.result }}" != "success" ]; then - echo "StaticAnalysis failed." - exit 1 + echo "StaticAnalysis failed." + exit 1 + fi + if [ "${{ needs.ClientsModule.result }}" != "success" ]; then + echo "ClientsModule failed." + exit 1 + fi + if [ "${{ needs.InternalModule.result }}" != "success" ]; then + echo "InternalModule failed." + exit 1 fi - if [ "${{ needs.UnitTestsAndCodeCoverage.result }}" != "success" ]; then - echo "UnitTestsAndCodeCoverage failed." - exit 1 + if [ "${{ needs.ServicesModule.result }}" != "success" ]; then + echo "ServicesModule failed." + exit 1 fi # If all previous jobs were successful, proceed - name: Final Completion Check