Skip to content

Record the landed SHAs for the last two Vulkan shadow stages #367

Record the landed SHAs for the last two Vulkan shadow stages

Record the landed SHAs for the last two Vulkan shadow stages #367

name: Push Verification
on:
push:
workflow_dispatch:
permissions:
contents: read
env:
# Keep the engine's shared File/FileSystem ABI locked to the companion
# revision that implements GAME_API 46, generated-animation cache v3, and
# the game-owned transient time-scale interface.
OPENQ4_GAMELIBS_SHA: 67fcd3e2142bc07c4871873ea1ec6fe592ac8a5a
concurrency:
group: openq4-push-verification-${{ github.ref }}
cancel-in-progress: true
jobs:
script-smoke:
name: Validation Script Smoke
runs-on: ubuntu-24.04
env:
OPENQ4_GAMELIBS_REPO: ${{ github.workspace }}/../openQ4-game
steps:
- name: Checkout
uses: actions/checkout@v6
- name: Fetch openQ4-game
shell: bash
run: |
set -euo pipefail
git init "${OPENQ4_GAMELIBS_REPO}"
git -C "${OPENQ4_GAMELIBS_REPO}" remote add origin https://github.com/themuffinator/openQ4-game.git
git -C "${OPENQ4_GAMELIBS_REPO}" fetch --depth 1 origin "${OPENQ4_GAMELIBS_SHA}"
git -C "${OPENQ4_GAMELIBS_REPO}" checkout --detach "${OPENQ4_GAMELIBS_SHA}"
test "$(git -C "${OPENQ4_GAMELIBS_REPO}" rev-parse HEAD)" = "${OPENQ4_GAMELIBS_SHA}"
- name: Setup Python
uses: actions/setup-python@v6
with:
python-version: "3.x"
- name: Install release documentation dependency
run: python -m pip install markdown
- name: Check validation script syntax
shell: bash
run: |
set -euo pipefail
python -m py_compile \
tools/build/build_openq4_pack.py \
tools/build/build_pak0.py \
tools/build/build_windows_installer.py \
tools/build/check_staged_content_edits.py \
tools/build/generate_pak_header.py \
tools/build/generate_release_changelog.py \
tools/build/generate_release_docs.py \
tools/build/linux_metadata.py \
tools/build/list_pak_sources.py \
tools/build/openq4_pak.py \
tools/build/openq4_release_version.py \
tools/build/openq4_version.py \
tools/build/assemble_macos_universal2.py \
tools/build/package_nightly.py \
tools/build/package_release.py \
tools/build/verify_linux_arm64_release_evidence.py \
tools/build/stage_fast_install.py \
tools/build/stage_gamelibs.py \
tools/build/stage_windows_runtime.py \
tools/build/sync_icons.py \
tools/build/windows_runtime.py \
tools/build/write_pak_manifest.py \
src/sys/linux/pk4/id_utils.py \
tools/analysis/clang_tidy_input_safety.py \
tools/assets/pack_pbr_orm.py \
tools/validation/audit_source_provenance.py \
tools/validation/generate_pbr_fixture.py \
tools/validation/openq4_validate.py \
tools/validation/stock_asset_baseline.py \
tools/tests/renderer_validation_matrix.py \
tools/tests/aas_settings_contract.py \
tools/tests/arena_campaign.py \
tools/tests/async_drop_client_contract.py \
tools/tests/base64_input_safety.py \
tools/tests/campaign_split_state_transition.py \
tools/tests/clang_tidy_input_safety.py \
tools/tests/cmdargs_append_contract.py \
tools/tests/competitive_match_layer.py \
tools/tests/competitive_match_localization.py \
tools/tests/decl_checksum_stability_contract.py \
tools/tests/match_control_localization_bridge.py \
tools/tests/match_control_ui_contract.py \
tools/tests/demo_playback.py \
tools/tests/docs_link_integrity.py \
tools/tests/dmap_render_geometry_lifecycle.py \
tools/tests/fatal_error_startup_safety.py \
tools/tests/filesystem_case_segments.py \
tools/tests/filesystem_mod_manifest.py \
tools/tests/filesystem_write_qpath_safety.py \
tools/tests/game_class_allocator_alignment.py \
tools/tests/game_type_module_selection.py \
tools/tests/gamelibs_staging.py \
tools/tests/generated_animation_cache.py \
tools/tests/level_load_cache.py \
tools/tests/hdr_postprocess_math.py \
tools/tests/idstr_input_safety.py \
tools/tests/lexer_input_safety.py \
tools/tests/lexer_peek_contract.py \
tools/tests/key_bind_presentation.py \
tools/tests/levelshot_inventory.py \
tools/tests/linux_arm64_cross_compile.py \
tools/tests/linux_arm64_ci_coverage.py \
tools/tests/linux_arm64_release_evidence.py \
tools/tests/linux_arm64_source_portability.py \
tools/tests/linux_dedicated_server_smoke.py \
tools/tests/linux_dedicated_server_smoke_contract.py \
tools/tests/linux_dedicated_stock_map_smoke.py \
tools/tests/linux_dedicated_stock_map_smoke_contract.py \
tools/tests/linux_physical_host_evidence.py \
tools/tests/linux_physical_host_evidence_contract.py \
tools/tests/linux_wayland_stock_sp_smoke.py \
tools/tests/linux_wayland_stock_sp_smoke_contract.py \
tools/tests/linux_gui_presentation_defaults.py \
tools/tests/linux_highdpi_mouse.py \
tools/tests/linux_appimage_packaging.py \
tools/tests/lang_table_encoding.py \
tools/tests/source_charset_integrity.py \
tools/tests/linux_metadata_fuzz.py \
tools/tests/linux_packaging_guidance.py \
tools/tests/linux_sanitizer_ci.py \
tools/tests/linux_sdl3_glew_loader.py \
tools/tests/linux_vsync_support.py \
tools/tests/linux_wayland_build_contract.py \
tools/tests/loading_continue_input.py \
tools/tests/loading_pacifier_pacing.py \
tools/tests/map_entity_strings.py \
tools/tests/weapon_wheel_time_scale.py \
tools/tests/weapon_zoom_view_alignment.py \
tools/tests/macos_apple_gl21_arb2_corridor.py \
tools/tests/macos_dedicated_server_smoke.py \
tools/tests/macos_dedicated_server_smoke_contract.py \
tools/tests/macos_evidence_plumbing.py \
tools/tests/macos_evidence_recording.py \
tools/tests/macos_gamelibs_alignment.py \
tools/tests/macos_intel_ci.py \
tools/tests/macos_local_validation_track.py \
tools/tests/macos_matrix_policy.py \
tools/tests/macos_native_backend_guard.py \
tools/tests/macos_native_backend_containment.py \
tools/tests/macos_openal_provider_policy.py \
tools/tests/macos_package_policy.py \
tools/tests/macos_package_robustness.py \
tools/tests/macos_renderer_backend_policy.py \
tools/tests/macos_renderer_phase_breadcrumbs.py \
tools/tests/macos_renderer_startup_guard.py \
tools/tests/macos_sanitizer_ci.py \
tools/tests/macos_sdl3_backend_guard.py \
tools/tests/macos_shadow_policy.py \
tools/tests/macos_signoff_archive.py \
tools/tests/macos_static_policy.py \
tools/tests/macos_support_claim_policy.py \
tools/tests/macos_support_intake.py \
tools/tests/macos_symbolication_policy.py \
tools/tests/macos_universal2_assembly.py \
tools/tests/macos_universal2_runtime.py \
tools/tests/macos_universal2_release_candidate.py \
tools/tests/macos_metal_bridge.py \
tools/tests/macos_moltenvk_policy.py \
tools/tests/mp_bot_characters.py \
tools/tests/mp_bot_intelligence.py \
tools/tests/mp_bot_navigation.py \
tools/tests/mp_bot_server_menu.py \
tools/tests/mp_client_combat_effects.py \
tools/tests/mp_weapon_switch_contract.py \
tools/tests/multiview_demo.py \
tools/tests/mvd_server_api_contract.py \
tools/tests/native_glx_shutdown.py \
tools/tests/network_ipv4_support.py \
tools/tests/network_ipv6_support.py \
tools/tests/network_security.py \
tools/tests/openurl_security.py \
tools/tests/openq4_pure_pack.py \
tools/tests/p0_governance_evidence.py \
tools/tests/packaging_safety.py \
tools/tests/parallel_job_system.py \
tools/tests/pbr_orm_packer.py \
tools/tests/pbr_procedural_fixture.py \
tools/tests/preprocessor_macro_safety.py \
tools/tests/posix_memory_management.py \
tools/tests/posix_monotonic_time.py \
tools/tests/posix_network_resolution.py \
tools/tests/posix_thread_shutdown.py \
tools/tests/release_tooling_safety.py \
tools/tests/renderer_advanced_lighting.py \
tools/tests/renderer_budget_contract.py \
tools/tests/renderer_cel_shading.py \
tools/tests/renderer_demo_projection_safety.py \
tools/tests/renderer_gpu_frame_timing.py \
tools/tests/renderer_gpu_skinning.py \
tools/tests/renderer_temporal_presentation.py \
tools/tests/renderer_mp_flat_items.py \
tools/tests/renderer_pbr_materials.py \
tools/tests/renderer_classic_gui_domain.py \
tools/tests/renderer_classic_cinematic_post_domain.py \
tools/tests/renderer_milestone_d_acceptance.py \
tools/tests/renderer_milestone_d_fixture.py \
tools/tests/renderer_classic_special_frame_domain.py \
tools/tests/renderer_classic_world_ambient_domain.py \
tools/tests/renderer_classic_interaction_domain.py \
tools/tests/renderer_classic_fog_blend_domain.py \
tools/tests/renderer_classic_subview_domain.py \
tools/tests/renderer_classic_deform_domain.py \
tools/tests/renderer_msaa_cvar_safety.py \
tools/tests/renderer_picmip_policy.py \
tools/tests/renderer_texture_filter.py \
tools/tests/renderer_player_visibility.py \
tools/tests/renderer_screenshot_readback.py \
tools/tests/renderer_supersampling_safety.py \
tools/tests/renderer_vulkan_decal_compatibility.py \
tools/tests/renderer_vulkan_gui_residency.py \
tools/tests/renderer_vulkan_md5r_compatibility.py \
tools/tests/renderer_vulkan_shadow_compatibility.py \
tools/tests/renderer_vulkan_world_interaction_compatibility.py \
tools/tests/rigid_body_recovery_diagnostics.py \
tools/tests/savegame_corruption_contract.py \
tools/tests/savegame_pointer_width_safety.py \
tools/tests/savegame_v3_contract.py \
tools/tests/sdl3_input_parity.py \
tools/tests/sdl3_multidisplay_windowing.py \
tools/tests/settings_menu_coverage.py \
tools/tests/steam_deck_support.py \
tools/tests/system_console_presentation.py \
tools/tests/startup_language_override.py \
tools/tests/stock_asset_baseline.py \
tools/tests/stock_media_fallbacks.py \
tools/tests/ui_embedded_icons.py \
tools/tests/ui_cursor_state_safety.py \
tools/tests/ui_window_state_safety.py \
tools/tests/validation_hardening.py \
tools/tests/vk_shader_header_pin.py \
tools/tests/vk_temporal_resolve_shader_pin.py \
tools/tests/vscode_fast_build.py
bash -n tools/build/meson_setup.sh
bash -n tools/macos/collect_macos_support_info.sh
bash -n tools/validation/validate_macos_static.sh
bash -n tools/validation/validate_push.sh
bash -n tools/validation/validate_pr.sh
python tools/validation/audit_source_provenance.py --check
python tools/tests/aas_settings_contract.py
python tools/tests/arena_campaign.py
python tools/tests/async_drop_client_contract.py
python tools/tests/base64_input_safety.py
python tools/tests/campaign_split_state_transition.py
python tools/tests/clang_tidy_input_safety.py
python tools/tests/cmdargs_append_contract.py
python tools/tests/competitive_match_layer.py
python tools/tests/competitive_match_localization.py
python tools/tests/decl_checksum_stability_contract.py
python tools/tests/match_control_localization_bridge.py
python tools/tests/match_control_ui_contract.py
python tools/tests/demo_playback.py
python tools/tests/docs_link_integrity.py
python tools/tests/dmap_render_geometry_lifecycle.py
python tools/tests/fatal_error_startup_safety.py
python tools/tests/filesystem_case_segments.py
python tools/tests/filesystem_mod_manifest.py
python tools/tests/filesystem_write_qpath_safety.py
python tools/tests/game_class_allocator_alignment.py
python tools/tests/game_type_module_selection.py
python tools/tests/gamelibs_staging.py
python tools/tests/generated_animation_cache.py
python tools/tests/level_load_cache.py
python tools/tests/hdr_postprocess_math.py
python tools/tests/idstr_input_safety.py
python tools/tests/lexer_input_safety.py
python tools/tests/lexer_peek_contract.py
python tools/tests/key_bind_presentation.py
python tools/tests/levelshot_inventory.py
python tools/tests/linux_arm64_cross_compile.py
python tools/tests/linux_arm64_ci_coverage.py
python tools/tests/linux_arm64_release_evidence.py
python tools/tests/linux_arm64_source_portability.py
python tools/tests/linux_dedicated_server_smoke_contract.py
python tools/tests/linux_dedicated_stock_map_smoke_contract.py
python tools/tests/linux_physical_host_evidence_contract.py
python tools/tests/linux_wayland_stock_sp_smoke_contract.py
python tools/tests/linux_gui_presentation_defaults.py
python tools/tests/linux_highdpi_mouse.py
python tools/tests/linux_appimage_packaging.py
python tools/tests/lang_table_encoding.py
python tools/tests/source_charset_integrity.py
python tools/tests/linux_metadata_fuzz.py
python tools/tests/linux_packaging_guidance.py
python tools/tests/linux_pk4_legacy_tools.py
python tools/tests/linux_sanitizer_ci.py
python tools/tests/linux_sdl3_glew_loader.py
python tools/tests/linux_vsync_support.py
python tools/tests/linux_wayland_build_contract.py
python tools/tests/loading_continue_input.py
python tools/tests/loading_pacifier_pacing.py
python tools/tests/map_entity_strings.py
python tools/tests/weapon_wheel_time_scale.py
python tools/tests/weapon_zoom_view_alignment.py
python tools/tests/macos_apple_gl21_arb2_corridor.py
python tools/tests/macos_dedicated_server_smoke_contract.py
python tools/tests/macos_evidence_plumbing.py
python tools/tests/macos_evidence_recording.py
python tools/tests/macos_gamelibs_alignment.py
python tools/tests/macos_intel_ci.py
python tools/tests/macos_local_validation_track.py
python tools/tests/macos_matrix_policy.py
python tools/tests/macos_native_backend_guard.py
python tools/tests/macos_native_backend_containment.py
python tools/tests/macos_openal_provider_policy.py
python tools/tests/macos_package_policy.py
python tools/tests/macos_package_robustness.py
python tools/tests/macos_renderer_backend_policy.py
python tools/tests/macos_renderer_phase_breadcrumbs.py
python tools/tests/macos_renderer_startup_guard.py
python tools/tests/macos_sanitizer_ci.py
python tools/tests/macos_sdl3_backend_guard.py
python tools/tests/macos_shadow_policy.py
python tools/tests/macos_signoff_archive.py
python tools/tests/macos_static_policy.py
python tools/tests/macos_support_claim_policy.py
python tools/tests/macos_support_intake.py
python tools/tests/macos_symbolication_policy.py
python tools/tests/macos_universal2_assembly.py
python tools/tests/macos_universal2_runtime.py
python tools/tests/macos_universal2_release_candidate.py
python tools/tests/macos_metal_bridge.py
python tools/tests/macos_moltenvk_policy.py
python tools/tests/mp_bot_characters.py
python tools/tests/mp_bot_intelligence.py
python tools/tests/mp_bot_navigation.py
python tools/tests/mp_bot_server_menu.py
python tools/tests/mp_client_combat_effects.py
python tools/tests/mp_weapon_switch_contract.py
python tools/tests/multiview_demo.py
python tools/tests/mvd_server_api_contract.py
python tools/tests/native_glx_shutdown.py
python tools/tests/network_ipv4_support.py
python tools/tests/network_ipv6_support.py
python tools/tests/network_security.py
python tools/tests/openurl_security.py
python tools/tests/openq4_pure_pack.py
python tools/tests/p0_governance_evidence.py
python tools/tests/packaging_safety.py
python tools/tests/parallel_job_system.py
python tools/tests/pbr_orm_packer.py
python tools/tests/pbr_procedural_fixture.py
python tools/tests/preprocessor_macro_safety.py
python tools/tests/release_tooling_safety.py
python tools/tests/posix_memory_management.py
python tools/tests/posix_monotonic_time.py
python tools/tests/posix_network_resolution.py
python tools/tests/posix_thread_shutdown.py
python tools/tests/renderer_advanced_lighting.py
python tools/tests/renderer_budget_contract.py
python tools/tests/renderer_cel_shading.py
python tools/tests/renderer_demo_projection_safety.py
python tools/tests/renderer_gpu_frame_timing.py
python tools/tests/renderer_gpu_skinning.py
python tools/tests/renderer_temporal_presentation.py
python tools/tests/renderer_mp_flat_items.py
python tools/tests/renderer_pbr_materials.py
python tools/tests/renderer_classic_gui_domain.py
python tools/tests/renderer_classic_cinematic_post_domain.py
python tools/tests/renderer_classic_special_frame_domain.py
python tools/tests/renderer_classic_world_ambient_domain.py
python tools/tests/renderer_classic_interaction_domain.py
python tools/tests/renderer_classic_fog_blend_domain.py
python tools/tests/renderer_classic_subview_domain.py
python tools/tests/renderer_classic_deform_domain.py
python tools/tests/renderer_msaa_cvar_safety.py
python tools/tests/renderer_picmip_policy.py
python tools/tests/renderer_texture_filter.py
python tools/tests/renderer_player_visibility.py
python tools/tests/renderer_screenshot_readback.py
python tools/tests/renderer_supersampling_safety.py
python tools/tests/renderer_vulkan_decal_compatibility.py
python tools/tests/renderer_vulkan_gui_residency.py
python tools/tests/renderer_vulkan_md5r_compatibility.py
python tools/tests/renderer_vulkan_shadow_compatibility.py
python tools/tests/renderer_vulkan_world_interaction_compatibility.py
python tools/tests/rigid_body_recovery_diagnostics.py
python tools/tests/savegame_corruption_contract.py
python tools/tests/savegame_pointer_width_safety.py
python tools/tests/savegame_v3_contract.py
python tools/tests/sdl3_input_parity.py
python tools/tests/sdl3_multidisplay_windowing.py
python tools/tests/settings_menu_coverage.py
python tools/tests/steam_deck_support.py
python tools/tests/system_console_presentation.py
python tools/tests/startup_language_override.py
python tools/tests/stock_asset_baseline.py
python tools/tests/stock_media_fallbacks.py
python tools/tests/ui_embedded_icons.py
python tools/tests/ui_cursor_state_safety.py
python tools/tests/ui_window_state_safety.py
python tools/tests/validation_hardening.py
python tools/tests/vk_shader_header_pin.py
python tools/tests/vk_temporal_resolve_shader_pin.py
python tools/tests/vscode_fast_build.py
- name: Dry-run push profile
shell: bash
run: |
set -euo pipefail
bash tools/validation/validate_push.sh --dry-run
posix-builds:
name: ${{ matrix.name }}
needs: script-smoke
runs-on: ${{ matrix.os }}
timeout-minutes: 90
env:
OPENQ4_GAMELIBS_REPO: ${{ github.workspace }}/../openQ4-game
strategy:
fail-fast: false
matrix:
include:
- name: Linux Push Verification
os: ubuntu-24.04
artifact_name: linux-x64
runtime_smoke: false
macos_graphics_bridge: ""
macos_openal_provider: ""
- name: Linux ARM64 Push Verification
os: ubuntu-24.04-arm
artifact_name: linux-arm64
runtime_smoke: true
macos_graphics_bridge: ""
macos_openal_provider: ""
- name: macOS OpenGL Push Verification
os: macos-15
artifact_name: macos-opengl
runtime_smoke: true
macos_graphics_bridge: opengl
macos_openal_provider: system
- name: macOS Metal Push Verification
os: macos-15
artifact_name: macos-metal
runtime_smoke: true
macos_graphics_bridge: metal
macos_openal_provider: system
- name: macOS Intel x64 OpenGL Push Verification
os: macos-15-intel
artifact_name: macos-x64-opengl
runtime_smoke: true
macos_graphics_bridge: opengl
macos_openal_provider: system
- name: macOS Intel x64 Metal Push Verification
os: macos-15-intel
artifact_name: macos-x64-metal
runtime_smoke: true
macos_graphics_bridge: metal
macos_openal_provider: system
steps:
- name: Checkout
uses: actions/checkout@v6
- name: Fetch openQ4-game
shell: bash
run: |
set -euo pipefail
git init "${OPENQ4_GAMELIBS_REPO}"
git -C "${OPENQ4_GAMELIBS_REPO}" remote add origin https://github.com/themuffinator/openQ4-game.git
git -C "${OPENQ4_GAMELIBS_REPO}" fetch --depth 1 origin "${OPENQ4_GAMELIBS_SHA}"
git -C "${OPENQ4_GAMELIBS_REPO}" checkout --detach "${OPENQ4_GAMELIBS_SHA}"
test "$(git -C "${OPENQ4_GAMELIBS_REPO}" rev-parse HEAD)" = "${OPENQ4_GAMELIBS_SHA}"
- name: Setup Python
uses: actions/setup-python@v6
with:
python-version: "3.x"
- name: Install Meson and Ninja
shell: bash
run: |
set -euo pipefail
python -m pip install --upgrade pip
python -m pip install meson ninja
- name: Prepare pinned OpenAL Soft (macOS)
if: startsWith(matrix.os, 'macos-')
shell: bash
run: |
set -euo pipefail
architecture=arm64
if [[ "${{ matrix.os }}" == "macos-15-intel" ]]; then
architecture=x64
fi
prepared_root="${GITHUB_WORKSPACE}/.tmp/openal-soft-macos-${architecture}"
bash tools/build/prepare_macos_openal_soft.sh \
--architecture "${architecture}" \
--deployment-target 11.0 \
--output-root "${prepared_root}" \
--stage-install-dir .install
echo "PKG_CONFIG_PATH=${prepared_root}/lib/pkgconfig" >> "${GITHUB_ENV}"
- name: Install Linux native dependencies
if: startsWith(matrix.os, 'ubuntu-')
shell: bash
run: |
set -euo pipefail
for attempt in 1 2 3; do
if sudo apt-get update && sudo apt-get install -y \
binutils \
libasound2-dev \
libdbus-1-dev \
libdecor-0-dev \
libdrm-dev \
libegl1-mesa-dev \
libfribidi-dev \
libgbm-dev \
libgl1-mesa-dri \
libgl1-mesa-dev \
libglx-mesa0 \
libibus-1.0-dev \
libjack-dev \
libopenal-dev \
libpipewire-0.3-dev \
libpulse-dev \
libsndio-dev \
libthai-dev \
libudev-dev \
libwayland-dev \
libx11-dev \
libxcursor-dev \
libxext-dev \
libxfixes-dev \
libxi-dev \
libxkbcommon-dev \
libxrandr-dev \
libxss-dev \
libxtst-dev \
libxxf86dga-dev \
libxxf86vm-dev \
xvfb; then
exit 0
fi
if [ "${attempt}" -eq 3 ]; then
echo "Failed to install Linux native dependencies after ${attempt} attempts."
exit 1
fi
echo "Linux dependency installation attempt ${attempt} failed; retrying in 10 seconds..."
sleep 10
done
- name: Run push verification
shell: bash
run: |
set -euo pipefail
validation_args=(--install --fail-on-dirty)
if [[ -n "${{ matrix.macos_graphics_bridge }}" ]]; then
validation_args+=(
--platform-backend=sdl3
--extra-setup-arg=-Dmacos_graphics_bridge=${{ matrix.macos_graphics_bridge }}
--extra-setup-arg=-Dmacos_openal_provider=${{ matrix.macos_openal_provider }}
)
fi
if [[ "${{ matrix.runtime_smoke }}" == "true" ]]; then
runtime_cases="renderer-foundation-selftests,renderer-pbr-visible-selftest,renderer-cluster-grid-selftest,renderer-default-safety-selftest"
if [[ "${{ matrix.os }}" == ubuntu-* ]]; then
runtime_cases="${runtime_cases},renderer-shadow-planner-selftest,renderer-shadow-projected-diagnostic,sdl3-x11-display-diagnostics"
fi
validation_args+=(
--runtime
--runtime-cases "${runtime_cases}"
--runtime-tiers auto
--runtime-basepath ""
--runtime-skip-official-pak-validation
)
if [[ "${{ matrix.os }}" == ubuntu-* ]]; then
env LIBGL_ALWAYS_SOFTWARE=1 SDL_VIDEO_DRIVER=x11 SDL_VIDEODRIVER=x11 xvfb-run -a bash tools/validation/validate_push.sh "${validation_args[@]}"
env LIBGL_ALWAYS_SOFTWARE=1 OPENQ4_FORCE_X11=1 xvfb-run -a python tools/tests/renderer_validation_matrix.py \
--cases sdl3-force-x11-display-diagnostics \
--tiers auto \
--basepath "" \
--skip-official-pak-validation \
--output-dir .tmp/renderer-validation/force-x11
else
bash tools/validation/validate_push.sh "${validation_args[@]}"
fi
else
bash tools/validation/validate_push.sh "${validation_args[@]}"
fi
- name: Run Linux dedicated server smoke
if: startsWith(matrix.os, 'ubuntu-')
shell: bash
run: |
set -euo pipefail
python tools/tests/linux_dedicated_server_smoke.py \
--output-root .tmp/linux-dedicated-smoke/${{ matrix.artifact_name }}
- name: Publish Linux dedicated server smoke
if: always() && startsWith(matrix.os, 'ubuntu-')
uses: actions/upload-artifact@v6
with:
name: push-${{ matrix.artifact_name }}-dedicated-smoke
path: .tmp/linux-dedicated-smoke/${{ matrix.artifact_name }}
if-no-files-found: warn
retention-days: 14
include-hidden-files: true
- name: Run macOS dedicated server smoke
if: startsWith(matrix.os, 'macos-')
shell: bash
run: |
set -euo pipefail
python tools/tests/macos_dedicated_server_smoke.py \
--output-root .tmp/macos-dedicated-smoke/${{ matrix.artifact_name }}
- name: Publish macOS dedicated server smoke
if: always() && startsWith(matrix.os, 'macos-')
uses: actions/upload-artifact@v6
with:
name: push-${{ matrix.artifact_name }}-dedicated-smoke
path: .tmp/macos-dedicated-smoke/${{ matrix.artifact_name }}
if-no-files-found: warn
retention-days: 14
include-hidden-files: true
- name: Publish staged payload
if: always()
uses: actions/upload-artifact@v6
with:
name: push-${{ matrix.artifact_name }}-payload
path: .install
if-no-files-found: warn
retention-days: 14
include-hidden-files: true
- name: Publish renderer validation reports
if: always() && matrix.runtime_smoke == true
uses: actions/upload-artifact@v6
with:
name: push-${{ matrix.artifact_name }}-renderer-validation
path: .tmp/renderer-validation
if-no-files-found: warn
retention-days: 14
include-hidden-files: true
windows-build:
name: Windows Push Verification
needs: script-smoke
runs-on: windows-2025-vs2026
timeout-minutes: 90
env:
OPENQ4_GAMELIBS_REPO: ${{ github.workspace }}/../openQ4-game
steps:
- name: Checkout
uses: actions/checkout@v6
- name: Fetch openQ4-game
shell: pwsh
run: |
$ErrorActionPreference = "Stop"
git init "$env:OPENQ4_GAMELIBS_REPO"
git -C "$env:OPENQ4_GAMELIBS_REPO" remote add origin https://github.com/themuffinator/openQ4-game.git
git -C "$env:OPENQ4_GAMELIBS_REPO" fetch --depth 1 origin "$env:OPENQ4_GAMELIBS_SHA"
git -C "$env:OPENQ4_GAMELIBS_REPO" checkout --detach "$env:OPENQ4_GAMELIBS_SHA"
if ( ( git -C "$env:OPENQ4_GAMELIBS_REPO" rev-parse HEAD ).Trim() -ne $env:OPENQ4_GAMELIBS_SHA ) {
throw "openQ4-game checkout did not resolve to $env:OPENQ4_GAMELIBS_SHA"
}
- name: Setup Python
uses: actions/setup-python@v6
with:
python-version: "3.x"
- name: Install Meson and Ninja
shell: pwsh
run: |
$ErrorActionPreference = "Stop"
python -m pip install --upgrade pip
python -m pip install meson ninja
- name: Prepare OpenAL Soft (Windows)
shell: pwsh
run: |
$ErrorActionPreference = "Stop"
$outputRoot = Join-Path $env:GITHUB_WORKSPACE ".tmp/openal-soft-x64"
$env:OPENQ4_VS_TARGET_ARCH = "x64"
powershell -ExecutionPolicy Bypass -File tools/build/prepare_windows_openal.ps1 -Architecture "x64" -OutputRoot $outputRoot
"OPENQ4_OPENAL_ROOT=$outputRoot" >> $env:GITHUB_ENV
- name: Run push verification
shell: pwsh
run: |
$ErrorActionPreference = "Stop"
powershell -NoProfile -ExecutionPolicy Bypass -File tools/validation/validate_push.ps1 --install --fail-on-dirty
- name: Run focused input-safety static analysis
shell: pwsh
run: |
$ErrorActionPreference = "Stop"
python tools/analysis/clang_tidy_input_safety.py --build-dir builddir
- name: Publish staged payload
if: always()
uses: actions/upload-artifact@v6
with:
name: push-windows-payload
path: .install
if-no-files-found: warn
retention-days: 14
include-hidden-files: true