Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Run Playwright and dotnet tests in parallel in CI #856

Merged
merged 10 commits into from
Jun 17, 2024
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