12fe7f54eSRob Bradford# Copyright © 2025 Intel Corporation 25e9886bbSRuslan Mstoi# 3ca96ff60SRob Bradford# SPDX-License-Identifier: Apache-2.0 4ca96ff60SRob Bradford# 58c19d526SRob Bradford# When changing this file don't forget to update the tag name in the 68c19d526SRob Bradford# .github/workflows/docker-image.yaml file if doing multiple per day 78c19d526SRob Bradford 8655d5125SRuoqing HeFROM ubuntu:24.04 AS dev 9db6f894eSSamuel Ortiz 10db5d42adSSebastien BoeufARG TARGETARCH 11*226ecf47SRuoqing HeARG RUST_TOOLCHAIN="1.83.0" 12db6f894eSSamuel OrtizARG CLH_SRC_DIR="/cloud-hypervisor" 13db6f894eSSamuel OrtizARG CLH_BUILD_DIR="$CLH_SRC_DIR/build" 14db6f894eSSamuel OrtizARG CARGO_REGISTRY_DIR="$CLH_BUILD_DIR/cargo_registry" 15db6f894eSSamuel OrtizARG CARGO_GIT_REGISTRY_DIR="$CLH_BUILD_DIR/cargo_git_registry" 16db6f894eSSamuel Ortiz 17db6f894eSSamuel OrtizENV CARGO_HOME=/usr/local/rust 18db6f894eSSamuel OrtizENV RUSTUP_HOME=$CARGO_HOME 19db6f894eSSamuel OrtizENV PATH="$PATH:$CARGO_HOME/bin" 20b8ce1816SRuslan MstoiENV DEBIAN_FRONTEND=noninteractive 21db6f894eSSamuel Ortiz 22db6f894eSSamuel Ortiz# Install all CI dependencies 238363edddSRuslan Mstoi# DL3015 ignored cause not installing openvswitch-switch-dpdk recommended packages breaks ovs_dpdk test 248363edddSRuslan Mstoi# hadolint ignore=DL3008,DL3015 250090ec2dSMichael ZhaoRUN apt-get update \ 260090ec2dSMichael Zhao && apt-get -yq upgrade \ 278363edddSRuslan Mstoi && apt-get install --no-install-recommends -yq \ 28d27316daSRob Bradford build-essential \ 2946d6a6cdSRob Bradford bc \ 30db6f894eSSamuel Ortiz curl \ 3146d6a6cdSRob Bradford wget \ 3246d6a6cdSRob Bradford sudo \ 33db6f894eSSamuel Ortiz mtools \ 3433b0e158SSamuel Ortiz musl-tools \ 3546d6a6cdSRob Bradford libssl-dev \ 36d27316daSRob Bradford pkg-config \ 3746d6a6cdSRob Bradford flex \ 3846d6a6cdSRob Bradford bison \ 3946d6a6cdSRob Bradford libelf-dev \ 4046d6a6cdSRob Bradford qemu-utils \ 4146d6a6cdSRob Bradford libglib2.0-dev \ 4246d6a6cdSRob Bradford libpixman-1-dev \ 4346d6a6cdSRob Bradford libseccomp-dev \ 4446d6a6cdSRob Bradford libcap-ng-dev \ 4546d6a6cdSRob Bradford socat \ 4646d6a6cdSRob Bradford dosfstools \ 4746d6a6cdSRob Bradford cpio \ 48d27316daSRob Bradford python3 \ 49d27316daSRob Bradford python3-setuptools \ 5046d6a6cdSRob Bradford ntfs-3g \ 513cb2b72eSHenry Wang uuid-dev \ 5246d6a6cdSRob Bradford iperf3 \ 5346d6a6cdSRob Bradford zip \ 54a08da07dSRob Bradford git-core \ 55a08da07dSRob Bradford dnsmasq \ 5628413d26SRob Bradford dmsetup \ 578363edddSRuslan Mstoi ca-certificates \ 588363edddSRuslan Mstoi unzip \ 598363edddSRuslan Mstoi iproute2 \ 608363edddSRuslan Mstoi dbus \ 618363edddSRuslan Mstoi && apt-get install openvswitch-switch-dpdk -yq \ 62db6f894eSSamuel Ortiz && apt-get clean \ 6370aa5bc2SRuslan Mstoi && rm -rf /var/lib/apt/lists/* /var/log/*log /var/log/apt/* /var/lib/dpkg/*-old /var/cache/debconf/*-old 64db6f894eSSamuel Ortiz 65fbaceea4SSebastien BoeufRUN update-alternatives --set ovs-vswitchd /usr/lib/openvswitch-switch-dpdk/ovs-vswitchd-dpdk 66fbaceea4SSebastien Boeuf 671bd8eb68SRuslan Mstoi# hadolint ignore=DL3008 68db5d42adSSebastien BoeufRUN if [ "$TARGETARCH" = "amd64" ]; then \ 690090ec2dSMichael Zhao apt-get update \ 700090ec2dSMichael Zhao && apt-get -yq upgrade \ 71b9bd80faSPraveen K Paladugu && apt-get install --no-install-recommends -yq swtpm \ 720090ec2dSMichael Zhao && apt-get clean \ 7370aa5bc2SRuslan Mstoi && rm -rf /var/lib/apt/lists/* /var/log/*log /var/log/apt/* /var/lib/dpkg/*-old /var/cache/debconf/*-old; fi 740090ec2dSMichael Zhao 751bd8eb68SRuslan Mstoi# hadolint ignore=DL3008 76db5d42adSSebastien BoeufRUN if [ "$TARGETARCH" = "arm64" ]; then \ 77b70e2547SHenry Wang # On AArch64, `setcap` binary should be installed via `libcap2-bin`. 78b70e2547SHenry Wang # The `setcap` binary is used in integration tests. 7956c26b3dSMichael Zhao # `libguestfs-tools` is used for modifying cloud image kernel, and it requires 8056c26b3dSMichael Zhao # kernel (any version) image in `/boot` and modules in `/lib/modules`. 81b70e2547SHenry Wang apt-get update \ 82b70e2547SHenry Wang && apt-get -yq upgrade \ 838363edddSRuslan Mstoi && apt-get install --no-install-recommends -yq \ 8456c26b3dSMichael Zhao libcap2-bin \ 8556c26b3dSMichael Zhao libguestfs-tools \ 86b7512d3dSRob Bradford linux-image-generic \ 876037c835SHenry Wang autotools-dev \ 886037c835SHenry Wang autoconf \ 896037c835SHenry Wang automake \ 906037c835SHenry Wang perl \ 916037c835SHenry Wang texinfo \ 92b70e2547SHenry Wang && apt-get clean \ 9370aa5bc2SRuslan Mstoi && rm -rf /var/lib/apt/lists/* /var/log/*log /var/log/apt/* /var/lib/dpkg/*-old /var/cache/debconf/*-old; fi 94b70e2547SHenry Wang 9533b0e158SSamuel Ortiz# Fix the libssl-dev install 961bd8eb68SRuslan Mstoi# hadolint ignore=SC2155 971e5d35d1SSebastien BoeufRUN export ARCH="$(uname -m)" \ 981bd8eb68SRuslan Mstoi && cp /usr/include/"$ARCH"-linux-gnu/openssl/opensslconf.h /usr/include/openssl/ 991e5d35d1SSebastien BoeufENV X86_64_UNKNOWN_LINUX_GNU_OPENSSL_LIB_DIR=/usr/lib/x86_64-linux-gnu/ 1001e5d35d1SSebastien BoeufENV X86_64_UNKNOWN_LINUX_MUSL_OPENSSL_LIB_DIR=/usr/lib/x86_64-linux-gnu/ 1011e5d35d1SSebastien BoeufENV AARCH64_UNKNOWN_LINUX_GNU_OPENSSL_LIB_DIR=/usr/lib/aarch64-linux-gnu/ 1021e5d35d1SSebastien BoeufENV AARCH64_UNKNOWN_LINUX_MUSL_OPENSSL_LIB_DIR=/usr/lib/aarch64-linux-gnu/ 10333b0e158SSamuel OrtizENV OPENSSL_INCLUDE_DIR=/usr/include/ 10433b0e158SSamuel Ortiz 105db6f894eSSamuel Ortiz# Install the rust toolchain 1061bd8eb68SRuslan Mstoi# hadolint ignore=DL4006,SC2155 1071e5d35d1SSebastien BoeufRUN export ARCH="$(uname -m)" \ 108ece4fc20SRob Bradford && nohup curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --profile minimal --default-toolchain "$RUST_TOOLCHAIN" \ 1091bd8eb68SRuslan Mstoi && rustup target add "$ARCH"-unknown-linux-musl --toolchain "$RUST_TOOLCHAIN" \ 1100d50d0b2SRuoqing He && if [ "$TARGETARCH" = "amd64" ]; then \ 1110d50d0b2SRuoqing He rustup toolchain add --profile minimal --force-non-host \ 1120d50d0b2SRuoqing He $RUST_TOOLCHAIN-x86_64-unknown-linux-musl; fi \ 113db5d42adSSebastien Boeuf && if [ "$TARGETARCH" = "amd64" ]; then rustup component add rustfmt; fi \ 114db5d42adSSebastien Boeuf && if [ "$TARGETARCH" = "amd64" ]; then rustup component add clippy; fi \ 115db6f894eSSamuel Ortiz && rm -rf "$CARGO_HOME/registry" \ 116db6f894eSSamuel Ortiz && ln -s "$CARGO_REGISTRY_DIR" "$CARGO_HOME/registry" \ 117db6f894eSSamuel Ortiz && rm -rf "$CARGO_HOME/git" \ 118db6f894eSSamuel Ortiz && ln -s "$CARGO_GIT_REGISTRY_DIR" "$CARGO_HOME/git" 119db6f894eSSamuel Ortiz 120db6f894eSSamuel Ortiz# Set the rust environment 1211bd8eb68SRuslan Mstoi# hadolint ignore=SC2016 1221bd8eb68SRuslan MstoiRUN echo 'source $CARGO_HOME/env' >> "$HOME"/.bashrc \ 1231bd8eb68SRuslan Mstoi && mkdir "$HOME"/.cargo \ 1241bd8eb68SRuslan Mstoi && ln -s $CARGO_HOME/env "$HOME"/.cargo/env 125ae68c802SBo Chen 126655d5125SRuoqing He# Allow pip to install packages system wide 1275388fa1cSRuoqing He# hadolint ignore=DL3003,SC2046 1285388fa1cSRuoqing HeRUN rm /usr/lib/python3.12/EXTERNALLY-MANAGED \ 129655d5125SRuoqing He && git clone https://github.com/spdk/spdk \ 13027f7b2c2SBo Chen && cd spdk \ 1317f47a030Sdom.song && git checkout ef8bcce58f3f02b79c0619a297e4f17e81e62b24 \ 13227f7b2c2SBo Chen && git submodule update --init \ 13327f7b2c2SBo Chen && apt-get update \ 13427f7b2c2SBo Chen && ./scripts/pkgdep.sh \ 13505769879SRob Bradford && apt-get clean \ 13627f7b2c2SBo Chen && ./configure --with-vfio-user \ 1375388fa1cSRuoqing He && if [ "$TARGETARCH" = "amd64" ]; then \ 1385388fa1cSRuoqing He make -j $(nproc) TARGET_ARCHITECTURE=skylake; \ 1395388fa1cSRuoqing He elif [ "$TARGETARCH" = "arm64" ]; then \ 1405cb51154SRuoqing He make -j $(nproc) TARGET_ARCHITECTURE="armv8.2-a" DPDKBUILD_FLAGS="-Dplatform=generic"; \ 1415388fa1cSRuoqing He else \ 1425388fa1cSRuoqing He echo "Unsupported architecture: ${TARGETARCH}" && exit 1; \ 1435388fa1cSRuoqing He fi \ 1447f47a030Sdom.song && rm -rf /usr/local/bin/spdk-nvme \ 14527f7b2c2SBo Chen && mkdir /usr/local/bin/spdk-nvme \ 1467f47a030Sdom.song && cp -f ./build/bin/nvmf_tgt /usr/local/bin/spdk-nvme \ 1477f47a030Sdom.song && cp -f ./scripts/rpc.py /usr/local/bin/spdk-nvme \ 1485cb51154SRuoqing He && cp -rf ./python/spdk/ /usr/local/bin/spdk-nvme \ 1497f47a030Sdom.song && cp -rf ./python /usr/local/bin \ 1505388fa1cSRuoqing He && cd .. && rm -rf spdk 1511603841fSBo Chen 1521603841fSBo Chen# install ethr tool for performance tests 15309e21e8fSRob BradfordRUN if [ "$TARGETARCH" = "amd64" ]; then \ 1541bd8eb68SRuslan Mstoi wget -nv https://github.com/microsoft/ethr/releases/latest/download/ethr_linux.zip \ 1551603841fSBo Chen && unzip ethr_linux.zip \ 1561603841fSBo Chen && cp ethr /usr/local/bin \ 15709e21e8fSRob Bradford && rm ethr_linux.zip; fi 158