Record the landed SHAs for the last two Vulkan shadow stages #367
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: 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 |