aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStefan Boberg <[email protected]>2026-04-11 18:29:21 +0200
committerGitHub Enterprise <[email protected]>2026-04-11 18:29:21 +0200
commit5111b879c181997a86ab8096097124cb62958708 (patch)
tree9f9623046c74de04a7b6b94d9acd12bed97b5389
parentDashboard stats tiles no longer flicker (#943) (diff)
downloadzen-5111b879c181997a86ab8096097124cb62958708.tar.xz
zen-5111b879c181997a86ab8096097124cb62958708.zip
Add manual test workflow with configurable sanitizers and allocators (#944)
- Adds a `workflow_dispatch` workflow ("Manual Test Run") that can be triggered from the Actions tab - Configurable options: platform, memory allocator (`--malloc=stomp`/mimalloc/rpmalloc), sanitizer (asan/tsan/msan), test suite, and freeform extra arguments - Mirrors the build & test steps from `validate.yml` but always builds debug with sentry disabled, and with longer timeout (40min) to accommodate sanitizer overhead
-rw-r--r--.github/workflows/test_manual.yml298
1 files changed, 298 insertions, 0 deletions
diff --git a/.github/workflows/test_manual.yml b/.github/workflows/test_manual.yml
new file mode 100644
index 000000000..095828656
--- /dev/null
+++ b/.github/workflows/test_manual.yml
@@ -0,0 +1,298 @@
+name: Manual Test Run
+env:
+ XMAKE_VERSION: 2.9.9
+ WINDOWS_SDK_VERSION: 22621
+ XMAKE_GLOBALDIR: ${{ github.workspace }}/../.xmake_shared
+
+on:
+ workflow_dispatch:
+ inputs:
+ platform:
+ description: 'Platform to test on'
+ required: true
+ type: choice
+ options:
+ - windows
+ - linux
+ - macos
+ - all
+ default: 'windows'
+ malloc:
+ description: 'Memory allocator override (runtime --malloc flag passed to test binaries)'
+ type: choice
+ options:
+ - default
+ - stomp
+ - mimalloc
+ - rpmalloc
+ default: 'default'
+ sanitizer:
+ description: 'Sanitizer to enable (triggers full rebuild)'
+ type: choice
+ options:
+ - none
+ - asan
+ - tsan
+ - msan
+ default: 'none'
+ test_suite:
+ description: 'Test suite to run (core, store, server, integration, http, util, remotestore, all)'
+ type: string
+ default: 'all'
+ extra_args:
+ description: 'Extra arguments passed to test runners (after --)'
+ type: string
+ default: ''
+
+jobs:
+ windows-test:
+ name: Test Windows
+ if: ${{ inputs.platform == 'windows' || inputs.platform == 'all' }}
+ runs-on: [windows, x64, zen]
+ timeout-minutes: 40
+
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v4
+
+ - name: Trust workspace
+ run: git config --global --add safe.directory "${{ github.workspace }}"
+
+ - name: Setup xmake
+ uses: ue-foundation/[email protected]
+ with:
+ xmake-version: ${{ env.XMAKE_VERSION }}
+
+ - name: Config
+ shell: bash
+ run: |
+ SANITIZER_FLAG=""
+ if [ "${{ inputs.sanitizer }}" != "none" ]; then
+ SANITIZER_FLAG="--${{ inputs.sanitizer }}=y"
+ fi
+ xmake config -vD -y -m debug --arch=x64 --zensentry=no $SANITIZER_FLAG
+
+ - name: Clean reports
+ run: if (Test-Path build/reports) { Remove-Item -Recurse -Force build/reports }
+
+ - name: Kill stale test processes
+ shell: powershell
+ run: |
+ $buildDir = "${{ github.workspace }}\build"
+ foreach ($name in @('zenserver', 'minio', 'nomad', 'consul')) {
+ $procs = Get-Process -Name $name -ErrorAction SilentlyContinue |
+ Where-Object { $_.Path -and $_.Path.StartsWith($buildDir, [System.StringComparison]::OrdinalIgnoreCase) }
+ foreach ($p in $procs) {
+ Write-Host "Killing stale $name (PID $($p.Id)): $($p.Path)"
+ $p | Stop-Process -Force -ErrorAction SilentlyContinue
+ }
+ }
+
+ - name: Build & Test
+ shell: bash
+ run: |
+ EXTRA_ARGS=""
+ MALLOC_ARG=""
+ if [ "${{ inputs.malloc }}" != "default" ]; then
+ MALLOC_ARG="--malloc=${{ inputs.malloc }}"
+ fi
+ USER_ARGS="${{ inputs.extra_args }}"
+ if [ -n "$MALLOC_ARG" ] || [ -n "$USER_ARGS" ]; then
+ EXTRA_ARGS="-- $MALLOC_ARG $USER_ARGS"
+ fi
+ xmake test -v -y --run=${{ inputs.test_suite }} --junit $EXTRA_ARGS
+
+ - name: Kill test processes
+ if: always()
+ shell: powershell
+ run: |
+ $buildDir = "${{ github.workspace }}\build"
+ foreach ($name in @('zenserver', 'minio', 'nomad', 'consul')) {
+ $procs = Get-Process -Name $name -ErrorAction SilentlyContinue |
+ Where-Object { $_.Path -and $_.Path.StartsWith($buildDir, [System.StringComparison]::OrdinalIgnoreCase) }
+ foreach ($p in $procs) {
+ Write-Host "Killing leftover $name (PID $($p.Id)): $($p.Path)"
+ $p | Stop-Process -Force -ErrorAction SilentlyContinue
+ }
+ }
+
+ - name: Upload report
+ if: failure() || success()
+ uses: actions/upload-artifact@v3-node20
+ with:
+ name: reports-win64-${{ inputs.sanitizer }}-${{ inputs.malloc }}
+ path: build/reports/*.xml
+
+ - name: Test Report
+ if: failure() || success()
+ uses: ue-foundation/test-reporter@v2
+ with:
+ name: Test Results (win64, ${{ inputs.sanitizer }}, malloc=${{ inputs.malloc }})
+ path: build/reports/*.xml
+ reporter: java-junit
+ list-tests: 'failed'
+
+ linux-test:
+ name: Test Linux
+ if: ${{ inputs.platform == 'linux' || inputs.platform == 'all' }}
+ runs-on: [linux, x64, zen]
+ timeout-minutes: 40
+
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v4
+
+ - name: Install UE Toolchain
+ run: |
+ rm -rf ./.tmp-ue-toolchain
+ ./scripts/ue_build_linux/get_ue_toolchain.sh ./.tmp-ue-toolchain
+
+ - name: Setup xmake
+ uses: ue-foundation/[email protected]
+ with:
+ xmake-version: ${{ env.XMAKE_VERSION }}
+
+ - name: Config
+ run: |
+ SANITIZER_FLAG=""
+ if [ "${{ inputs.sanitizer }}" != "none" ]; then
+ SANITIZER_FLAG="--${{ inputs.sanitizer }}=y"
+ fi
+ xmake config -v -y -m debug --arch=x86_64 --zensentry=no --toolchain=ue-clang --sdk=${{ github.workspace }}/.tmp-ue-toolchain $SANITIZER_FLAG
+
+ - name: Clean reports
+ run: rm -rf build/reports
+
+ - name: Kill stale test processes
+ run: |
+ build_dir="${{ github.workspace }}/build"
+ for name in zenserver minio nomad consul; do
+ pgrep -a "$name" 2>/dev/null | while read -r pid cmd; do
+ if [[ "$cmd" == "$build_dir"* ]]; then
+ echo "Killing stale $name (PID $pid): $cmd"
+ kill -9 "$pid" 2>/dev/null || true
+ fi
+ done || true
+ done
+
+ - name: Build & Test
+ run: |
+ EXTRA_ARGS=""
+ MALLOC_ARG=""
+ if [ "${{ inputs.malloc }}" != "default" ]; then
+ MALLOC_ARG="--malloc=${{ inputs.malloc }}"
+ fi
+ USER_ARGS="${{ inputs.extra_args }}"
+ if [ -n "$MALLOC_ARG" ] || [ -n "$USER_ARGS" ]; then
+ EXTRA_ARGS="-- $MALLOC_ARG $USER_ARGS"
+ fi
+ xmake test -v -y --run=${{ inputs.test_suite }} --junit $EXTRA_ARGS
+
+ - name: Kill test processes
+ if: always()
+ run: |
+ build_dir="${{ github.workspace }}/build"
+ for name in zenserver minio nomad consul; do
+ pgrep -a "$name" 2>/dev/null | while read -r pid cmd; do
+ if [[ "$cmd" == "$build_dir"* ]]; then
+ echo "Killing leftover $name (PID $pid): $cmd"
+ kill -9 "$pid" 2>/dev/null || true
+ fi
+ done || true
+ done
+
+ - name: Upload report
+ if: failure() || success()
+ uses: actions/upload-artifact@v3-node20
+ with:
+ name: reports-linux-${{ inputs.sanitizer }}-${{ inputs.malloc }}
+ path: build/reports/*.xml
+
+ - name: Test Report
+ if: failure() || success()
+ uses: ue-foundation/test-reporter@v2
+ with:
+ name: Test Results (linux, ${{ inputs.sanitizer }}, malloc=${{ inputs.malloc }})
+ path: build/reports/*.xml
+ reporter: java-junit
+ list-tests: 'failed'
+
+ macos-test:
+ name: Test macOS
+ if: ${{ inputs.platform == 'macos' || inputs.platform == 'all' }}
+ runs-on: [macos, x64, zen]
+ timeout-minutes: 40
+
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v4
+
+ - name: Setup xmake
+ uses: ue-foundation/[email protected]
+ with:
+ xmake-version: ${{ env.XMAKE_VERSION }}
+
+ - name: Config
+ run: |
+ SANITIZER_FLAG=""
+ if [ "${{ inputs.sanitizer }}" != "none" ]; then
+ SANITIZER_FLAG="--${{ inputs.sanitizer }}=y"
+ fi
+ xmake config -v -y -m debug --arch=x86_64 --zensentry=no $SANITIZER_FLAG
+
+ - name: Clean reports
+ run: rm -rf build/reports
+
+ - name: Kill stale test processes
+ run: |
+ build_dir="${{ github.workspace }}/build"
+ for name in zenserver minio nomad consul; do
+ pgrep -a "$name" 2>/dev/null | while read -r pid cmd; do
+ if [[ "$cmd" == "$build_dir"* ]]; then
+ echo "Killing stale $name (PID $pid): $cmd"
+ kill -9 "$pid" 2>/dev/null || true
+ fi
+ done || true
+ done
+
+ - name: Build & Test
+ run: |
+ EXTRA_ARGS=""
+ MALLOC_ARG=""
+ if [ "${{ inputs.malloc }}" != "default" ]; then
+ MALLOC_ARG="--malloc=${{ inputs.malloc }}"
+ fi
+ USER_ARGS="${{ inputs.extra_args }}"
+ if [ -n "$MALLOC_ARG" ] || [ -n "$USER_ARGS" ]; then
+ EXTRA_ARGS="-- $MALLOC_ARG $USER_ARGS"
+ fi
+ xmake test -v -y --run=${{ inputs.test_suite }} --junit $EXTRA_ARGS
+
+ - name: Kill test processes
+ if: always()
+ run: |
+ build_dir="${{ github.workspace }}/build"
+ for name in zenserver minio nomad consul; do
+ pgrep -a "$name" 2>/dev/null | while read -r pid cmd; do
+ if [[ "$cmd" == "$build_dir"* ]]; then
+ echo "Killing leftover $name (PID $pid): $cmd"
+ kill -9 "$pid" 2>/dev/null || true
+ fi
+ done || true
+ done
+
+ - name: Upload report
+ if: failure() || success()
+ uses: actions/upload-artifact@v3-node20
+ with:
+ name: reports-macos-${{ inputs.sanitizer }}-${{ inputs.malloc }}
+ path: build/reports/*.xml
+
+ - name: Test Report
+ if: failure() || success()
+ uses: ue-foundation/test-reporter@v2
+ with:
+ name: Test Results (macos, ${{ inputs.sanitizer }}, malloc=${{ inputs.malloc }})
+ path: build/reports/*.xml
+ reporter: java-junit
+ list-tests: 'failed'