diff options
| author | Stefan Boberg <[email protected]> | 2026-04-11 18:29:21 +0200 |
|---|---|---|
| committer | GitHub Enterprise <[email protected]> | 2026-04-11 18:29:21 +0200 |
| commit | 5111b879c181997a86ab8096097124cb62958708 (patch) | |
| tree | 9f9623046c74de04a7b6b94d9acd12bed97b5389 | |
| parent | Dashboard stats tiles no longer flicker (#943) (diff) | |
| download | zen-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.yml | 298 |
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' |