From 69e07a27a61f752c4e4db55e1f5d97c322d7f1a3 Mon Sep 17 00:00:00 2001 From: Robin Munn Date: Mon, 17 Jun 2024 10:10:14 +0700 Subject: [PATCH] Run Playwright and dotnet tests in parallel in CI (#856) * Run Playwright and dotnet tests in parallel in CI * Job names reflect dotnet or Playwright tests * Move inputs.run-playwright test to job * Add optional run-dotnet input, like run-playwright * Switch to Mercurial 6 as default --------- Co-authored-by: Kevin Hahn --- .github/workflows/integration-test.yaml | 143 +++++++++++++++--------- 1 file changed, 89 insertions(+), 54 deletions(-) diff --git a/.github/workflows/integration-test.yaml b/.github/workflows/integration-test.yaml index 32c082f6a..cf8afe3d9 100644 --- a/.github/workflows/integration-test.yaml +++ b/.github/workflows/integration-test.yaml @@ -12,10 +12,15 @@ on: required: true type: string hg-version: - description: 'The version of hg to test (3 or 6, default 3)' + description: 'The version of hg to test (3 or 6, default 6)' required: false - default: '3' + default: '6' type: string + run-dotnet: + description: 'Whether to run dotnet tests' + required: false + default: true + type: boolean run-playwright: description: 'Whether to run Playwright tests' required: false @@ -32,20 +37,31 @@ on: required: true type: string hg-version: - description: 'The version of hg to test (3 or 6, default 3)' + description: 'The version of hg to test (3 or 6, default 6)' required: false - default: '3' + default: '6' type: string + run-dotnet: + description: 'Whether to run dotnet tests' + required: false + default: true + type: boolean run-playwright: description: 'Whether to run Playwright tests' required: false default: true type: boolean +# TODO: Set up caching for /home/runner/.cache/ms-playwright +# TODO: Ditto for /home/runner/.pnpm-store/v3 +# TODO: Ditto for /home/runner/.nuget/packages +# TODO: Ditto for /var/cache/apt/archives/ + jobs: - test: + dotnet-test: + if: ${{ inputs.run-dotnet }} timeout-minutes: 120 - name: Test ${{ inputs.runs-on }} for Mercurial ${{ inputs.hg-version }} on ${{ inputs.environment }} + name: Dotnet tests on ${{ inputs.runs-on }} for Mercurial ${{ inputs.hg-version }} on ${{ inputs.environment }} permissions: checks: write environment: @@ -68,23 +84,6 @@ jobs: sudo apt-get install -f rm powershell_7.4.1-1.deb_amd64.deb pwsh #validate that powershell installed correctly - # First we need to setup Node... - - uses: actions/setup-node@v4 - if: ${{ inputs.run-playwright }} - with: - node-version-file: 'frontend/package.json' - # Then we can set up pnpm... - - uses: pnpm/action-setup@a3252b78c470c02df07e9d59298aecedc3ccdd6d # v3.0.0 - if: ${{ inputs.run-playwright }} - with: - package_json_file: 'frontend/package.json' - # Then we can have Noede set up package caching - - uses: actions/setup-node@v4 - if: ${{ inputs.run-playwright }} - with: - node-version-file: 'frontend/package.json' - cache: 'pnpm' - cache-dependency-path: 'frontend/pnpm-lock.yaml' - uses: actions/setup-dotnet@v4 env: DOTNET_INSTALL_DIR: ${{ inputs.runs-on == 'self-hosted' && '/opt/hostedtoolcache/dotnet' || '' }} #poor man's conditional @@ -104,25 +103,12 @@ jobs: - name: Dotnet build # limit cpu count for self-hosted due to memory constraints run: dotnet build ${{ inputs.runs-on == 'self-hosted' && '-maxcpucount:2' || '' }} - # TODO: Set up caching for /home/runner/.cache/ms-playwright so this doesn't take as long - # TODO: Ditto for /home/runner/.pnpm-store/v3 - # TODO: Ditto for /home/runner/.nuget/packages - # TODO: Ditto for /var/cache/apt/archives/ - - name: Playwright setup - working-directory: frontend - if: ${{ inputs.run-playwright }} - run: pnpm install && pnpm pretest - - name: Set up Playwright dependencies - working-directory: frontend - if: ${{ inputs.run-playwright && inputs.runs-on == 'self-hosted' }} - run: sudo pnpm exec playwright install-deps - name: Build for tests run: "dotnet build /p:MercurialVersion=$MERCURIAL_VERSION" env: MERCURIAL_VERSION: ${{ inputs.hg-version }} - - name: Integration tests (Playwright) - if: ${{ inputs.run-playwright }} + - name: Integration tests (.NET) env: TEST_SERVER_HOSTNAME: ${{ vars.TEST_SERVER_HOSTNAME }} # this is not a typo, we need to use the lf domain because it has a cert that hg will validate @@ -130,11 +116,70 @@ jobs: TEST_RESUMABLE_HG_HOSTNAME: ${{ vars.TEST_RESUMABLE_HG_HOSTNAME }} TEST_PROJECT_CODE: 'sena-3' TEST_DEFAULT_PASSWORD: ${{ secrets.TEST_USER_PASSWORD }} - working-directory: frontend - run: pnpm test + # 1.5gb max heap size, must be in hex https://learn.microsoft.com/en-us/dotnet/core/runtime-config/garbage-collector#heap-limit + # the self hosted runner only has 2gb so this should prevent it from running out of memory + DOTNET_GCHeapHardLimit: '0x2CB417800' - - name: Integration tests (.NET) + run: dotnet test --output ./bin --logger trx --results-directory ./test-results --filter Category=Integration + - name: Publish unit test results + uses: EnricoMi/publish-unit-test-result-action/composite@8885e273a4343cd7b48eaa72428dea0c3067ea98 # v2.14.0 + if: ${{ always() && !env.act }} + with: + check_name: Integration Tests ${{ inputs.runs-on }} for Mercurial ${{ inputs.hg-version }} + files: ./test-results/*.trx + - name: Publish results to testspace if: always() + run: testspace "[.Net Integration/${{ inputs.runs-on }} HG ${{ inputs.hg-version }}]./test-results/*.trx" + + playwright-test: + if: ${{ inputs.run-playwright }} + timeout-minutes: 120 + name: Playwright tests on ${{ inputs.runs-on }} for Mercurial ${{ inputs.hg-version }} on ${{ inputs.environment }} + permissions: + checks: write + environment: + name: ${{ inputs.environment }} + runs-on: ${{ inputs.runs-on }} + steps: + - uses: actions/checkout@v4 + with: + submodules: true + - uses: testspace-com/setup-testspace@v1.0.6 + with: + domain: ${{ github.repository_owner }} + - name: Setup self-hosted dependencies + if: ${{ inputs.runs-on == 'self-hosted' }} + run: | + sudo apt-get update + sudo apt-get install -y p7zip-full iputils-ping python3-venv wget zlib1g-dev libssl-dev #needed by setup python + wget -q https://github.com/PowerShell/PowerShell/releases/download/v7.4.1/powershell_7.4.1-1.deb_amd64.deb + sudo dpkg -i powershell_7.4.1-1.deb_amd64.deb + sudo apt-get install -f + rm powershell_7.4.1-1.deb_amd64.deb + pwsh #validate that powershell installed correctly + # First we need to setup Node... + - uses: actions/setup-node@v4 + with: + node-version-file: 'frontend/package.json' + # Then we can set up pnpm... + - uses: pnpm/action-setup@a3252b78c470c02df07e9d59298aecedc3ccdd6d # v3.0.0 + with: + package_json_file: 'frontend/package.json' + # Then we can have Node set up package caching + - uses: actions/setup-node@v4 + with: + node-version-file: 'frontend/package.json' + cache: 'pnpm' + cache-dependency-path: 'frontend/pnpm-lock.yaml' + - name: Playwright setup + working-directory: frontend + run: pnpm install && pnpm pretest + - name: Set up Playwright dependencies + working-directory: frontend + if: ${{ inputs.runs-on == 'self-hosted' }} + run: sudo pnpm exec playwright install-deps + + - name: Integration tests (Playwright) env: TEST_SERVER_HOSTNAME: ${{ vars.TEST_SERVER_HOSTNAME }} # this is not a typo, we need to use the lf domain because it has a cert that hg will validate @@ -142,28 +187,18 @@ jobs: TEST_RESUMABLE_HG_HOSTNAME: ${{ vars.TEST_RESUMABLE_HG_HOSTNAME }} TEST_PROJECT_CODE: 'sena-3' TEST_DEFAULT_PASSWORD: ${{ secrets.TEST_USER_PASSWORD }} - # 1.5gb max heap size, must be in hex https://learn.microsoft.com/en-us/dotnet/core/runtime-config/garbage-collector#heap-limit - # the self hosted runner only has 2gb so this should prevent it from running out of memory - DOTNET_GCHeapHardLimit: '0x2CB417800' - - run: dotnet test --output ./bin --logger trx --results-directory ./test-results --filter Category=Integration - + working-directory: frontend + run: pnpm test - name: Password protect Playwright traces id: password_protect_test_results - if: ${{ always() && inputs.run-playwright }} + if: ${{ always() }} shell: bash env: ZIP_PASSWORD: ${{ secrets.TEST_USER_PASSWORD }} run: 7z a ./playwright-traces.7z -mx=0 -mmt=off ./frontend/test-results -p"$ZIP_PASSWORD" - - name: Publish unit test results - uses: EnricoMi/publish-unit-test-result-action/composite@8885e273a4343cd7b48eaa72428dea0c3067ea98 # v2.14.0 - if: ${{ always() && !env.act }} - with: - check_name: Integration Tests ${{ inputs.runs-on }} for Mercurial ${{ inputs.hg-version }} - files: ./test-results/*.trx - name: Publish results to testspace if: always() - run: testspace "[.Net Integration/${{ inputs.runs-on }} HG ${{ inputs.hg-version }}]./test-results/*.trx" "[Playwright]./frontend/test-results/*.xml" + run: testspace "[Playwright]./frontend/test-results/*.xml" - name: Upload playwright results if: ${{ always() && steps.password_protect_test_results.outcome == 'success' }} uses: actions/upload-artifact@v4