#!/usr/bin/env bash set -e trap restore_root ERR ORG_PWD="$PWD" REPO="$HOME/work/openpilot/openpilot" CACHE_ROOTFS_TARBALL_PATH="/tmp/rootfs_cache.tar" unpack_rootfs_tarball() { cd / sudo tar -xf "$CACHE_ROOTFS_TARBALL_PATH" 2>/dev/null || true cd } commit_root() { sudo mkdir -p /base /newroot /upper /work sudo unshare -f --kill-child -m $ORG_PWD/selfdrive/test/build.sh build_inside_namespace ec=$? echo "end of ns" sudo rm -rf /base /newroot /work # finally, create the rootfs diff tarball (to be pushed into the CI native cache) mkdir -p /tmp/rootfs_cache sudo rm -f "$CACHE_ROOTFS_TARBALL_PATH" # remove the old tarball from previous run, if exists cd /upper sudo tar -cf "$CACHE_ROOTFS_TARBALL_PATH" . cd sudo rm -rf /upper unpack_rootfs_tarball # before the next tasks are run, finalize the environment for them prepare_mounts exit $ec } prepare_mounts() { # create and mount the required volumes where they're expected mkdir -p /tmp/openpilot /tmp/scons_cache /tmp/comma_download_cache /tmp/openpilot_cache sudo mount --bind "$REPO" /tmp/openpilot sudo mount --bind "$REPO/.ci_cache/scons_cache" /tmp/scons_cache || true sudo mount --bind "$REPO/.ci_cache/comma_download_cache" /tmp/comma_download_cache || true sudo mount --bind "$REPO/.ci_cache/openpilot_cache" /tmp/openpilot_cache || true # needed for the unit tests not to fail sudo chmod 755 /sys/fs/pstore } restore_root() { echo failed at ${BASH_LINENO[0]} } build_inside_namespace() { mount --bind / /base mount -t overlay overlay -o lowerdir=/base,upperdir=/upper,workdir=/work /newroot rm -f /newroot/etc/resolv.conf touch /newroot/etc/resolv.conf cat /etc/resolv.conf > /newroot/etc/resolv.conf mkdir -p /newroot/old cd /newroot pivot_root . old mount -t proc proc /proc mount -t devtmpfs devtmpfs /dev mkdir -p /dev/pts mount -t devpts devpts /dev/pts mount -t proc proc /proc mount -t sysfs sysfs /sys touch /root_committed sudo -u runner /home/runner/work/openpilot/openpilot/selfdrive/test/build.sh ec=$? exit $ec } if [ "$1" = "build_inside_namespace" ] then build_inside_namespace exit fi if [ -f "$CACHE_ROOTFS_TARBALL_PATH" ] then # if the rootfs diff tarball (also created by this script) got restored from the CI native cache, unpack it, upgrading the rootfs echo "restoring rootfs from the native build cache" unpack_rootfs_tarball rm "$CACHE_ROOTFS_TARBALL_PATH" # before the next tasks are run, finalize the environment for them prepare_mounts # EXITS HERE - if the rootfs could been prepared entirely from the cache, there's no need for any further action like re-building exit 0 else # otherwise, we'll have to install everything from scratch and build the tarball to be available for the next run echo "no native build cache entry restored, rebuilding" fi # in order to be able to build a diff rootfs tarball, we need to commit its initial state by moving it on-the-fly to overlayfs; # below, we prepare the system and the new rootfs itself if ! [ -e /root_committed ] then commit_root fi # -------- at this point, the original rootfs was committed and all the changes to it done below will be saved to the newly created rootfs diff tarball -------- # install and set up the native dependencies needed PYTHONUNBUFFERED=1 DEBIAN_FRONTEND=noninteractive mkdir -p /tmp/tools cp "$REPO/tools/install_ubuntu_dependencies.sh" /tmp/tools/ sudo /tmp/tools/install_ubuntu_dependencies.sh &>/dev/null sudo apt-get install -y --no-install-recommends \ sudo tzdata locales ssh pulseaudio xvfb x11-xserver-utils gnome-screenshot python3-tk python3-dev \ apt-utils alien unzip tar curl xz-utils dbus gcc-arm-none-eabi tmux vim libx11-6 wget &>/dev/null sudo rm -rf /var/lib/apt/lists/* sudo apt-get clean cd /usr/lib/gcc/arm-none-eabi/* sudo rm -rf arm/ thumb/nofp thumb/v6* thumb/v8* thumb/v7+fp thumb/v7-r+fp.sp cd sudo sed -i -e 's/# en_US.UTF-8 UTF-8/en_US.UTF-8 UTF-8/' /etc/locale.gen sudo locale-gen LANG=en_US.UTF-8 LANGUAGE=en_US:en LC_ALL=en_US.UTF-8 mkdir -p /tmp/opencl-driver-intel cd /tmp/opencl-driver-intel wget https://github.com/intel/llvm/releases/download/2024-WW14/oclcpuexp-2024.17.3.0.09_rel.tar.gz &>/dev/null wget https://github.com/oneapi-src/oneTBB/releases/download/v2021.12.0/oneapi-tbb-2021.12.0-lin.tgz &>/dev/null sudo mkdir -p /opt/intel/oclcpuexp_2024.17.3.0.09_rel cd /opt/intel/oclcpuexp_2024.17.3.0.09_rel sudo tar -zxvf /tmp/opencl-driver-intel/oclcpuexp-2024.17.3.0.09_rel.tar.gz sudo mkdir -p /etc/OpenCL/vendors sudo bash -c "echo /opt/intel/oclcpuexp_2024.17.3.0.09_rel/x64/libintelocl.so > /etc/OpenCL/vendors/intel_expcpu.icd" cd /opt/intel sudo tar -zxvf /tmp/opencl-driver-intel/oneapi-tbb-2021.12.0-lin.tgz sudo ln -s /opt/intel/oneapi-tbb-2021.12.0/lib/intel64/gcc4.8/libtbb.so /opt/intel/oclcpuexp_2024.17.3.0.09_rel/x64 sudo ln -s /opt/intel/oneapi-tbb-2021.12.0/lib/intel64/gcc4.8/libtbbmalloc.so /opt/intel/oclcpuexp_2024.17.3.0.09_rel/x64 sudo ln -s /opt/intel/oneapi-tbb-2021.12.0/lib/intel64/gcc4.8/libtbb.so.12 /opt/intel/oclcpuexp_2024.17.3.0.09_rel/x64 sudo ln -s /opt/intel/oneapi-tbb-2021.12.0/lib/intel64/gcc4.8/libtbbmalloc.so.2 /opt/intel/oclcpuexp_2024.17.3.0.09_rel/x64 sudo mkdir -p /etc/ld.so.conf.d sudo bash -c "echo /opt/intel/oclcpuexp_2024.17.3.0.09_rel/x64 > /etc/ld.so.conf.d/libintelopenclexp.conf" sudo ldconfig -f /etc/ld.so.conf.d/libintelopenclexp.conf cd / rm -rf /tmp/opencl-driver-intel cd sudo bash -c "dbus-uuidgen > /etc/machine-id" NVIDIA_VISIBLE_DEVICES=all NVIDIA_DRIVER_CAPABILITIES=graphics,utility,compute QTWEBENGINE_DISABLE_SANDBOX=1 # install and set up the Python dependencies needed sudo cp "/home/runner/work/openpilot/openpilot/pyproject.toml" "/home/runner/work/openpilot/openpilot/uv.lock" "/home/runner/work/openpilot/openpilot/tools/install_python_dependencies.sh" \ /home/runner/ cd rm -rf .venv mkdir aaa cd aaa ../install_python_dependencies.sh cd rm pyproject.toml uv.lock install_python_dependencies.sh # add a git safe directory for compiling openpilot sudo git config --global --add safe.directory /tmp/openpilot