Skip to content

Commit

Permalink
Run Playwright and dotnet tests in parallel in CI (#856)
Browse files Browse the repository at this point in the history
* 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 <[email protected]>
  • Loading branch information
rmunn and hahn-kev authored Jun 17, 2024
1 parent de51a1e commit 69e07a2
Showing 1 changed file with 89 additions and 54 deletions.
143 changes: 89 additions & 54 deletions .github/workflows/integration-test.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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:
Expand All @@ -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
Expand All @@ -104,66 +103,102 @@ 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
TEST_STANDARD_HG_HOSTNAME: ${{ vars.TEST_STANDARD_HG_HOSTNAME }}
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/[email protected]
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
TEST_STANDARD_HG_HOSTNAME: ${{ vars.TEST_STANDARD_HG_HOSTNAME }}
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
Expand Down

0 comments on commit 69e07a2

Please sign in to comment.