AutoTest #1829
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: AutoTest | |
| on: | |
| workflow_dispatch: # manually trigger | |
| inputs: | |
| run_arm_tests: | |
| description: 'Run slow ARM test jobs' | |
| required: false | |
| type: boolean | |
| default: false | |
| workflow_call: | |
| jobs: | |
| #Windows | |
| win64: | |
| runs-on: ${{ matrix.runner.runs_on }} | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| cc: [ msvc, clang, mingw_clang, mingw_gcc ] | |
| cpp_ver: [ 11, 14, 17, 20, 23 ] | |
| runner: | |
| - label: "x86_64" | |
| runs_on: windows-latest | |
| - label: "arm64" | |
| runs_on: windows-11-arm | |
| exclude: | |
| - cc: mingw_gcc | |
| runner: 11-arm | |
| steps: | |
| - name: Checkout repository | |
| uses: actions/checkout@v4 | |
| - name: Set up Java | |
| uses: actions/setup-java@v4 | |
| with: | |
| distribution: 'temurin' | |
| java-version: '21' | |
| - name: Install Clang(Attempt 1) | |
| if: ${{ matrix.runner.runs_on == 'windows-11-arm' }} | |
| continue-on-error: true | |
| shell: bash | |
| run: | | |
| choco uninstall -y llvm --all-versions || true | |
| choco install -y llvm | |
| - name: Install Clang(Attempt 2) | |
| if: ${{ matrix.runner.runs_on == 'windows-11-arm' }} | |
| continue-on-error: true | |
| shell: bash | |
| run: | | |
| choco install -y llvm | |
| - name: Install Clang(Attempt 3) | |
| if: ${{ matrix.runner.runs_on == 'windows-11-arm' }} | |
| continue-on-error: true | |
| shell: bash | |
| run: | | |
| choco install -y llvm | |
| - name: Install MSYS2 | |
| if: ${{ matrix.cc == 'mingw_gcc' }} | |
| uses: msys2/setup-msys2@v2 | |
| with: | |
| msystem: MINGW64 | |
| release: true | |
| path-type: inherit | |
| update: true | |
| - name: Ensure MSYS2 packages (Attempt 1) | |
| if: ${{ matrix.cc == 'mingw_gcc' }} | |
| continue-on-error: true | |
| shell: msys2 {0} | |
| run: | | |
| pacman -S --noconfirm --needed --overwrite '*' mingw-w64-x86_64-gcc mingw-w64-x86_64-binutils mingw-w64-x86_64-make | |
| echo "MSYS2 Root: $MSYSTEM_CARCH" | |
| which gcc | |
| which mingw32-make | |
| - name: Ensure MSYS2 packages (Attempt 2) | |
| if: ${{ matrix.cc == 'mingw_gcc' }} | |
| continue-on-error: true | |
| shell: msys2 {0} | |
| run: | | |
| pacman -S --noconfirm --needed --overwrite '*' mingw-w64-x86_64-gcc mingw-w64-x86_64-binutils mingw-w64-x86_64-make | |
| echo "MSYS2 Root: $MSYSTEM_CARCH" | |
| which gcc | |
| which mingw32-make | |
| - name: Ensure MSYS2 packages (Attempt 3) | |
| if: ${{ matrix.cc == 'mingw_gcc' }} | |
| continue-on-error: true | |
| shell: msys2 {0} | |
| run: | | |
| pacman -S --noconfirm --needed --overwrite '*' mingw-w64-x86_64-gcc mingw-w64-x86_64-binutils mingw-w64-x86_64-make | |
| echo "MSYS2 Root: $MSYSTEM_CARCH" | |
| which gcc | |
| which mingw32-make | |
| - name: Remove conflicting MinGW paths | |
| if: ${{ matrix.cc == 'mingw_gcc' }} | |
| run: | | |
| $env:Path = $env:Path -replace 'C:\\mingw64\\bin;','' -replace 'C:\\Program Files\\Git\\mingw64\\bin;','' | |
| echo "PATH=$env:Path" >> $env:GITHUB_ENV | |
| shell: powershell | |
| - name: Add MSYS2 to PATH | |
| if: ${{ matrix.cc == 'mingw_gcc' }} | |
| run: | | |
| $env:Path = "${{ steps.msys2.outputs.msys2-location }}\mingw64\bin;" + $env:Path | |
| echo "PATH=$env:Path" >> $env:GITHUB_ENV | |
| shell: powershell | |
| - name: Enable WER LocalDumps (BqLogUnitTest.exe) | |
| shell: powershell | |
| run: | | |
| $ErrorActionPreference = "Stop" | |
| $dumpDir = Join-Path $env:GITHUB_WORKSPACE "win_dumps" | |
| New-Item -ItemType Directory -Force -Path $dumpDir | Out-Null | |
| Write-Host "Dump dir: $dumpDir" | |
| # Use HKCU to avoid requiring elevated permissions. | |
| $key = "HKCU:\Software\Microsoft\Windows\Windows Error Reporting\LocalDumps\BqLogUnitTest.exe" | |
| New-Item -Force -Path $key | Out-Null | |
| New-ItemProperty -Path $key -Name DumpFolder -PropertyType ExpandString -Value $dumpDir -Force | Out-Null | |
| New-ItemProperty -Path $key -Name DumpType -PropertyType DWord -Value 2 -Force | Out-Null # 2 = full dump | |
| New-ItemProperty -Path $key -Name DumpCount -PropertyType DWord -Value 10 -Force | Out-Null | |
| Get-ItemProperty -Path $key | Format-List | |
| - name: Build for Windows | |
| id: win_run_tests | |
| continue-on-error: true | |
| shell: powershell | |
| run: | | |
| $ErrorActionPreference = "Continue" | |
| cd build\test\win64 | |
| # Avoid any interactive `pause` hanging CI. | |
| cmd /c "call .\run_test_${{ matrix.cc }}.bat ${{ matrix.cpp_ver }} <nul" | |
| $code = $LASTEXITCODE | |
| "exitcode=$code" >> $env:GITHUB_OUTPUT | |
| Write-Host "BqLogUnitTest exitcode=$code" | |
| exit 0 | |
| - name: Print crash stack from dump (cdb) | |
| if: steps.win_run_tests.outputs.exitcode != '0' | |
| shell: powershell | |
| run: | | |
| $ErrorActionPreference = "Continue" | |
| $dumpDir = Join-Path $env:GITHUB_WORKSPACE "win_dumps" | |
| Write-Host "Dump dir: $dumpDir" | |
| $dumps = Get-ChildItem -Path $dumpDir -Filter *.dmp -ErrorAction SilentlyContinue | Sort-Object LastWriteTime -Descending | |
| if (-not $dumps) { | |
| Write-Host "No .dmp found (process may have terminated without WER dump)." | |
| exit 0 | |
| } | |
| $dump = $dumps[0].FullName | |
| Write-Host "Using dump: $dump" | |
| $cdb = (Get-Command cdb.exe -ErrorAction SilentlyContinue).Source | |
| if (-not $cdb) { | |
| $candidates = @( | |
| "C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\cdb.exe", | |
| "C:\Program Files (x86)\Windows Kits\11\Debuggers\x64\cdb.exe", | |
| "C:\Program Files (x86)\Windows Kits\10\Debuggers\x86\cdb.exe", | |
| "C:\Program Files (x86)\Windows Kits\11\Debuggers\x86\cdb.exe" | |
| ) | |
| foreach ($p in $candidates) { if (Test-Path $p) { $cdb = $p; break } } | |
| } | |
| if (-not $cdb) { | |
| Write-Host "cdb.exe not found, attempting to install WinDbg via Chocolatey..." | |
| choco install -y windbg --no-progress | |
| $cdb = (Get-Command cdb.exe -ErrorAction SilentlyContinue).Source | |
| if (-not $cdb) { | |
| $candidates = @( | |
| "C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\cdb.exe", | |
| "C:\Program Files (x86)\Windows Kits\11\Debuggers\x64\cdb.exe" | |
| ) | |
| foreach ($p in $candidates) { if (Test-Path $p) { $cdb = $p; break } } | |
| } | |
| } | |
| if (-not $cdb) { | |
| Write-Host "Still no cdb.exe found. Dump will still be uploaded as artifact." | |
| exit 0 | |
| } | |
| Write-Host "Using cdb: $cdb" | |
| Write-Host "=== cdb analysis begin ===" | |
| & $cdb -z $dump -c "!analyze -v; .ecxr; kv; q" 2>&1 | |
| Write-Host "=== cdb analysis end ===" | |
| - name: Upload Windows crash dumps (if any) | |
| if: always() | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: win_dumps_${{ matrix.runner.label }}_${{ matrix.cc }}_cpp${{ matrix.cpp_ver }} | |
| path: win_dumps/** | |
| if-no-files-found: ignore | |
| - name: Fail job if tests failed | |
| if: steps.win_run_tests.outputs.exitcode != '0' | |
| shell: powershell | |
| run: exit 1 | |
| #Linux-ubuntu | |
| ubuntu: | |
| runs-on: ${{ matrix.runner.runs_on }} | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| runner: | |
| - label: "x86_64" | |
| runs_on: ubuntu-latest | |
| - label: "arm64" | |
| runs_on: ubuntu-24.04-arm | |
| cc: [ clang, gcc ] | |
| cpp_ver: [ 11, 14, 17, 20, 23 ] | |
| steps: | |
| - name: Checkout repository | |
| uses: actions/checkout@v4 | |
| - name: Set up Java | |
| uses: actions/setup-java@v4 | |
| with: | |
| java-version: '11' | |
| distribution: 'adopt' | |
| - name: Install GDB(Attempt 1) | |
| continue-on-error: true | |
| run: | | |
| sudo apt-get update && sudo apt-get install -y gdb | |
| - name: Install GDB(Attempt 2) | |
| continue-on-error: true | |
| run: | | |
| sudo apt-get update && sudo apt-get install -y gdb | |
| - name: Install GDB(Attempt 3) | |
| continue-on-error: true | |
| run: | | |
| sudo apt-get update && sudo apt-get install -y gdb | |
| - name: Build for Linux | |
| run: | | |
| cd build/test/linux | |
| chmod +x *.sh | |
| ./run_test_${{ matrix.cc }}.sh ${{ matrix.cpp_ver }} | |
| #linux-debian | |
| debian: | |
| runs-on: ubuntu-latest | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| arch: | |
| - label: "x86_64" | |
| runs_on: "" | |
| - label: "x86" | |
| runs_on: "i386_" | |
| cc: [ clang, gcc ] | |
| cpp_ver: [ 11, 14, 17, 20, 23 ] | |
| container: | |
| image: ghcr.io/pippocao/bqlog/${{ matrix.arch.runs_on }}debian:latest | |
| steps: | |
| - name: Checkout repository | |
| uses: actions/checkout@v4 | |
| - name: Install necessary tools (Attempt 1) | |
| continue-on-error: true | |
| run: | | |
| apt-get update | |
| apt-get install -y gcc clang g++ make cmake gdb | |
| apt-get install -y software-properties-common | |
| apt-get update | |
| apt-get install -y openjdk-17-jdk | |
| apt-get install -y openssh-client | |
| - name: Install necessary tools (Attempt 2) | |
| continue-on-error: true | |
| run: | | |
| apt-get update | |
| apt-get install -y gcc clang g++ make cmake gdb | |
| apt-get install -y software-properties-common | |
| apt-get update | |
| apt-get install -y openjdk-17-jdk | |
| apt-get install -y openssh-client | |
| - name: Install necessary tools (Attempt 3) | |
| continue-on-error: true | |
| run: | | |
| apt-get update | |
| apt-get install -y gcc clang g++ make cmake gdb | |
| apt-get install -y software-properties-common | |
| apt-get update | |
| apt-get install -y openjdk-17-jdk | |
| apt-get install -y openssh-client | |
| - name: Set up Java | |
| run: | | |
| export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64 | |
| echo "JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64" >> $GITHUB_ENV | |
| - name: Build for Debian | |
| run: | | |
| cd build/test/linux | |
| chmod +x *.sh | |
| ./run_test_${{ matrix.cc }}.sh ${{ matrix.cpp_ver }} | |
| #Mac | |
| mac_silicon: | |
| runs-on: macos-latest | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| cpp_ver: [ 11, 14, 17, 20, 23 ] | |
| steps: | |
| - uses: maxim-lobanov/setup-xcode@v1 | |
| with: | |
| xcode-version: latest-stable | |
| - name: Checkout repository | |
| uses: actions/checkout@v4 | |
| - name: Set up Java | |
| uses: actions/setup-java@v4 | |
| with: | |
| java-version: '11' | |
| distribution: 'adopt' | |
| - name: Build for macOS | |
| run: | | |
| cd build/test/mac | |
| chmod +x *.sh | |
| ./run_test.sh ${{ matrix.cpp_ver }} | |
| #Unix-FreeBSD | |
| freeBSD_x86_64: | |
| runs-on: ubuntu-latest | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| cc: [ gcc, clang ] | |
| cpp_ver: [ 11, 14, 17, 20, 23 ] | |
| steps: | |
| - name: Checkout repository | |
| uses: actions/checkout@v4 | |
| - name: Free Disk Space (Ubuntu) | |
| uses: jlumbroso/[email protected] | |
| with: | |
| tool-cache: false | |
| android: true | |
| dotnet: true | |
| haskell: true | |
| large-packages: true | |
| docker-images: true | |
| swap-storage: true | |
| - name: Run in FreeBSD(Attempt 1) | |
| continue-on-error: true | |
| uses: vmactions/freebsd-vm@v1 | |
| with: | |
| usesh: true | |
| mem: 8192 | |
| prepare: | | |
| for i in 1 2 3 4 5; do | |
| pkg install -y llvm cmake bash gdb gcc && exit 0 | |
| echo "Install failed, retrying in 60s... ($i/5)" | |
| sleep 60 | |
| done | |
| exit 1 | |
| run: | | |
| touch UNIT_TEST_STARTED | |
| set -e -x | |
| cd build/test/unix_like | |
| chmod +x *.sh | |
| ls -l | |
| ./run_test_${{ matrix.cc }}.sh ${{ matrix.cpp_ver }} | |
| touch ../../../UNIT_TEST_SUCCESS | |
| - name: Check Retry | |
| id: CheckRetry | |
| run: | | |
| if [ ! -f "UNIT_TEST_STARTED" ]; then | |
| echo "retry=true" >> $GITHUB_OUTPUT | |
| elif [ ! -f "UNIT_TEST_SUCCESS" ]; then | |
| echo "::error::Test script execution failed! (Not retrying)" | |
| exit 1 | |
| fi | |
| - name: Cleanup Before Retry | |
| if: steps.CheckRetry.outputs.retry == 'true' | |
| run: | | |
| set +e | |
| DOMAINS="$(sudo virsh list --all --name 2>/dev/null | grep -v "^$" || true)" | |
| if [ -z "$DOMAINS" ]; then | |
| echo "No lingering domains found (virsh may be unavailable or no domains exist)." | |
| else | |
| echo "Found domains: $DOMAINS" | |
| for DOMAIN in $DOMAINS; do | |
| echo "Processing domain: $DOMAIN" | |
| sudo virsh destroy "$DOMAIN" 2>/dev/null || echo "virsh destroy failed for $DOMAIN (ignored)" | |
| sudo virsh undefine "$DOMAIN" --nvram 2>/dev/null \ | |
| || sudo virsh undefine "$DOMAIN" 2>/dev/null \ | |
| || echo "virsh undefine failed for $DOMAIN (ignored)" | |
| done | |
| fi | |
| echo "--- Removing potentially corrupted VM images ---" | |
| find . -name "*.qcow2" -delete 2>/dev/null || echo "local qcow2 cleanup failed (ignored)" | |
| sudo find /home/runner/work/_actions/vmactions -name "*.qcow2" -delete 2>/dev/null || echo "vmactions qcow2 cleanup failed (ignored)" | |
| sudo rm -f /var/lib/libvirt/dnsmasq/*.leases 2>/dev/null || echo "dnsmasq leases cleanup failed (ignored)" | |
| sleep 5 | |
| echo "Cleanup complete." | |
| - name: Run in FreeBSD(Attempt 2) | |
| if: steps.CheckRetry.outputs.retry == 'true' | |
| uses: vmactions/freebsd-vm@v1 | |
| with: | |
| usesh: true | |
| mem: 8192 | |
| prepare: | | |
| for i in 1 2 3 4 5; do | |
| pkg install -y llvm cmake bash gdb gcc && exit 0 | |
| echo "Install failed, retrying in 60s... ($i/5)" | |
| sleep 60 | |
| done | |
| exit 1 | |
| run: | | |
| touch UNIT_TEST_STARTED | |
| set -e -x | |
| cd build/test/unix_like | |
| chmod +x *.sh | |
| ls -l | |
| ./run_test_${{ matrix.cc }}.sh ${{ matrix.cpp_ver }} | |
| touch ../../../UNIT_TEST_SUCCESS | |
| freeBSD_arm64_test_cpp17: | |
| if: ${{ github.event.inputs.run_arm_tests == true || github.event.inputs.run_arm_tests == 'true' }} | |
| runs-on: ubuntu-latest | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| cc: [ gcc, clang ] | |
| steps: | |
| - name: Checkout repository | |
| uses: actions/checkout@v4 | |
| - name: Free Disk Space (Ubuntu) | |
| uses: jlumbroso/[email protected] | |
| with: | |
| tool-cache: false | |
| android: true | |
| dotnet: true | |
| haskell: true | |
| large-packages: true | |
| docker-images: true | |
| swap-storage: true | |
| - name: Run in FreeBSD(Attempt 1) | |
| continue-on-error: true | |
| uses: vmactions/freebsd-vm@v1 | |
| with: | |
| arch: aarch64 | |
| usesh: true | |
| mem: 8192 | |
| prepare: | | |
| for i in 1 2 3 4 5; do | |
| pkg install -y llvm cmake bash gdb gcc13 && exit 0 | |
| echo "Install failed, retrying in 60s... ($i/5)" | |
| sleep 60 | |
| done | |
| exit 1 | |
| run: | | |
| touch UNIT_TEST_STARTED | |
| set -e -x | |
| cd build/test/unix_like | |
| chmod +x *.sh | |
| ls -l | |
| set +e | |
| ln -sf /usr/local/bin/gcc13 /usr/local/bin/gcc | |
| ln -sf /usr/local/bin/g++13 /usr/local/bin/g++ | |
| ln -sf /usr/local/bin/gcov13 /usr/local/bin/gcov 2>/dev/null || true | |
| ln -sf /usr/local/bin/gcc-ar13 /usr/local/bin/gcc-ar 2>/dev/null || true | |
| ln -sf /usr/local/bin/gcc-ranlib13 /usr/local/bin/gcc-ranlib 2>/dev/null || true | |
| export LD_LIBRARY_PATH=/usr/local/lib/gcc13 #Adjust according to installed GCC version | |
| export BQ_LOW_PERFORMANCE_TESTS=true | |
| ./run_test_${{ matrix.cc }}.sh 17 | |
| EXIT_CODE=$? | |
| set -e | |
| if [ $EXIT_CODE -ne 0 ]; then | |
| echo "Test failed with exit code $EXIT_CODE" | |
| CORE_FILE="$(find . -maxdepth 5 -type f \( -name 'core' -o -name 'core.*' -o -name '*.core' \) 2>/dev/null | head -n1)" | |
| EXE="" | |
| for cand in ./BqLogUnitTest ./BqLogUnitTest.exe $(find . -maxdepth 5 -type f -name 'BqLogUnitTest' 2>/dev/null | head -n1); do | |
| if [ -n "$cand" ] && [ -x "$cand" ]; then EXE="$cand"; break; fi | |
| done | |
| echo "exe: ${EXE:-<not found>}" | |
| echo "core: ${CORE_FILE:-<not found>}" | |
| if [ -n "$CORE_FILE" ] && [ -n "$EXE" ]; then | |
| echo "=== GDB core backtrace (FreeBSD aarch64) ===" | |
| gdb --batch -q \ | |
| -ex "set pagination off" \ | |
| -ex "info threads" \ | |
| -ex "thread apply all bt full" \ | |
| -ex "quit" \ | |
| "$EXE" "$CORE_FILE" || echo "gdb analysis failed" | |
| else | |
| echo "Core file or executable not found, listing candidates:" | |
| find . -maxdepth 5 -type f \( -name 'core' -o -name 'core.*' -o -name '*.core' -o -name 'BqLogUnitTest' \) 2>/dev/null || true | |
| fi | |
| exit $EXIT_CODE | |
| fi | |
| touch ../../../UNIT_TEST_SUCCESS | |
| - name: Check Retry | |
| id: CheckRetry | |
| run: | | |
| if [ ! -f "UNIT_TEST_STARTED" ]; then | |
| echo "retry=true" >> $GITHUB_OUTPUT | |
| elif [ ! -f "UNIT_TEST_SUCCESS" ]; then | |
| echo "::error::Test script execution failed! (Not retrying)" | |
| exit 1 | |
| fi | |
| - name: Cleanup Before Retry | |
| if: steps.CheckRetry.outputs.retry == 'true' | |
| run: | | |
| set +e | |
| DOMAINS="$(sudo virsh list --all --name 2>/dev/null | grep -v "^$" || true)" | |
| if [ -z "$DOMAINS" ]; then | |
| echo "No lingering domains found (virsh may be unavailable or no domains exist)." | |
| else | |
| echo "Found domains: $DOMAINS" | |
| for DOMAIN in $DOMAINS; do | |
| echo "Processing domain: $DOMAIN" | |
| sudo virsh destroy "$DOMAIN" 2>/dev/null || echo "virsh destroy failed for $DOMAIN (ignored)" | |
| sudo virsh undefine "$DOMAIN" --nvram 2>/dev/null \ | |
| || sudo virsh undefine "$DOMAIN" 2>/dev/null \ | |
| || echo "virsh undefine failed for $DOMAIN (ignored)" | |
| done | |
| fi | |
| echo "--- Removing potentially corrupted VM images ---" | |
| find . -name "*.qcow2" -delete 2>/dev/null || echo "local qcow2 cleanup failed (ignored)" | |
| sudo find /home/runner/work/_actions/vmactions -name "*.qcow2" -delete 2>/dev/null || echo "vmactions qcow2 cleanup failed (ignored)" | |
| sudo rm -f /var/lib/libvirt/dnsmasq/*.leases 2>/dev/null || echo "dnsmasq leases cleanup failed (ignored)" | |
| sleep 5 | |
| echo "Cleanup complete." | |
| - name: Run in FreeBSD(Attempt 2) | |
| if: steps.CheckRetry.outputs.retry == 'true' | |
| uses: vmactions/freebsd-vm@v1 | |
| with: | |
| arch: aarch64 | |
| usesh: true | |
| mem: 8192 | |
| prepare: | | |
| for i in 1 2 3 4 5; do | |
| pkg install -y llvm cmake bash gdb gcc13 && exit 0 | |
| echo "Install failed, retrying in 60s... ($i/5)" | |
| sleep 60 | |
| done | |
| exit 1 | |
| run: | | |
| touch UNIT_TEST_STARTED | |
| set -e -x | |
| cd build/test/unix_like | |
| chmod +x *.sh | |
| ls -l | |
| set +e | |
| ln -sf /usr/local/bin/gcc13 /usr/local/bin/gcc | |
| ln -sf /usr/local/bin/g++13 /usr/local/bin/g++ | |
| ln -sf /usr/local/bin/gcov13 /usr/local/bin/gcov 2>/dev/null || true | |
| ln -sf /usr/local/bin/gcc-ar13 /usr/local/bin/gcc-ar 2>/dev/null || true | |
| ln -sf /usr/local/bin/gcc-ranlib13 /usr/local/bin/gcc-ranlib 2>/dev/null || true | |
| export LD_LIBRARY_PATH=/usr/local/lib/gcc13 #Adjust according to installed GCC version | |
| export BQ_LOW_PERFORMANCE_TESTS=true | |
| ./run_test_${{ matrix.cc }}.sh 17 | |
| EXIT_CODE=$? | |
| set -e | |
| if [ $EXIT_CODE -ne 0 ]; then | |
| echo "Test failed with exit code $EXIT_CODE" | |
| CORE_FILE="$(find . -maxdepth 5 -type f \( -name 'core' -o -name 'core.*' -o -name '*.core' \) 2>/dev/null | head -n1)" | |
| EXE="" | |
| for cand in ./BqLogUnitTest ./BqLogUnitTest.exe $(find . -maxdepth 5 -type f -name 'BqLogUnitTest' 2>/dev/null | head -n1); do | |
| if [ -n "$cand" ] && [ -x "$cand" ]; then EXE="$cand"; break; fi | |
| done | |
| echo "exe: ${EXE:-<not found>}" | |
| echo "core: ${CORE_FILE:-<not found>}" | |
| if [ -n "$CORE_FILE" ] && [ -n "$EXE" ]; then | |
| echo "=== GDB core backtrace (FreeBSD aarch64) ===" | |
| gdb --batch -q \ | |
| -ex "set pagination off" \ | |
| -ex "info threads" \ | |
| -ex "thread apply all bt full" \ | |
| -ex "quit" \ | |
| "$EXE" "$CORE_FILE" || echo "gdb analysis failed" | |
| else | |
| echo "Core file or executable not found, listing candidates:" | |
| find . -maxdepth 5 -type f \( -name 'core' -o -name 'core.*' -o -name '*.core' -o -name 'BqLogUnitTest' \) 2>/dev/null || true | |
| fi | |
| exit $EXIT_CODE | |
| fi | |
| touch ../../../UNIT_TEST_SUCCESS | |
| #Unix-Solaris | |
| solaris_x86_64_GCC: | |
| runs-on: ubuntu-latest | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| cpp_ver: [ 11, 14, 17, 20, 23 ] | |
| steps: | |
| - name: Checkout repository | |
| uses: actions/checkout@v4 | |
| - name: Free Disk Space (Ubuntu) | |
| uses: jlumbroso/[email protected] | |
| with: | |
| tool-cache: false | |
| android: true | |
| dotnet: true | |
| haskell: true | |
| large-packages: true | |
| docker-images: true | |
| swap-storage: true | |
| - name: Run in Solaris(Attempt 1) | |
| uses: vmactions/solaris-vm@v1 | |
| continue-on-error: true | |
| with: | |
| usesh: true | |
| mem: 8192 | |
| prepare: | | |
| for i in 1 2 3 4 5; do | |
| ( | |
| pkg publisher && \ | |
| pkg install -v --accept \ | |
| developer/build/cmake \ | |
| developer/build/gnu-make \ | |
| developer/debug/gdb \ | |
| developer/gcc-14 \ | |
| shell/bash | |
| ) && exit 0 | |
| echo "Install failed, retrying in 60s... ($i/5)" | |
| sleep 60 | |
| done | |
| exit 1 | |
| run: | | |
| touch UNIT_TEST_STARTED | |
| set -e -x | |
| cd build/test/unix_like | |
| chmod +x *.sh | |
| ls -l | |
| ./run_test_gcc.sh ${{ matrix.cpp_ver }} | |
| touch ../../../UNIT_TEST_SUCCESS | |
| - name: Check Retry | |
| id: CheckRetry | |
| run: | | |
| if [ ! -f "UNIT_TEST_STARTED" ]; then | |
| echo "retry=true" >> $GITHUB_OUTPUT | |
| elif [ ! -f "UNIT_TEST_SUCCESS" ]; then | |
| echo "::error::Test script execution failed! (Not retrying)" | |
| exit 1 | |
| fi | |
| - name: Cleanup Before Retry | |
| if: steps.CheckRetry.outputs.retry == 'true' | |
| run: | | |
| set +e | |
| DOMAINS="$(sudo virsh list --all --name 2>/dev/null | grep -v "^$" || true)" | |
| if [ -z "$DOMAINS" ]; then | |
| echo "No lingering domains found (virsh may be unavailable or no domains exist)." | |
| else | |
| echo "Found domains: $DOMAINS" | |
| for DOMAIN in $DOMAINS; do | |
| echo "Processing domain: $DOMAIN" | |
| sudo virsh destroy "$DOMAIN" 2>/dev/null || echo "virsh destroy failed for $DOMAIN (ignored)" | |
| sudo virsh undefine "$DOMAIN" --nvram 2>/dev/null \ | |
| || sudo virsh undefine "$DOMAIN" 2>/dev/null \ | |
| || echo "virsh undefine failed for $DOMAIN (ignored)" | |
| done | |
| fi | |
| echo "--- Removing potentially corrupted VM images ---" | |
| find . -name "*.qcow2" -delete 2>/dev/null || echo "local qcow2 cleanup failed (ignored)" | |
| sudo find /home/runner/work/_actions/vmactions -name "*.qcow2" -delete 2>/dev/null || echo "vmactions qcow2 cleanup failed (ignored)" | |
| sudo rm -f /var/lib/libvirt/dnsmasq/*.leases 2>/dev/null || echo "dnsmasq leases cleanup failed (ignored)" | |
| sleep 5 | |
| echo "Cleanup complete." | |
| - name: Run in Solaris (Attempt 2) | |
| if: steps.CheckRetry.outputs.retry == 'true' | |
| uses: vmactions/solaris-vm@v1 | |
| with: | |
| usesh: true | |
| mem: 8192 | |
| prepare: | | |
| for i in 1 2 3 4 5; do | |
| ( | |
| pkg publisher && \ | |
| pkg install -v --accept \ | |
| developer/build/cmake \ | |
| developer/build/gnu-make \ | |
| developer/debug/gdb \ | |
| developer/gcc-14 \ | |
| shell/bash | |
| ) && exit 0 | |
| echo "Install failed, retrying in 60s... ($i/5)" | |
| sleep 60 | |
| done | |
| exit 1 | |
| run: | | |
| set -e -x | |
| cd build/test/unix_like | |
| chmod +x *.sh | |
| ls -l | |
| ./run_test_gcc.sh ${{ matrix.cpp_ver }} | |
| #Unix-OmnisOS | |
| omnisOS_x86_64_GCC: | |
| runs-on: ubuntu-latest | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| cpp_ver: [ 11, 14, 17, 20, 23 ] | |
| steps: | |
| - name: Checkout repository | |
| uses: actions/checkout@v4 | |
| - name: Free Disk Space (Ubuntu) | |
| uses: jlumbroso/[email protected] | |
| with: | |
| tool-cache: false | |
| android: true | |
| dotnet: true | |
| haskell: true | |
| large-packages: true | |
| docker-images: true | |
| swap-storage: true | |
| - name: Run in OmnisOS(Attempt 1) | |
| uses: vmactions/omnios-vm@v1 | |
| continue-on-error: true | |
| with: | |
| usesh: true | |
| mem: 8192 | |
| prepare: | | |
| for i in 1 2 3 4 5; do | |
| ( | |
| set -e | |
| pkg refresh --full | |
| if ! pkg publisher | grep -q '^extra\.omnios'; then | |
| REL="$(uname -v | sed -n 's/.*\(r[0-9][0-9]*\).*/\1/p')" | |
| [ -n "$REL" ] || REL="r151054" | |
| pkg set-publisher -g "https://pkg.omnios.org/${REL}/extra" extra.omnios || true | |
| pkg refresh --full | |
| fi | |
| pkg install -v --accept shell/bash developer/build/gnu-make || true | |
| pkg install -v --accept ooce/developer/cmake | |
| pkg install -v --accept developer/gcc13 | |
| ) && exit 0 | |
| echo "Prepare failed, retrying in 60s... ($i/5)" | |
| sleep 60 | |
| done | |
| exit 1 | |
| run: | | |
| touch UNIT_TEST_STARTED | |
| set -e -x | |
| cd build/test/unix_like | |
| chmod +x *.sh | |
| ls -l | |
| ./run_test_gcc.sh ${{ matrix.cpp_ver }} | |
| touch ../../../UNIT_TEST_SUCCESS | |
| - name: Check Retry | |
| id: CheckRetry | |
| run: | | |
| if [ ! -f "UNIT_TEST_STARTED" ]; then | |
| echo "retry=true" >> $GITHUB_OUTPUT | |
| elif [ ! -f "UNIT_TEST_SUCCESS" ]; then | |
| echo "::error::Test script execution failed! (Not retrying)" | |
| exit 1 | |
| fi | |
| - name: Cleanup Before Retry | |
| if: steps.CheckRetry.outputs.retry == 'true' | |
| run: | | |
| set +e | |
| DOMAINS="$(sudo virsh list --all --name 2>/dev/null | grep -v "^$" || true)" | |
| if [ -z "$DOMAINS" ]; then | |
| echo "No lingering domains found (virsh may be unavailable or no domains exist)." | |
| else | |
| echo "Found domains: $DOMAINS" | |
| for DOMAIN in $DOMAINS; do | |
| echo "Processing domain: $DOMAIN" | |
| sudo virsh destroy "$DOMAIN" 2>/dev/null || echo "virsh destroy failed for $DOMAIN (ignored)" | |
| sudo virsh undefine "$DOMAIN" --nvram 2>/dev/null \ | |
| || sudo virsh undefine "$DOMAIN" 2>/dev/null \ | |
| || echo "virsh undefine failed for $DOMAIN (ignored)" | |
| done | |
| fi | |
| echo "--- Removing potentially corrupted VM images ---" | |
| find . -name "*.qcow2" -delete 2>/dev/null || echo "local qcow2 cleanup failed (ignored)" | |
| sudo find /home/runner/work/_actions/vmactions -name "*.qcow2" -delete 2>/dev/null || echo "vmactions qcow2 cleanup failed (ignored)" | |
| sudo rm -f /var/lib/libvirt/dnsmasq/*.leases 2>/dev/null || echo "dnsmasq leases cleanup failed (ignored)" | |
| sleep 5 | |
| echo "Cleanup complete." | |
| - name: Run in OmnisOS (Attempt 2) | |
| if: steps.CheckRetry.outputs.retry == 'true' | |
| uses: vmactions/omnios-vm@v1 | |
| with: | |
| usesh: true | |
| mem: 8192 | |
| prepare: | | |
| for i in 1 2 3 4 5; do | |
| ( | |
| set -e | |
| pkg refresh --full | |
| if ! pkg publisher | grep -q '^extra\.omnios'; then | |
| REL="$(uname -v | sed -n 's/.*\(r[0-9][0-9]*\).*/\1/p')" | |
| [ -n "$REL" ] || REL="r151054" | |
| pkg set-publisher -g "https://pkg.omnios.org/${REL}/extra" extra.omnios || true | |
| pkg refresh --full | |
| fi | |
| pkg install -v --accept shell/bash developer/build/gnu-make || true | |
| pkg install -v --accept ooce/developer/cmake | |
| pkg install -v --accept developer/gcc13 | |
| ) && exit 0 | |
| echo "Prepare failed, retrying in 60s... ($i/5)" | |
| sleep 60 | |
| done | |
| exit 1 | |
| run: | | |
| touch UNIT_TEST_STARTED | |
| set -e -x | |
| cd build/test/unix_like | |
| chmod +x *.sh | |
| ls -l | |
| ./run_test_gcc.sh ${{ matrix.cpp_ver }} | |
| touch ../../../UNIT_TEST_SUCCESS | |
| #Unix-DragonFlyBSD | |
| dragonflyBSD_x86_64: | |
| runs-on: ubuntu-latest | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| cc: [ clang, gcc ] | |
| cpp_ver: [ 11, 14, 17, 20, 23 ] | |
| exclude: | |
| - cc: gcc | |
| cpp_ver: 23 | |
| steps: | |
| - name: Checkout repository | |
| uses: actions/checkout@v4 | |
| - name: Free Disk Space (Ubuntu) | |
| uses: jlumbroso/[email protected] | |
| with: | |
| tool-cache: false | |
| android: true | |
| dotnet: true | |
| haskell: true | |
| large-packages: true | |
| docker-images: true | |
| swap-storage: true | |
| - name: Run in DragonFlyBSD (Attempt 1) | |
| continue-on-error: true | |
| uses: vmactions/dragonflybsd-vm@v1 | |
| with: | |
| usesh: true | |
| mem: 8192 | |
| prepare: | | |
| for i in 1 2 3 4 5; do | |
| pkg install -y cmake bash gmake gdb openjdk11 gcc llvm && exit 0 | |
| echo "Install failed, retrying in 60s... ($i/5)" | |
| sleep 60 | |
| done | |
| exit 1 | |
| run: | | |
| touch UNIT_TEST_STARTED | |
| set -e -x | |
| cd build/test/unix_like | |
| chmod +x *.sh | |
| ls -l | |
| ./run_test_${{ matrix.cc }}.sh ${{ matrix.cpp_ver }} | |
| touch ../../../UNIT_TEST_SUCCESS | |
| - name: Check Retry | |
| id: CheckRetry | |
| run: | | |
| if [ ! -f "UNIT_TEST_STARTED" ]; then | |
| echo "retry=true" >> $GITHUB_OUTPUT | |
| elif [ ! -f "UNIT_TEST_SUCCESS" ]; then | |
| echo "::error::Test script execution failed! (Not retrying)" | |
| exit 1 | |
| fi | |
| - name: Cleanup Before Retry | |
| if: steps.CheckRetry.outputs.retry == 'true' | |
| run: | | |
| set +e | |
| DOMAINS="$(sudo virsh list --all --name 2>/dev/null | grep -v "^$" || true)" | |
| if [ -z "$DOMAINS" ]; then | |
| echo "No lingering domains found (virsh may be unavailable or no domains exist)." | |
| else | |
| echo "Found domains: $DOMAINS" | |
| for DOMAIN in $DOMAINS; do | |
| echo "Processing domain: $DOMAIN" | |
| sudo virsh destroy "$DOMAIN" 2>/dev/null || echo "virsh destroy failed for $DOMAIN (ignored)" | |
| sudo virsh undefine "$DOMAIN" --nvram 2>/dev/null \ | |
| || sudo virsh undefine "$DOMAIN" 2>/dev/null \ | |
| || echo "virsh undefine failed for $DOMAIN (ignored)" | |
| done | |
| fi | |
| echo "--- Removing potentially corrupted VM images ---" | |
| find . -name "*.qcow2" -delete 2>/dev/null || echo "local qcow2 cleanup failed (ignored)" | |
| sudo find /home/runner/work/_actions/vmactions -name "*.qcow2" -delete 2>/dev/null || echo "vmactions qcow2 cleanup failed (ignored)" | |
| sudo rm -f /var/lib/libvirt/dnsmasq/*.leases 2>/dev/null || echo "dnsmasq leases cleanup failed (ignored)" | |
| sleep 5 | |
| echo "Cleanup complete." | |
| - name: Run in DragonFlyBSD (Attempt 2) | |
| if: steps.CheckRetry.outputs.retry == 'true' | |
| uses: vmactions/dragonflybsd-vm@v1 | |
| with: | |
| usesh: true | |
| mem: 8192 | |
| prepare: | | |
| for i in 1 2 3 4 5; do | |
| pkg install -y cmake bash gmake gdb openjdk11 gcc llvm && exit 0 | |
| echo "Install failed, retrying in 60s... ($i/5)" | |
| sleep 60 | |
| done | |
| exit 1 | |
| run: | | |
| touch UNIT_TEST_STARTED | |
| set -e -x | |
| cd build/test/unix_like | |
| chmod +x *.sh | |
| ls -l | |
| ./run_test_${{ matrix.cc }}.sh ${{ matrix.cpp_ver }} | |
| touch ../../../UNIT_TEST_SUCCESS | |
| #Unix-OpenBSD | |
| openBSD_X86_64_Clang: | |
| runs-on: ubuntu-latest | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| cpp_ver: [ 11, 14, 17, 20, 23 ] | |
| steps: | |
| - name: Checkout repository | |
| uses: actions/checkout@v4 | |
| - name: Free Disk Space (Ubuntu) | |
| uses: jlumbroso/[email protected] | |
| with: | |
| tool-cache: false | |
| android: true | |
| dotnet: true | |
| haskell: true | |
| large-packages: true | |
| docker-images: true | |
| swap-storage: true | |
| - name: Run in OpenBSD (Attempt 1) | |
| continue-on-error: true | |
| uses: vmactions/openbsd-vm@v1 | |
| with: | |
| usesh: true | |
| mem: 8192 | |
| prepare: | | |
| set -x | |
| for i in 1 2 3 4 5; do | |
| ( | |
| export PKG_PATH="http://cdn.openbsd.org/pub/OpenBSD/$(uname -r)/packages/$(arch -s)/" && \ | |
| pkg_add -v -I cmake bash gdb | |
| ) && { | |
| echo "PATH=$PATH" | |
| pkg_info | grep gdb | |
| ls -l /usr/local/bin/gdb* /usr/bin/gdb* | |
| exit 0 | |
| } | |
| echo "Install failed, retrying in 60s... ($i/5)" | |
| sleep 60 | |
| done | |
| exit 1 | |
| run: | | |
| touch UNIT_TEST_STARTED | |
| set -e -x | |
| ulimit -c unlimited || true | |
| sysctl kern.coredump=1 || true | |
| sysctl kern.corefile=core.%p 2>/dev/null || sysctl kern.corefile=core || true | |
| cd build/test/unix_like | |
| chmod +x *.sh | |
| GDB_CMD="" | |
| if [ -x "/usr/local/bin/gdb" ]; then | |
| GDB_CMD="/usr/local/bin/gdb" | |
| elif [ -x "/usr/local/bin/egdb" ]; then | |
| GDB_CMD="/usr/local/bin/egdb" | |
| elif [ -x "/usr/bin/gdb" ]; then | |
| GDB_CMD="/usr/bin/gdb" | |
| fi | |
| if [ -n "$GDB_CMD" ]; then | |
| echo "Found GDB at: $GDB_CMD" | |
| if ! $GDB_CMD --version | grep "GNU gdb"; then | |
| echo "!!! Command '$GDB_CMD' is not a valid GNU gdb. Aborting." | |
| exit 1 | |
| fi | |
| else | |
| echo "!!! GNU gdb not found. Aborting." | |
| exit 1 | |
| fi | |
| set +e | |
| ulimit -n | |
| ulimit -Hn | |
| ulimit -n 4096 | |
| ./run_test_clang.sh ${{ matrix.cpp_ver }} | |
| EXIT_CODE=$? | |
| set -e | |
| if [ $EXIT_CODE -ne 0 ]; then | |
| echo "Test failed with exit $EXIT_CODE. Searching for core..." | |
| CORE_FILE="$(find . -maxdepth 5 -type f \( -name 'core' -o -name 'core.*' -o -name '*.core' \) 2>/dev/null | head -n1)" | |
| EXE="" | |
| for cand in ./BqLogUnitTest ./CMakeFiles/BqLogUnitTest $(find . -maxdepth 5 -type f -name 'BqLogUnitTest' 2>/dev/null | head -n1); do | |
| if [ -n "$cand" ] && [ -x "$cand" ]; then EXE="$cand"; break; fi | |
| done | |
| echo "exe: ${EXE:-<not found>}" | |
| echo "core: ${CORE_FILE:-<not found>}" | |
| if [ -n "$CORE_FILE" ] && [ -n "$EXE" ]; then | |
| echo "=== GDB core backtrace ===" | |
| $GDB_CMD --batch -q \ | |
| -ex "set pagination off" \ | |
| -ex "info threads" \ | |
| -ex "thread apply all bt full" \ | |
| -ex "quit" \ | |
| "$EXE" "$CORE_FILE" || echo "gdb core analysis failed" | |
| elif [ -n "$EXE" ]; then | |
| echo "Core not found; run once under gdb for live backtrace" | |
| $GDB_CMD --batch -q \ | |
| -ex "run" \ | |
| -ex "info threads" \ | |
| -ex "thread apply all bt full" \ | |
| -ex "quit" \ | |
| "$EXE" || true | |
| fi | |
| exit $EXIT_CODE | |
| fi | |
| touch ../../../UNIT_TEST_SUCCESS | |
| - name: Check Retry | |
| id: CheckRetry | |
| run: | | |
| if [ ! -f "UNIT_TEST_STARTED" ]; then | |
| echo "retry=true" >> $GITHUB_OUTPUT | |
| elif [ ! -f "UNIT_TEST_SUCCESS" ]; then | |
| echo "::error::Test script execution failed! (Not retrying)" | |
| exit 1 | |
| fi | |
| - name: Cleanup Before Retry | |
| if: steps.CheckRetry.outputs.retry == 'true' | |
| run: | | |
| set +e | |
| DOMAINS="$(sudo virsh list --all --name 2>/dev/null | grep -v "^$" || true)" | |
| if [ -z "$DOMAINS" ]; then | |
| echo "No lingering domains found (virsh may be unavailable or no domains exist)." | |
| else | |
| echo "Found domains: $DOMAINS" | |
| for DOMAIN in $DOMAINS; do | |
| echo "Processing domain: $DOMAIN" | |
| sudo virsh destroy "$DOMAIN" 2>/dev/null || echo "virsh destroy failed for $DOMAIN (ignored)" | |
| sudo virsh undefine "$DOMAIN" --nvram 2>/dev/null \ | |
| || sudo virsh undefine "$DOMAIN" 2>/dev/null \ | |
| || echo "virsh undefine failed for $DOMAIN (ignored)" | |
| done | |
| fi | |
| echo "--- Removing potentially corrupted VM images ---" | |
| find . -name "*.qcow2" -delete 2>/dev/null || echo "local qcow2 cleanup failed (ignored)" | |
| sudo find /home/runner/work/_actions/vmactions -name "*.qcow2" -delete 2>/dev/null || echo "vmactions qcow2 cleanup failed (ignored)" | |
| sudo rm -f /var/lib/libvirt/dnsmasq/*.leases 2>/dev/null || echo "dnsmasq leases cleanup failed (ignored)" | |
| sleep 5 | |
| echo "Cleanup complete." | |
| - name: Run in OpenBSD (Attempt 2) | |
| if: steps.CheckRetry.outputs.retry == 'true' | |
| uses: vmactions/openbsd-vm@v1 | |
| with: | |
| usesh: true | |
| mem: 8192 | |
| prepare: | | |
| set -x | |
| for i in 1 2 3 4 5; do | |
| ( | |
| export PKG_PATH="http://cdn.openbsd.org/pub/OpenBSD/$(uname -r)/packages/$(arch -s)/" && \ | |
| pkg_add -v -I cmake bash gdb | |
| ) && { | |
| echo "PATH=$PATH" | |
| pkg_info | grep gdb | |
| ls -l /usr/local/bin/gdb* /usr/bin/gdb* | |
| exit 0 | |
| } | |
| echo "Install failed, retrying in 60s... ($i/5)" | |
| sleep 60 | |
| done | |
| exit 1 | |
| run: | | |
| touch UNIT_TEST_STARTED | |
| set -e -x | |
| ulimit -c unlimited || true | |
| sysctl kern.coredump=1 || true | |
| sysctl kern.corefile=core.%p 2>/dev/null || sysctl kern.corefile=core || true | |
| cd build/test/unix_like | |
| chmod +x *.sh | |
| GDB_CMD="" | |
| if [ -x "/usr/local/bin/gdb" ]; then | |
| GDB_CMD="/usr/local/bin/gdb" | |
| elif [ -x "/usr/local/bin/egdb" ]; then | |
| GDB_CMD="/usr/local/bin/egdb" | |
| elif [ -x "/usr/bin/gdb" ]; then | |
| GDB_CMD="/usr/bin/gdb" | |
| fi | |
| if [ -n "$GDB_CMD" ]; then | |
| echo "Found GDB at: $GDB_CMD" | |
| if ! $GDB_CMD --version | grep "GNU gdb"; then | |
| echo "!!! Command '$GDB_CMD' is not a valid GNU gdb. Aborting." | |
| exit 1 | |
| fi | |
| else | |
| echo "!!! GNU gdb not found. Aborting." | |
| exit 1 | |
| fi | |
| set +e | |
| ulimit -n | |
| ulimit -Hn | |
| ulimit -n 4096 | |
| ./run_test_clang.sh ${{ matrix.cpp_ver }} | |
| EXIT_CODE=$? | |
| set -e | |
| if [ $EXIT_CODE -ne 0 ]; then | |
| echo "Test failed with exit $EXIT_CODE. Searching for core..." | |
| CORE_FILE="$(find . -maxdepth 5 -type f \( -name 'core' -o -name 'core.*' -o -name '*.core' \) 2>/dev/null | head -n1)" | |
| EXE="" | |
| for cand in ./BqLogUnitTest ./CMakeFiles/BqLogUnitTest $(find . -maxdepth 5 -type f -name 'BqLogUnitTest' 2>/dev/null | head -n1); do | |
| if [ -n "$cand" ] && [ -x "$cand" ]; then EXE="$cand"; break; fi | |
| done | |
| echo "exe: ${EXE:-<not found>}" | |
| echo "core: ${CORE_FILE:-<not found>}" | |
| if [ -n "$CORE_FILE" ] && [ -n "$EXE" ]; then | |
| echo "=== GDB core backtrace ===" | |
| $GDB_CMD --batch -q \ | |
| -ex "set pagination off" \ | |
| -ex "info threads" \ | |
| -ex "thread apply all bt full" \ | |
| -ex "quit" \ | |
| "$EXE" "$CORE_FILE" || echo "gdb core analysis failed" | |
| elif [ -n "$EXE" ]; then | |
| echo "Core not found; run once under gdb for live backtrace" | |
| $GDB_CMD --batch -q \ | |
| -ex "run" \ | |
| -ex "info threads" \ | |
| -ex "thread apply all bt full" \ | |
| -ex "quit" \ | |
| "$EXE" || true | |
| fi | |
| exit $EXIT_CODE | |
| fi | |
| touch ../../../UNIT_TEST_SUCCESS | |
| openBSD_arm64_Clang: | |
| if: ${{ github.event.inputs.run_arm_tests == true || github.event.inputs.run_arm_tests == 'true'}} | |
| runs-on: ubuntu-latest | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| cpp_ver: [ 11, 14, 17, 20, 23 ] | |
| steps: | |
| - name: Checkout repository | |
| uses: actions/checkout@v4 | |
| - name: Free Disk Space (Ubuntu) | |
| uses: jlumbroso/[email protected] | |
| with: | |
| tool-cache: false | |
| android: true | |
| dotnet: true | |
| haskell: true | |
| large-packages: true | |
| docker-images: true | |
| swap-storage: true | |
| - name: Run in OpenBSD (Attempt 1) | |
| continue-on-error: true | |
| uses: vmactions/openbsd-vm@v1 | |
| with: | |
| arch: aarch64 | |
| usesh: true | |
| mem: 8192 | |
| prepare: | | |
| for i in 1 2 3 4 5; do | |
| pkg_add cmake bash && exit 0 | |
| echo "Install failed, retrying in 60s... ($i/5)" | |
| sleep 60 | |
| done | |
| exit 1 | |
| run: | | |
| touch UNIT_TEST_STARTED | |
| set -e -x | |
| cd build/test/unix_like | |
| chmod +x *.sh | |
| ls -l | |
| ulimit -n | |
| ulimit -Hn | |
| ulimit -n 4096 | |
| export BQ_LOW_PERFORMANCE_TESTS=true | |
| ./run_test_clang.sh ${{ matrix.cpp_ver }} | |
| touch ../../../UNIT_TEST_SUCCESS | |
| - name: Check Retry | |
| id: CheckRetry | |
| run: | | |
| if [ ! -f "UNIT_TEST_STARTED" ]; then | |
| echo "retry=true" >> $GITHUB_OUTPUT | |
| elif [ ! -f "UNIT_TEST_SUCCESS" ]; then | |
| echo "::error::Test script execution failed! (Not retrying)" | |
| exit 1 | |
| fi | |
| - name: Cleanup Before Retry | |
| if: steps.CheckRetry.outputs.retry == 'true' | |
| run: | | |
| set +e | |
| DOMAINS="$(sudo virsh list --all --name 2>/dev/null | grep -v "^$" || true)" | |
| if [ -z "$DOMAINS" ]; then | |
| echo "No lingering domains found (virsh may be unavailable or no domains exist)." | |
| else | |
| echo "Found domains: $DOMAINS" | |
| for DOMAIN in $DOMAINS; do | |
| echo "Processing domain: $DOMAIN" | |
| sudo virsh destroy "$DOMAIN" 2>/dev/null || echo "virsh destroy failed for $DOMAIN (ignored)" | |
| sudo virsh undefine "$DOMAIN" --nvram 2>/dev/null \ | |
| || sudo virsh undefine "$DOMAIN" 2>/dev/null \ | |
| || echo "virsh undefine failed for $DOMAIN (ignored)" | |
| done | |
| fi | |
| echo "--- Removing potentially corrupted VM images ---" | |
| find . -name "*.qcow2" -delete 2>/dev/null || echo "local qcow2 cleanup failed (ignored)" | |
| sudo find /home/runner/work/_actions/vmactions -name "*.qcow2" -delete 2>/dev/null || echo "vmactions qcow2 cleanup failed (ignored)" | |
| sudo rm -f /var/lib/libvirt/dnsmasq/*.leases 2>/dev/null || echo "dnsmasq leases cleanup failed (ignored)" | |
| sleep 5 | |
| echo "Cleanup complete." | |
| - name: Run in OpenBSD (Attempt 2) | |
| if: steps.CheckRetry.outputs.retry == 'true' | |
| uses: vmactions/openbsd-vm@v1 | |
| with: | |
| arch: aarch64 | |
| usesh: true | |
| mem: 8192 | |
| prepare: | | |
| for i in 1 2 3 4 5; do | |
| pkg_add cmake bash && exit 0 | |
| echo "Install failed, retrying in 60s... ($i/5)" | |
| sleep 60 | |
| done | |
| exit 1 | |
| run: | | |
| touch UNIT_TEST_STARTED | |
| set -e -x | |
| cd build/test/unix_like | |
| chmod +x *.sh | |
| ls -l | |
| ulimit -n | |
| ulimit -Hn | |
| ulimit -n 4096 | |
| export BQ_LOW_PERFORMANCE_TESTS=true | |
| ./run_test_clang.sh ${{ matrix.cpp_ver }} | |
| touch ../../../UNIT_TEST_SUCCESS | |
| #NetBSD | |
| netBSD_x86_64: | |
| runs-on: ubuntu-latest | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| cc: [ clang, gcc ] | |
| cpp_ver: [ 11, 14, 17, 20, 23 ] | |
| exclude: | |
| - cc: gcc | |
| cpp_ver: 23 | |
| steps: | |
| - name: Checkout repository | |
| uses: actions/checkout@v4 | |
| - name: Free Disk Space (Ubuntu) | |
| uses: jlumbroso/[email protected] | |
| with: | |
| tool-cache: false | |
| android: true | |
| dotnet: true | |
| haskell: true | |
| large-packages: true | |
| docker-images: true | |
| swap-storage: true | |
| - name: Run in NetBSD (Attempt 1) | |
| continue-on-error: true | |
| uses: vmactions/netbsd-vm@v1 | |
| with: | |
| usesh: true | |
| mem: 8192 | |
| release: "10.1" | |
| prepare: | | |
| export PATH="/usr/sbin:/usr/bin:/usr/pkg/sbin:/usr/pkg/bin:$PATH" | |
| for i in 1 2 3 4 5; do | |
| ( | |
| set -e | |
| /usr/sbin/pkg_add -v pkgin || true | |
| pkgin -y update | |
| pkgin -y install cmake gmake bash gdb | |
| pkgin -y install clang | |
| pkgin -y install gcc12 || pkgin -y install gcc13 || pkgin -y install gcc10 | |
| ) && exit 0 | |
| echo "Install failed, retrying in 60s... ($i/5)" | |
| sleep 60 | |
| done | |
| exit 1 | |
| run: | | |
| touch UNIT_TEST_STARTED | |
| set -e -x | |
| cd build/test/unix_like | |
| chmod +x *.sh | |
| ls -l | |
| ulimit -n | |
| ulimit -Hn | |
| ulimit -n 4096 | |
| ./run_test_${{ matrix.cc }}.sh ${{ matrix.cpp_ver }} | |
| touch ../../../UNIT_TEST_SUCCESS | |
| - name: Check Retry | |
| id: CheckRetry | |
| run: | | |
| if [ ! -f "UNIT_TEST_STARTED" ]; then | |
| echo "retry=true" >> $GITHUB_OUTPUT | |
| elif [ ! -f "UNIT_TEST_SUCCESS" ]; then | |
| echo "::error::Test script execution failed! (Not retrying)" | |
| exit 1 | |
| fi | |
| - name: Cleanup Before Retry | |
| if: steps.CheckRetry.outputs.retry == 'true' | |
| run: | | |
| set +e | |
| DOMAINS="$(sudo virsh list --all --name 2>/dev/null | grep -v "^$" || true)" | |
| if [ -z "$DOMAINS" ]; then | |
| echo "No lingering domains found (virsh may be unavailable or no domains exist)." | |
| else | |
| echo "Found domains: $DOMAINS" | |
| for DOMAIN in $DOMAINS; do | |
| echo "Processing domain: $DOMAIN" | |
| sudo virsh destroy "$DOMAIN" 2>/dev/null || echo "virsh destroy failed for $DOMAIN (ignored)" | |
| sudo virsh undefine "$DOMAIN" --nvram 2>/dev/null \ | |
| || sudo virsh undefine "$DOMAIN" 2>/dev/null \ | |
| || echo "virsh undefine failed for $DOMAIN (ignored)" | |
| done | |
| fi | |
| echo "--- Removing potentially corrupted VM images ---" | |
| find . -name "*.qcow2" -delete 2>/dev/null || echo "local qcow2 cleanup failed (ignored)" | |
| sudo find /home/runner/work/_actions/vmactions -name "*.qcow2" -delete 2>/dev/null || echo "vmactions qcow2 cleanup failed (ignored)" | |
| sudo rm -f /var/lib/libvirt/dnsmasq/*.leases 2>/dev/null || echo "dnsmasq leases cleanup failed (ignored)" | |
| sleep 5 | |
| echo "Cleanup complete." | |
| - name: Run in NetBSD (Attempt 2) | |
| if: steps.CheckRetry.outputs.retry == 'true' | |
| uses: vmactions/netbsd-vm@v1 | |
| with: | |
| usesh: true | |
| mem: 8192 | |
| release: "10.1" | |
| prepare: | | |
| export PATH="/usr/sbin:/usr/bin:/usr/pkg/sbin:/usr/pkg/bin:$PATH" | |
| for i in 1 2 3 4 5; do | |
| ( | |
| set -e | |
| /usr/sbin/pkg_add -v pkgin || true | |
| pkgin -y update | |
| pkgin -y install cmake gmake bash gdb | |
| pkgin -y install clang | |
| pkgin -y install gcc12 || pkgin -y install gcc13 || pkgin -y install gcc10 | |
| ) && exit 0 | |
| echo "Install failed, retrying in 60s... ($i/5)" | |
| sleep 60 | |
| done | |
| exit 1 | |
| run: | | |
| touch UNIT_TEST_STARTED | |
| set -e -x | |
| cd build/test/unix_like | |
| chmod +x *.sh | |
| ls -l | |
| ulimit -n | |
| ulimit -Hn | |
| ulimit -n 4096 | |
| ./run_test_${{ matrix.cc }}.sh ${{ matrix.cpp_ver }} | |
| touch ../../../UNIT_TEST_SUCCESS | |
| netBSD_arm64_cpp17: | |
| if: ${{ github.event.inputs.run_arm_tests == true || github.event.inputs.run_arm_tests == 'true' }} | |
| runs-on: ubuntu-latest | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| cc: [ clang, gcc ] | |
| steps: | |
| - name: Checkout repository | |
| uses: actions/checkout@v4 | |
| - name: Free Disk Space (Ubuntu) | |
| uses: jlumbroso/[email protected] | |
| with: | |
| tool-cache: false | |
| android: true | |
| dotnet: true | |
| haskell: true | |
| large-packages: true | |
| docker-images: true | |
| swap-storage: true | |
| - name: Run in NetBSD (Attempt 1) | |
| continue-on-error: true | |
| uses: vmactions/netbsd-vm@v1 | |
| with: | |
| arch: aarch64 | |
| usesh: true | |
| mem: 8192 | |
| release: "10.1" | |
| prepare: | | |
| export PATH="/usr/sbin:/usr/bin:/usr/pkg/sbin:/usr/pkg/bin:$PATH" | |
| for i in 1 2 3 4 5; do | |
| ( | |
| set -e | |
| /usr/sbin/pkg_add -v pkgin || true | |
| pkgin -y update | |
| pkgin -y install cmake gmake bash gdb | |
| pkgin -y install clang | |
| pkgin -y install gcc12 || pkgin -y install gcc13 || pkgin -y install gcc10 | |
| ) && exit 0 | |
| echo "Install failed, retrying in 60s... ($i/5)" | |
| sleep 60 | |
| done | |
| exit 1 | |
| run: | | |
| touch UNIT_TEST_STARTED | |
| set -e -x | |
| cd build/test/unix_like | |
| chmod +x *.sh | |
| ls -l | |
| ulimit -n | |
| ulimit -Hn | |
| ulimit -n 4096 | |
| export BQ_LOW_PERFORMANCE_TESTS=true | |
| ./run_test_${{ matrix.cc }}.sh 17 | |
| touch ../../../UNIT_TEST_SUCCESS | |
| - name: Check Retry | |
| id: CheckRetry | |
| run: | | |
| if [ ! -f "UNIT_TEST_STARTED" ]; then | |
| echo "retry=true" >> $GITHUB_OUTPUT | |
| elif [ ! -f "UNIT_TEST_SUCCESS" ]; then | |
| echo "::error::Test script execution failed! (Not retrying)" | |
| exit 1 | |
| fi | |
| - name: Cleanup Before Retry | |
| if: steps.CheckRetry.outputs.retry == 'true' | |
| run: | | |
| set +e | |
| DOMAINS="$(sudo virsh list --all --name 2>/dev/null | grep -v "^$" || true)" | |
| if [ -z "$DOMAINS" ]; then | |
| echo "No lingering domains found (virsh may be unavailable or no domains exist)." | |
| else | |
| echo "Found domains: $DOMAINS" | |
| for DOMAIN in $DOMAINS; do | |
| echo "Processing domain: $DOMAIN" | |
| sudo virsh destroy "$DOMAIN" 2>/dev/null || echo "virsh destroy failed for $DOMAIN (ignored)" | |
| sudo virsh undefine "$DOMAIN" --nvram 2>/dev/null \ | |
| || sudo virsh undefine "$DOMAIN" 2>/dev/null \ | |
| || echo "virsh undefine failed for $DOMAIN (ignored)" | |
| done | |
| fi | |
| echo "--- Removing potentially corrupted VM images ---" | |
| find . -name "*.qcow2" -delete 2>/dev/null || echo "local qcow2 cleanup failed (ignored)" | |
| sudo find /home/runner/work/_actions/vmactions -name "*.qcow2" -delete 2>/dev/null || echo "vmactions qcow2 cleanup failed (ignored)" | |
| sudo rm -f /var/lib/libvirt/dnsmasq/*.leases 2>/dev/null || echo "dnsmasq leases cleanup failed (ignored)" | |
| sleep 5 | |
| echo "Cleanup complete." | |
| - name: Run in NetBSD (Attempt 2) | |
| if: steps.CheckRetry.outputs.retry == 'true' | |
| uses: vmactions/netbsd-vm@v1 | |
| with: | |
| arch: aarch64 | |
| usesh: true | |
| mem: 8192 | |
| release: "10.1" | |
| prepare: | | |
| export PATH="/usr/sbin:/usr/bin:/usr/pkg/sbin:/usr/pkg/bin:$PATH" | |
| for i in 1 2 3 4 5; do | |
| ( | |
| set -e | |
| /usr/sbin/pkg_add -v pkgin || true | |
| pkgin -y update | |
| pkgin -y install cmake gmake bash gdb | |
| pkgin -y install clang | |
| pkgin -y install gcc12 || pkgin -y install gcc13 || pkgin -y install gcc10 | |
| ) && exit 0 | |
| echo "Install failed, retrying in 60s... ($i/5)" | |
| sleep 60 | |
| done | |
| exit 1 | |
| run: | | |
| touch UNIT_TEST_STARTED | |
| set -e -x | |
| cd build/test/unix_like | |
| chmod +x *.sh | |
| ls -l | |
| ulimit -n | |
| ulimit -Hn | |
| ulimit -n 4096 | |
| export BQ_LOW_PERFORMANCE_TESTS=true | |
| ./run_test_${{ matrix.cc }}.sh 17 | |
| touch ../../../UNIT_TEST_SUCCESS | |
| #Android Test | |
| android: | |
| runs-on: ubuntu-latest | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| include: | |
| - abi: x86 | |
| api-level: 21 | |
| - abi: x86_64 | |
| api-level: 33 | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - name: Free Disk Space (Ubuntu) | |
| uses: jlumbroso/[email protected] | |
| with: | |
| tool-cache: false | |
| android: false | |
| dotnet: true | |
| haskell: true | |
| large-packages: true | |
| docker-images: true | |
| swap-storage: true | |
| - name: Set up Java | |
| uses: actions/setup-java@v4 | |
| with: | |
| java-version: '17' | |
| distribution: 'adopt' | |
| - id: setup-android | |
| uses: android-actions/setup-android@v3 | |
| - name: Enable KVM | |
| run: | | |
| echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules | |
| sudo udevadm control --reload-rules | |
| sudo udevadm trigger --name-match=kvm | |
| ls -l /dev/kvm || true | |
| - id: setup-ndk | |
| uses: nttld/setup-ndk@v1 | |
| with: | |
| ndk-version: r28c | |
| local-cache: false | |
| - name: Build Debug | |
| env: | |
| ANDROID_ABI: ${{ matrix.abi }} | |
| ANDROID_PLATFORM: ${{ matrix.api-level }} | |
| ANDROID_NDK: ${{ steps.setup-ndk.outputs.ndk-path }} | |
| run: | | |
| set -e | |
| mkdir -p build/test/android/${ANDROID_ABI}/debug | |
| cd build/test/android/${ANDROID_ABI}/debug | |
| cmake ../../../../../test \ | |
| -G "Unix Makefiles" \ | |
| -DANDROID_ABI=${ANDROID_ABI} \ | |
| -DANDROID_PLATFORM=${ANDROID_PLATFORM} \ | |
| -DANDROID_NDK=${ANDROID_NDK} \ | |
| -DCMAKE_BUILD_TYPE=Debug \ | |
| -DCMAKE_TOOLCHAIN_FILE=${ANDROID_NDK}/build/cmake/android.toolchain.cmake \ | |
| -DTARGET_PLATFORM:STRING=android | |
| cmake --build . -- -j10 | |
| - name: Build RelWithDebInfo | |
| env: | |
| ANDROID_ABI: ${{ matrix.abi }} | |
| ANDROID_PLATFORM: ${{ matrix.api-level }} | |
| ANDROID_NDK: ${{ steps.setup-ndk.outputs.ndk-path }} | |
| run: | | |
| set -e | |
| mkdir -p build/test/android/${ANDROID_ABI}/relwithdebinfo | |
| cd build/test/android/${ANDROID_ABI}/relwithdebinfo | |
| cmake ../../../../../test \ | |
| -G "Unix Makefiles" \ | |
| -DANDROID_ABI=${ANDROID_ABI} \ | |
| -DANDROID_PLATFORM=${ANDROID_PLATFORM} \ | |
| -DANDROID_NDK=${ANDROID_NDK} \ | |
| -DCMAKE_BUILD_TYPE=RelWithDebInfo \ | |
| -DCMAKE_TOOLCHAIN_FILE=${ANDROID_NDK}/build/cmake/android.toolchain.cmake \ | |
| -DTARGET_PLATFORM:STRING=android | |
| cmake --build . -- -j10 | |
| - name: Locate artifacts | |
| id: locate | |
| env: | |
| ABI: ${{ matrix.abi }} | |
| run: | | |
| set -e | |
| DBG="build/test/android/${ABI}/debug/BqLogUnitTest" | |
| REL="build/test/android/${ABI}/relwithdebinfo/BqLogUnitTest" | |
| [ -f "$DBG" ] || DBG="$(find build/test/android/${ABI}/debug -type f -name BqLogUnitTest | head -n1)" | |
| [ -f "$REL" ] || REL="$(find build/test/android/${ABI}/relwithdebinfo -type f -name BqLogUnitTest | head -n1)" | |
| echo "dbg=$DBG" >> $GITHUB_OUTPUT | |
| echo "rel=$REL" >> $GITHUB_OUTPUT | |
| - name: Create AVD snapshot (if missing) | |
| uses: reactivecircus/android-emulator-runner@v2 | |
| with: | |
| api-level: ${{ matrix.api-level }} | |
| arch: ${{ matrix.abi }} | |
| disk-size: 6G | |
| force-avd-creation: true | |
| emulator-options: -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none | |
| disable-animations: false | |
| cores: 4 | |
| script: echo "AVD snapshot created." | |
| - name: Run tests | |
| uses: reactivecircus/android-emulator-runner@v2 | |
| with: | |
| api-level: ${{ matrix.api-level }} | |
| arch: ${{ matrix.abi }} | |
| force-avd-creation: false | |
| emulator-options: -no-snapshot-save -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none | |
| disable-animations: true | |
| cores: 4 | |
| script: | | |
| set -e | |
| adb devices | |
| adb push "${{ steps.locate.outputs.dbg }}" /data/local/tmp/BqLogUnitTest_dbg | |
| adb shell "cd /data/local/tmp && chmod 755 ./BqLogUnitTest_dbg && TMPDIR=/data/local/tmp ./BqLogUnitTest_dbg" | |
| adb push "${{ steps.locate.outputs.rel }}" /data/local/tmp/BqLogUnitTest_rel | |
| adb shell "cd /data/local/tmp && chmod 755 ./BqLogUnitTest_rel && TMPDIR=/data/local/tmp ./BqLogUnitTest_rel" |