# Copyright Advanced Micro Devices, Inc. # SPDX-License-Identifier: MIT # Multi-Arch Build - Sharded Pipeline for Linux # # This workflow builds TheRock in stages: # 1. compiler-runtime (generic) - sysdeps, base, compiler, runtimes, profiler-core # 2. runtime-tests (generic) - hip-tests, rocrtst (parallel to math-libs) # 3. wsl-rocdxg (generic) - WSL-only ROCDXG bridge library (after compiler-runtime) # 4. math-libs (per-arch) - BLAS, FFT, etc. # 5. comm-libs (per-arch) - RCCL, rocshmem (parallel to math-libs) # 6. storage-libs (generic) - hipfile (parallel to math-libs) # 7. debug-tools (generic) - amd-dbgapi, rocr-debug-agent, rocgdb (parallel to math-libs) # 8. dctools-core (generic) - RDC (parallel to math-libs) # 9. profiler-apps (generic) - rocprofiler-systems (parallel to math-libs) # 10. media-libs (generic) - sysdeps-amd-mesa, rocdecode, rocjpeg name: Multi-Arch Build (Linux) on: workflow_call: inputs: artifact_group: type: string matrix_per_family_json: type: string description: "JSON array of {amdgpu_family, test-runs-on} objects for per-arch stages" dist_amdgpu_families: type: string description: "Semicolon-separated list of all GPU families for dist targets" build_variant_label: type: string build_variant_cmake_preset: type: string build_variant_suffix: type: string rocm_package_version: type: string prebuilt_stages: type: string default: "" description: "Comma-separated build stages to skip (artifacts already copied by the orchestrator)" build_runs_on: type: string default: "aws-linux-scale-rocm-prod-rc" description: "Build runner label (selected by configure script with weighted distribution)" release_type: description: 'Release type: "ci", "dev", "nightly", or "prerelease"' type: string default: ci repository: description: "Repository to checkout. Defaults to github.repository." type: string default: "" ref: description: "Branch, tag, or SHA to checkout. Defaults to the triggering ref." type: string default: "" external_repo_config: description: "JSON config for external repo checkout (repository, ref, checkout_path, source_package, fetch_sources_args)" type: string default: "" permissions: contents: read jobs: # ========================================================================== # STAGE: compiler-runtime (generic) # ========================================================================== compiler-runtime: if: ${{ !cancelled() && !failure() && !contains(inputs.prebuilt_stages, 'compiler-runtime') }} uses: ./.github/workflows/multi_arch_build_portable_linux_artifacts.yml secrets: inherit with: stage_name: compiler-runtime stage_display_name: "Stage - Compiler Runtime" timeout_minutes: 480 # 8 hours (compiler is big) dist_amdgpu_families: ${{ inputs.dist_amdgpu_families }} rocm_package_version: ${{ inputs.rocm_package_version }} build_variant_cmake_preset: ${{ inputs.build_variant_cmake_preset }} build_runs_on: ${{ inputs.build_runs_on }} release_type: ${{ inputs.release_type }} repository: ${{ inputs.repository }} ref: ${{ inputs.ref }} external_repo_config: ${{ inputs.external_repo_config }} permissions: contents: read id-token: write # ========================================================================== # STAGE: runtime-tests (generic, parallel to math-libs) # ========================================================================== runtime-tests: needs: compiler-runtime if: ${{ !cancelled() && !failure() && !contains(inputs.prebuilt_stages, 'runtime-tests') }} uses: ./.github/workflows/multi_arch_build_portable_linux_artifacts.yml secrets: inherit with: stage_name: runtime-tests stage_display_name: "Stage - Runtime Tests" timeout_minutes: 120 # 2 hours dist_amdgpu_families: ${{ inputs.dist_amdgpu_families }} rocm_package_version: ${{ inputs.rocm_package_version }} build_variant_cmake_preset: ${{ inputs.build_variant_cmake_preset }} build_runs_on: ${{ inputs.build_runs_on }} release_type: ${{ inputs.release_type }} repository: ${{ inputs.repository }} ref: ${{ inputs.ref }} external_repo_config: ${{ inputs.external_repo_config }} permissions: contents: read id-token: write # ========================================================================== # STAGE: wsl-rocdxg (generic) # ========================================================================== wsl-rocdxg: needs: compiler-runtime if: ${{ !cancelled() && !failure() && !contains(inputs.prebuilt_stages, 'wsl-rocdxg') }} uses: ./.github/workflows/multi_arch_build_wsl_rocdxg_artifacts.yml secrets: inherit with: stage_name: wsl-rocdxg stage_display_name: "Stage - WSL ROCDXG" timeout_minutes: 120 # 2 hours dist_amdgpu_families: ${{ inputs.dist_amdgpu_families }} rocm_package_version: ${{ inputs.rocm_package_version }} build_variant_cmake_preset: ${{ inputs.build_variant_cmake_preset }} release_type: ${{ inputs.release_type }} repository: ${{ inputs.repository }} ref: ${{ inputs.ref }} external_repo_config: ${{ inputs.external_repo_config }} permissions: contents: read id-token: write # ========================================================================== # STAGE: math-libs (per-arch) # ========================================================================== math-libs: needs: compiler-runtime if: ${{ !cancelled() && !failure() && !contains(inputs.prebuilt_stages, 'math-libs') }} strategy: # `fail-fast: false` lets all families complete even if one fails. # This is useful for CI (to see all failures at once), but for releases # this risks publishing incomplete packages. Release pipelines may want # to either set `fail-fast: true` or add a validation step that blocks # promotion unless all jobs succeeded. fail-fast: false matrix: family_info: ${{ fromJSON(inputs.matrix_per_family_json) }} uses: ./.github/workflows/multi_arch_build_portable_linux_artifacts.yml secrets: inherit with: stage_name: math-libs stage_display_name: "Stage - Math Libs (${{ matrix.family_info.amdgpu_family }})" timeout_minutes: 480 # 8 hours amdgpu_family: ${{ matrix.family_info.amdgpu_family }} dist_amdgpu_families: ${{ inputs.dist_amdgpu_families }} rocm_package_version: ${{ inputs.rocm_package_version }} build_variant_cmake_preset: ${{ inputs.build_variant_cmake_preset }} build_runs_on: ${{ inputs.build_runs_on }} release_type: ${{ inputs.release_type }} repository: ${{ inputs.repository }} ref: ${{ inputs.ref }} external_repo_config: ${{ inputs.external_repo_config }} permissions: contents: read id-token: write # ========================================================================== # STAGE: comm-libs (generic, single job parallel to math-libs) # RCCL and rocshmem are both TARGET_NEUTRAL artifacts. RCCL is built for # Instinct/CDNA targets only (https://github.com/ROCm/TheRock/issues/2130). # Running as a single generic job avoids redundant per-arch builds. # ========================================================================== comm-libs: needs: compiler-runtime if: ${{ !cancelled() && !failure() && !contains(inputs.prebuilt_stages, 'comm-libs') }} uses: ./.github/workflows/multi_arch_build_portable_linux_artifacts.yml secrets: inherit with: stage_name: comm-libs stage_display_name: "Stage - Comm Libs" timeout_minutes: 240 # 4 hours amdgpu_family: "" dist_amdgpu_families: ${{ inputs.dist_amdgpu_families }} rocm_package_version: ${{ inputs.rocm_package_version }} build_variant_cmake_preset: ${{ inputs.build_variant_cmake_preset }} build_runs_on: ${{ inputs.build_runs_on }} release_type: ${{ inputs.release_type }} repository: ${{ inputs.repository }} ref: ${{ inputs.ref }} external_repo_config: ${{ inputs.external_repo_config }} permissions: contents: read id-token: write # ========================================================================== # STAGE: storage-libs (generic, single job parallel to math-libs) # hipFile is a TARGET_NEUTRAL artifact. # ========================================================================== storage-libs: needs: compiler-runtime if: ${{ !cancelled() && !failure() && !contains(inputs.prebuilt_stages, 'storage-libs') }} uses: ./.github/workflows/multi_arch_build_portable_linux_artifacts.yml secrets: inherit with: stage_name: storage-libs stage_display_name: "Stage - Storage Libs" timeout_minutes: 240 # 4 hours amdgpu_family: "" dist_amdgpu_families: ${{ inputs.dist_amdgpu_families }} rocm_package_version: ${{ inputs.rocm_package_version }} build_variant_cmake_preset: ${{ inputs.build_variant_cmake_preset }} build_runs_on: ${{ inputs.build_runs_on }} release_type: ${{ inputs.release_type }} repository: ${{ inputs.repository }} ref: ${{ inputs.ref }} external_repo_config: ${{ inputs.external_repo_config }} permissions: contents: read id-token: write # ========================================================================== # STAGE: debug-tools (generic, parallel to math-libs) # ========================================================================== debug-tools: needs: compiler-runtime if: ${{ !cancelled() && !failure() && !contains(inputs.prebuilt_stages, 'debug-tools') }} uses: ./.github/workflows/multi_arch_build_portable_linux_artifacts.yml secrets: inherit with: stage_name: debug-tools stage_display_name: "Stage - Debug Tools" timeout_minutes: 180 # 3 hours dist_amdgpu_families: ${{ inputs.dist_amdgpu_families }} rocm_package_version: ${{ inputs.rocm_package_version }} build_variant_cmake_preset: ${{ inputs.build_variant_cmake_preset }} build_runs_on: ${{ inputs.build_runs_on }} release_type: ${{ inputs.release_type }} repository: ${{ inputs.repository }} ref: ${{ inputs.ref }} external_repo_config: ${{ inputs.external_repo_config }} permissions: contents: read id-token: write # ========================================================================== # STAGE: dctools-core (generic, parallel to math-libs) # ========================================================================== dctools-core: needs: compiler-runtime if: ${{ !cancelled() && !failure() && !contains(inputs.prebuilt_stages, 'dctools-core') }} uses: ./.github/workflows/multi_arch_build_portable_linux_artifacts.yml secrets: inherit with: stage_name: dctools-core stage_display_name: "Stage - DC Tools Core" timeout_minutes: 120 # 2 hours dist_amdgpu_families: ${{ inputs.dist_amdgpu_families }} rocm_package_version: ${{ inputs.rocm_package_version }} build_variant_cmake_preset: ${{ inputs.build_variant_cmake_preset }} build_runs_on: ${{ inputs.build_runs_on }} release_type: ${{ inputs.release_type }} repository: ${{ inputs.repository }} ref: ${{ inputs.ref }} external_repo_config: ${{ inputs.external_repo_config }} permissions: contents: read id-token: write # ========================================================================== # STAGE: profiler-apps (generic, parallel to math-libs) # ========================================================================== profiler-apps: needs: compiler-runtime if: ${{ !cancelled() && !failure() && !contains(inputs.prebuilt_stages, 'profiler-apps') }} uses: ./.github/workflows/multi_arch_build_portable_linux_artifacts.yml secrets: inherit with: stage_name: profiler-apps stage_display_name: "Stage - Profiler Apps" timeout_minutes: 180 # 3 hours dist_amdgpu_families: ${{ inputs.dist_amdgpu_families }} rocm_package_version: ${{ inputs.rocm_package_version }} build_variant_cmake_preset: ${{ inputs.build_variant_cmake_preset }} build_runs_on: ${{ inputs.build_runs_on }} release_type: ${{ inputs.release_type }} repository: ${{ inputs.repository }} ref: ${{ inputs.ref }} external_repo_config: ${{ inputs.external_repo_config }} permissions: contents: read id-token: write # ========================================================================== # STAGE: media-libs (generic) # ========================================================================== media-libs: needs: compiler-runtime if: ${{ !cancelled() && !failure() && !contains(inputs.prebuilt_stages, 'media-libs') }} uses: ./.github/workflows/multi_arch_build_portable_linux_artifacts.yml secrets: inherit with: stage_name: media-libs stage_display_name: "Stage - Media Libs" timeout_minutes: 180 # 3 hours dist_amdgpu_families: ${{ inputs.dist_amdgpu_families }} rocm_package_version: ${{ inputs.rocm_package_version }} build_variant_cmake_preset: ${{ inputs.build_variant_cmake_preset }} build_runs_on: ${{ inputs.build_runs_on }} release_type: ${{ inputs.release_type }} repository: ${{ inputs.repository }} ref: ${{ inputs.ref }} external_repo_config: ${{ inputs.external_repo_config }} permissions: contents: read id-token: write