From 1255ba2bcc9fbcfcb6ecbbe8cc24a86374f11610 Mon Sep 17 00:00:00 2001 From: Jason Bonnell <166553723+jbonnell-amd@users.noreply.github.com> Date: Mon, 26 Jan 2026 17:06:20 -0500 Subject: [PATCH] rocprofiler-compute Docker Images in GHCR (#1195) * Initial cleanup of compute workflows and skeleton of ghcr workflow * Add containers-ci.yml, update opensuse and rhel dockerfiles * rename id in rocprofiler-compute-ghcr.yml * Add new line to end of containers-ci.yml * Update action versions for rocprofiler-compute-ghcr.yml * Switch back to SHA for action versions * Add conda set solver classic fix to compute CI dockerfiles * Update conda install for compute Dockerfiles * Change opensuse version to 15.6 in containers-ci.yml * Add fix for ubuntu noble to compute Dockerfile.ubuntu.ci * Add default distro and version to Dockerfile.ubuntu.ci * Updated regex for tarball version * Remove Python3.8 from compute CI Dockerfiles * Change RHEL 9.4 to 9, add retry for compute workflow * Revert name change for compute rhel workflow * update path naming * Remove binutils-gold from Dockerfile.opensuse.ci * Remove conda python installs from Dockerfile.ci files in compute * Change CMake version to 3.21 in compute Dockerfile.ci files * Update checkout actions from v4 to v5 --- .../workflows/rocprofiler-compute-ghcr.yml | 136 ++++++++++++++++++ .../workflows/rocprofiler-compute-rhel-8.yml | 18 +-- .../rocprofiler-compute-ubuntu-jammy.yml | 13 +- .../docker/Dockerfile.opensuse.ci | 42 +++--- .../docker/Dockerfile.rhel.ci | 41 +++--- .../docker/Dockerfile.ubuntu.ci | 66 +++++---- .../docker/containers-ci.yml | 17 +++ 7 files changed, 243 insertions(+), 90 deletions(-) create mode 100644 .github/workflows/rocprofiler-compute-ghcr.yml create mode 100644 projects/rocprofiler-compute/docker/containers-ci.yml diff --git a/.github/workflows/rocprofiler-compute-ghcr.yml b/.github/workflows/rocprofiler-compute-ghcr.yml new file mode 100644 index 0000000000..bf4ee464a6 --- /dev/null +++ b/.github/workflows/rocprofiler-compute-ghcr.yml @@ -0,0 +1,136 @@ +name: Publish GHCR Packages for rocprofiler-compute CI Images + +on: + workflow_dispatch: + schedule: + - cron: 0 5 * * * + push: + branches: + - develop + paths: + - '.github/workflows/rocprofiler-compute-ghcr.yml' + - 'projects/rocprofiler-compute/docker/**' + pull_request: + paths: + - '.github/workflows/rocprofiler-compute-ghcr.yml' + - 'projects/rocprofiler-compute/docker/**' + +jobs: + prepare_matrix_ci: + if: github.repository == 'ROCm/rocm-systems' + runs-on: ubuntu-latest + outputs: + matrix_data: ${{ steps.generate_matrix_ci.outputs.matrix_data }} + + steps: + - uses: actions/checkout@v5 + with: + sparse-checkout: projects/rocprofiler-compute/docker + + - name: Output data for containers matrix + working-directory: projects/rocprofiler-compute/docker + id: generate_matrix_ci + run: | + MATRIX_CONTENT=$(cat containers-ci.yml | yq '.matrix' -I=0 -o=json) + echo "matrix_data=$MATRIX_CONTENT" >> $GITHUB_OUTPUT + + rocprofiler-compute-ci-gfx: + needs: prepare_matrix_ci + runs-on: ubuntu-latest + permissions: + contents: read + packages: write + + strategy: + fail-fast: false + matrix: + system: ${{ fromJSON(needs.prepare_matrix_ci.outputs.matrix_data) }} + gpu: [ 'gfx94X', 'gfx950' ] + + steps: + - name: Checkout Repository + uses: actions/checkout@v5 + with: + sparse-checkout: projects/rocprofiler-compute + submodules: recursive + + - name: Login to GitHub Container Registry + uses: docker/login-action@5e57cd118135c172c3672efd75eb46360885c0ef # v3.6.0 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Set up Docker variables + id: setup_vars_gfx + run: | + if [ ${{ matrix.system.distro }} = "opensuse" ]; then + DISTRO_IMAGE="opensuse/leap" + elif [ ${{ matrix.system.distro }} = "rhel" ]; then + DISTRO_IMAGE="rockylinux/rockylinux" + else + DISTRO_IMAGE=${{ matrix.system.distro }} + fi + echo "distro_image=${DISTRO_IMAGE}" >> $GITHUB_OUTPUT + + if [ ${{ matrix.system.distro }} = "debian" ]; then + DOCKER_FILE=Dockerfile.ubuntu.ci + else + DOCKER_FILE=Dockerfile.${{ matrix.system.distro }}.ci + fi + echo "docker_file=${DOCKER_FILE}" >> $GITHUB_OUTPUT + + - name: Get the latest build of The Rock tarball + id: therock + run: | + sudo apt-get install -y python3-pip + python3 -m pip install -U pip + python3 -m pip install -U awscli + export PATH=~/.local/bin:$PATH + KEY=$(aws s3api list-objects-v2 \ + --bucket therock-nightly-tarball \ + --no-sign-request \ + --output json \ + --query "sort_by(Contents[?contains(Key, 'linux-${{ matrix.gpu }}')], &LastModified)[-1].Key") + KEY=${KEY//\"/} + test -n "$KEY" || { echo "No ${{ matrix.gpu }} tarball found"; exit 1; } + echo "tarball=${KEY}" >> $GITHUB_OUTPUT + + - name: Extract metadata (tags, labels) for Docker + id: meta + uses: docker/metadata-action@c1e51972afc2121e065aed6d45c65596fe445f3f # v5.8.0 + with: + images: ghcr.io/ROCm/rocprofiler-${{ matrix.system.distro }} + + - name: Build CI GFX Container (Does not Push on PR) + id: docker_build + uses: docker/build-push-action@263435318d21b8e681c14492fe198d362a7d2c83 # v6.18.0 + with: + file: projects/rocprofiler-compute/docker/${{ steps.setup_vars_gfx.outputs.docker_file }} + platforms: linux/amd64 + push: ${{ github.event_name != 'pull_request' }} + build-args: | + DISTRO=${{ steps.setup_vars_gfx.outputs.distro_image }} + VERSION=${{ matrix.system.version }} + GPU_TYPE=${{ matrix.gpu }} + GPU_TARBALL=${{ steps.therock.outputs.tarball }} + tags: | + ghcr.io/rocm/rocprofiler-${{ matrix.system.distro }}:${{ matrix.system.version }}-compute-ci-${{ matrix.gpu }} + labels: ${{ steps.meta.outputs.labels }} + + # Retry a copy of docker_build if Docker build failed due to intermittent failure + - name: Build CI GFX Container Retry (Does not Push on PR) + if: steps.docker_build.outcome != 'success' + uses: docker/build-push-action@263435318d21b8e681c14492fe198d362a7d2c83 # v6.18.0 + with: + file: projects/rocprofiler-compute/docker/${{ steps.setup_vars_gfx.outputs.docker_file }} + platforms: linux/amd64 + push: ${{ github.event_name != 'pull_request' }} + build-args: | + DISTRO=${{ steps.setup_vars_gfx.outputs.distro_image }} + VERSION=${{ matrix.system.version }} + GPU_TYPE=${{ matrix.gpu }} + GPU_TARBALL=${{ steps.therock.outputs.tarball }} + tags: | + ghcr.io/rocm/rocprofiler-${{ matrix.system.distro }}:${{ matrix.system.version }}-compute-ci-${{ matrix.gpu }} + labels: ${{ steps.meta.outputs.labels }} diff --git a/.github/workflows/rocprofiler-compute-rhel-8.yml b/.github/workflows/rocprofiler-compute-rhel-8.yml index 1f0a9d524a..626506926c 100644 --- a/.github/workflows/rocprofiler-compute-rhel-8.yml +++ b/.github/workflows/rocprofiler-compute-rhel-8.yml @@ -1,8 +1,5 @@ -# This is a basic workflow to help you get started with Actions +name: rocprofiler-compute RHEL -name: rocprofiler-compute RHEL 8/9 - -# Controls when the workflow will run on: push: branches: @@ -32,8 +29,6 @@ on: - '!**/.wordlist.txt' - '!projects/rocprofiler-compute/docs/**' - '!projects/rocprofiler-compute/docker/**' - - # Allows you to run this workflow manually from the Actions tab workflow_dispatch: concurrency: @@ -43,9 +38,8 @@ concurrency: env: ROCM_VERSION: "7.2.0" -# A workflow run is made up of one or more jobs that can run sequentially or in parallel jobs: - build: + build-rhel: # The type of runner that the job will run on # Using rocprofiler-systems images and later installing rocm, the official rocm images for al8 red hat variant are too large- this is a workaround. runs-on: ubuntu-latest @@ -56,6 +50,7 @@ jobs: matrix: os-release: [ '8.10', '9.4' ] build-type: ['Release'] + # Steps represent a sequence of tasks that will be executed as part of the job # Note- RHEL8 references python3.9 as python39, whereas RHEL9 default version is already 3.9, so we only need to call it as python3 steps: @@ -75,6 +70,7 @@ jobs: yum -y install cmake3 yum -y install which yum -y install glibc-langpack-en + - name: Install ROCm Packages timeout-minutes: 30 uses: nick-fields/retry@v3 @@ -92,10 +88,12 @@ jobs: yum install -y https://repo.radeon.com/amdgpu-install/${ROCM_MAJOR}.${ROCM_MINOR}/rhel/9.4/amdgpu-install-${ROCM_MAJOR}.${ROCM_MINOR}.${ROCM_VERSN}-1.el9.noarch.rpm fi yum install -y rocm-dev + - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 with: sparse-checkout: projects/rocprofiler-compute + - name: Install Python prereqs working-directory: projects/rocprofiler-compute run: | @@ -109,11 +107,13 @@ jobs: cd build cmake -DCMAKE_INSTALL_PREFIX=/opt/rocprofiler-compute -DPYTEST_NUMPROCS=4 .. make install + - name: CTest- Analyze Commands working-directory: projects/rocprofiler-compute run: | cd build ctest --verbose -R test_analyze_commands + - name: CTest- Analyze Workloads working-directory: projects/rocprofiler-compute run: | diff --git a/.github/workflows/rocprofiler-compute-ubuntu-jammy.yml b/.github/workflows/rocprofiler-compute-ubuntu-jammy.yml index c126a091bf..6769c1f069 100644 --- a/.github/workflows/rocprofiler-compute-ubuntu-jammy.yml +++ b/.github/workflows/rocprofiler-compute-ubuntu-jammy.yml @@ -1,5 +1,3 @@ -# This is a basic workflow to help you get started with Actions - name: rocprofiler-compute Ubuntu 22.04 on: @@ -31,8 +29,6 @@ on: - '!**/.wordlist.txt' - '!projects/rocprofiler-compute/docs/**' - '!projects/rocprofiler-compute/docker/**' - - # Allows you to run this workflow manually from the Actions tab workflow_dispatch: concurrency: @@ -40,7 +36,7 @@ concurrency: cancel-in-progress: true jobs: - build: + build-ubuntu-jammy: # The type of runner that the job will run on # https://hub.docker.com/r/rocm/dev-ubuntu-22.04/tags runs-on: ubuntu-latest @@ -54,15 +50,18 @@ jobs: apt-get install -y git apt-get install -y python3-pip apt-get install -y cmake + - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 with: sparse-checkout: projects/rocprofiler-compute + - name: Install Python prereqs working-directory: projects/rocprofiler-compute run: | python3 -m pip install -r requirements.txt python3 -m pip install -r requirements-test.txt + - name: Configure and install working-directory: projects/rocprofiler-compute run: | @@ -70,11 +69,13 @@ jobs: cd build cmake -DCMAKE_INSTALL_PREFIX=/opt/rocprofiler-compute -DPYTEST_NUMPROCS=4 .. make install + - name: CTest- Analyze Commands working-directory: projects/rocprofiler-compute run: | cd build ctest --verbose -R test_analyze_commands + - name: CTest- Analyze Workloads working-directory: projects/rocprofiler-compute run: | diff --git a/projects/rocprofiler-compute/docker/Dockerfile.opensuse.ci b/projects/rocprofiler-compute/docker/Dockerfile.opensuse.ci index 5dc94ef055..e5d5a4b676 100644 --- a/projects/rocprofiler-compute/docker/Dockerfile.opensuse.ci +++ b/projects/rocprofiler-compute/docker/Dockerfile.opensuse.ci @@ -2,19 +2,17 @@ ARG DISTRO=opensuse/leap ARG VERSION=15.3 FROM ${DISTRO}:${VERSION} -ENV HOME /root -ENV SHELL /bin/bash -ENV BASH_ENV /etc/bash.bashrc -ENV DEBIAN_FRONTEND noninteractive +ENV HOME=/root +ENV SHELL=/bin/bash +ENV BASH_ENV=/etc/bash.bashrc +ENV DEBIAN_FRONTEND=noninteractive WORKDIR /tmp SHELL [ "/bin/bash", "-c" ] -ENV PATH /usr/local/bin:${PATH} +ENV PATH=/usr/local/bin:${PATH} ARG EXTRA_PACKAGES="" -# ARG ELFUTILS_DOWNLOAD_VERSION="0.186" -# ARG NJOBS="12" RUN set +e; \ zypper --non-interactive -i --gpg-auto-import-keys refresh; \ @@ -26,23 +24,23 @@ RUN set +e; \ RUN zypper --non-interactive update -y && \ zypper --non-interactive dist-upgrade -y && \ zypper --non-interactive install -y -t pattern devel_basis && \ - zypper --non-interactive install -y python3-pip gcc-c++ git dpkg-devel rpm-build curl wget binutils-gold && \ - python3 -m pip install 'cmake==3.28.4' && \ + zypper --non-interactive install -y python3-pip gcc-c++ git dpkg-devel rpm-build curl wget && \ + python3 -m pip install 'cmake==3.21' && \ zypper --non-interactive clean --all -ARG PYTHON_VERSIONS="6 7 8 9 10 11 12" - -RUN wget https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh -O miniconda.sh && \ - bash miniconda.sh -b -p /opt/conda && \ - export PATH="/opt/conda/bin:${PATH}" && \ - conda config --set always_yes yes --set changeps1 no && \ - conda update -c defaults -n base conda && \ - for i in ${PYTHON_VERSIONS}; do conda create -n py3.${i} -c defaults -c conda-forge python=3.${i} pip numpy; done && \ - for i in ${PYTHON_VERSIONS}; do /opt/conda/envs/py3.${i}/bin/python -m pip install numpy pandas dataclasses; done && \ - conda clean -a -y && \ - cd /tmp && \ - shopt -s dotglob extglob && \ - rm -rf * +# The Rock Tarball +ARG GPU_TYPE="" +ARG GPU_TARBALL="" +RUN if [ -n "$GPU_TYPE" ] && [ -n "$GPU_TARBALL" ]; then \ + VERSION=$(echo "$GPU_TARBALL" | sed -nE 's/.*([0-9]+\.[0-9]+\.[0-9]+).*/\1/p'); \ + if [ -z "$VERSION" ]; then \ + echo "Error: Could not extract version from GPU_TARBALL ('$GPU_TARBALL')." >&2; \ + exit 1; \ + fi; \ + python3 -m pip install -U awscli; \ + aws s3 cp "s3://therock-nightly-tarball/${GPU_TARBALL}" rocm-${VERSION}-${GPU_TYPE}.tar.gz --no-sign-request; \ + mv rocm-${VERSION}-${GPU_TYPE}.tar.gz /opt/rocm-${VERSION}-${GPU_TYPE}.tar.gz; \ + fi WORKDIR /home SHELL [ "/bin/bash", "--login", "-c" ] diff --git a/projects/rocprofiler-compute/docker/Dockerfile.rhel.ci b/projects/rocprofiler-compute/docker/Dockerfile.rhel.ci index c07738fe92..cd3e0d0b60 100644 --- a/projects/rocprofiler-compute/docker/Dockerfile.rhel.ci +++ b/projects/rocprofiler-compute/docker/Dockerfile.rhel.ci @@ -1,42 +1,39 @@ - ARG DISTRO=rockylinux ARG VERSION=8 FROM ${DISTRO}:${VERSION} -ENV HOME /root -ENV SHELL /bin/bash -ENV BASH_ENV /etc/bash.bashrc -ENV DEBIAN_FRONTEND noninteractive +ENV HOME=/root +ENV SHELL=/bin/bash +ENV BASH_ENV=/etc/bash.bashrc +ENV DEBIAN_FRONTEND=noninteractive WORKDIR /tmp SHELL [ "/bin/bash", "-c" ] -ENV PATH /usr/local/bin:${PATH} +ENV PATH=/usr/local/bin:${PATH} ARG EXTRA_PACKAGES="" -# ARG ELFUTILS_DOWNLOAD_VERSION="0.186" -# ARG NJOBS="12" RUN yum groupinstall -y "Development Tools" && \ yum install -y epel-release && \ yum install -y --allowerasing curl dpkg-devel python3-pip wget zlib-devel which git && \ yum clean all && \ python3 -m pip install --upgrade pip && \ - python3 -m pip install 'cmake==3.28.4' + python3 -m pip install 'cmake==3.21' -ARG PYTHON_VERSIONS="6 7 8 9 10 11 12" - -RUN wget https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh -O miniconda.sh && \ - bash miniconda.sh -b -p /opt/conda && \ - export PATH="/opt/conda/bin:${PATH}" && \ - conda config --set always_yes yes --set changeps1 no && \ - conda update -c defaults -n base conda && \ - for i in ${PYTHON_VERSIONS}; do conda create -n py3.${i} -c defaults -c conda-forge python=3.${i} pip numpy; done && \ - for i in ${PYTHON_VERSIONS}; do /opt/conda/envs/py3.${i}/bin/python -m pip install numpy pandas dataclasses; done && \ - conda clean -a -y && \ - cd /tmp && \ - shopt -s dotglob extglob && \ - rm -rf * +# The Rock Tarball +ARG GPU_TYPE="" +ARG GPU_TARBALL="" +RUN if [ -n "$GPU_TYPE" ] && [ -n "$GPU_TARBALL" ]; then \ + VERSION=$(echo "$GPU_TARBALL" | sed -nE 's/.*([0-9]+\.[0-9]+\.[0-9]+).*/\1/p'); \ + if [ -z "$VERSION" ]; then \ + echo "Error: Could not extract version from GPU_TARBALL ('$GPU_TARBALL')." >&2; \ + exit 1; \ + fi; \ + python3 -m pip install -U awscli; \ + aws s3 cp "s3://therock-nightly-tarball/${GPU_TARBALL}" rocm-${VERSION}-${GPU_TYPE}.tar.gz --no-sign-request; \ + mv rocm-${VERSION}-${GPU_TYPE}.tar.gz /opt/rocm-${VERSION}-${GPU_TYPE}.tar.gz; \ + fi WORKDIR /home SHELL [ "/bin/bash", "--login", "-c" ] diff --git a/projects/rocprofiler-compute/docker/Dockerfile.ubuntu.ci b/projects/rocprofiler-compute/docker/Dockerfile.ubuntu.ci index 387a4f123a..8e6e87a392 100644 --- a/projects/rocprofiler-compute/docker/Dockerfile.ubuntu.ci +++ b/projects/rocprofiler-compute/docker/Dockerfile.ubuntu.ci @@ -1,48 +1,52 @@ - -ARG DISTRO -ARG VERSION +ARG DISTRO=ubuntu +ARG VERSION=22.04 FROM ${DISTRO}:${VERSION} -ENV HOME /root -ENV LANG C.UTF-8 -ENV SHELL /bin/bash -ENV BASH_ENV /etc/bash.bashrc -ENV DEBIAN_FRONTEND noninteractive +ENV HOME=/root +ENV LANG=C.UTF-8 +ENV SHELL=/bin/bash +ENV BASH_ENV=/etc/bash.bashrc +ENV DEBIAN_FRONTEND=noninteractive WORKDIR /tmp SHELL [ "/bin/bash", "-c" ] ARG EXTRA_PACKAGES="" -# ARG ELFUTILS_DOWNLOAD_VERSION="0.186" -# ARG BOOST_DOWNLOAD_VERSION="1.79.0" -# ARG NJOBS="12" -ARG PYTHON_VERSIONS="6 7 8 9 10 11 12" - -ENV PATH /usr/local/bin:${PATH} -ENV LIBRARY_PATH /usr/local/lib:/usr/local/lib64:${LIBRARY_PATH} -ENV LD_LIBRARY_PATH /usr/local/lib:/usr/local/lib64:${LD_LIBRARY_PATH} -ENV CMAKE_PREFIX_PATH /usr/local:${CMAKE_PREFIX_PATH} +ENV PATH="/usr/local/bin:${PATH}" +ENV LIBRARY_PATH="/usr/local/lib:/usr/local/lib64" +ENV LD_LIBRARY_PATH="/usr/local/lib:/usr/local/lib64" +ENV CMAKE_PREFIX_PATH="/usr/local" RUN apt-get update && \ apt-get dist-upgrade -y && \ apt-get install -y autoconf autotools-dev bash-completion build-essential bzip2 cmake curl environment-modules git-core gnupg2 gzip libtool locales lsb-release m4 python3-pip unzip wget zip zlib1g-dev && \ - python3 -m pip install 'cmake==3.28.4' && \ apt-get autoclean && \ - locale -a && \ - wget https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh -O miniconda.sh && \ - bash miniconda.sh -b -p /opt/conda && \ - export PATH="/opt/conda/bin:${PATH}" && \ - conda config --set always_yes yes --set changeps1 no && \ - conda update -c defaults -n base conda && \ - for i in ${PYTHON_VERSIONS}; do conda create -n py3.${i} -c defaults -c conda-forge python=3.${i} pip numpy; done && \ - for i in ${PYTHON_VERSIONS}; do /opt/conda/envs/py3.${i}/bin/python -m pip install numpy pandas dataclasses; done && \ - conda clean -a -y && \ - cd /tmp && \ - shopt -s dotglob extglob && \ - rm -rf * + locale -a +RUN OS_VERSION=$(grep '^VERSION_ID=' /etc/os-release | cut -d'=' -f2 | tr -d '"') && \ + OS_ID=$(grep '^ID=' /etc/os-release | cut -d'=' -f2 | tr -d '"') && \ + if [ "${OS_ID}" == "ubuntu" ] && [ "${OS_VERSION}" == "22.04" ]; then \ + python3 -m pip install 'cmake==3.21'; \ + else \ + python3 -m pip install --break-system-packages 'cmake==3.21'; \ + fi -ENV LC_ALL C.UTF-8 +# The Rock Tarball +ARG GPU_TYPE="" +ARG GPU_TARBALL="" +RUN if [ -n "$GPU_TYPE" ] && [ -n "$GPU_TARBALL" ]; then \ + VERSION=$(echo "$GPU_TARBALL" | sed -nE 's/.*([0-9]+\.[0-9]+\.[0-9]+).*/\1/p'); \ + if [ -z "$VERSION" ]; then \ + echo "Error: Could not extract version from GPU_TARBALL ('$GPU_TARBALL')." >&2; \ + exit 1; \ + fi; \ + pip install --upgrade pip; \ + pip install awscli --break-system-packages; \ + aws s3 cp "s3://therock-nightly-tarball/${GPU_TARBALL}" rocm-${VERSION}-${GPU_TYPE}.tar.gz --no-sign-request; \ + mv rocm-${VERSION}-${GPU_TYPE}.tar.gz /opt/rocm-${VERSION}-${GPU_TYPE}.tar.gz; \ + fi + +ENV LC_ALL=C.UTF-8 WORKDIR /home SHELL [ "/bin/bash", "--login", "-c" ] diff --git a/projects/rocprofiler-compute/docker/containers-ci.yml b/projects/rocprofiler-compute/docker/containers-ci.yml new file mode 100644 index 0000000000..af097d6cc9 --- /dev/null +++ b/projects/rocprofiler-compute/docker/containers-ci.yml @@ -0,0 +1,17 @@ +# Supported OS combinations for continuous integration + +matrix: + # ubuntu + - distro: "ubuntu" + version: "22.04" + - distro: "ubuntu" + version: "24.04" + # opensuse + - distro: "opensuse" + version: "15.6" + # RHEL8 + - distro: "rhel" + version: "8.10" + # RHEL9 + - distro: "rhel" + version: "9"