pull/36071/head
workinright 1 month ago
parent 81b72ee6ba
commit 3fe703e03d
  1. 160
      selfdrive/test/build.sh
  2. 35
      selfdrive/test/build_inside.sh

@ -1,29 +1,21 @@
#!/usr/bin/env bash #!/usr/bin/env bash
#set -e #set -e
trap restore_roota ERR trap restore_root ERR
ORG_PWD="$PWD" ORG_PWD="$PWD"
REPO="$HOME/work/openpilot/openpilot" REPO="$HOME/work/openpilot/openpilot"
CACHE_ROOTFS_TARBALL_PATH="/tmp/rootfs_cache.tar" CACHE_ROOTFS_TARBALL_PATH="/tmp/rootfs_cache.tar"
prepare_mounts() { unpack_rootfs_tarball() {
# create and mount the required volumes where they're expected cd /
mkdir -p /tmp/openpilot /tmp/scons_cache /tmp/comma_download_cache /tmp/openpilot_cache sudo tar -xf "$CACHE_ROOTFS_TARBALL_PATH" 2>/dev/null || true
sudo mount --bind "$REPO" /tmp/openpilot cd
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
} }
commit_root() { commit_root() {
sudo mkdir -p /base /newroot /upper /work sudo mkdir -p /base /newroot /upper /work
sudo unshare -f --kill-child -m $ORG_PWD/selfdrive/test/build_inside.sh sudo unshare -f --kill-child -m $ORG_PWD/selfdrive/test/build.sh build_inside_namespace
ec=$? ec=$?
echo "end of ns" echo "end of ns"
@ -37,106 +29,65 @@ commit_root() {
sudo rm -rf /upper sudo rm -rf /upper
cd / unpack_rootfs_tarball
sudo tar -xf "$CACHE_ROOTFS_TARBALL_PATH" 2>/dev/null || true
cd
prepare_mounts prepare_mounts
exit $ec exit $ec
}
#declare -a mounts
commit_root_old() {
sudo mkdir -p /upper /work /overlay # prepare directories for overlayfs
org_mounts="$(cat /proc/mounts)" # save the original mounts table
target="/overlay"
sudo mkdir -p /lower
sudo mount --bind / /lower
mounts+=("/lower")
sudo mount -t overlay overlay -o lowerdir=/lower,upperdir=/upper,workdir=/work "$target" # mount the overlayfs
mounts+=("/")
while read line # bind-mount any mounts under the old rootfs into the new one (overlayfs isn't recursive like e.g. `mount --rbind`)
do
echo DOING $line
if [ "$line" != "/" ] # except the rootfs base, to avoid infinite mountpoint loops
then
target="/overlay$line"
sudo mount --bind "$line" "$target" || true
mounts+=("$line")
fi
done < <(echo "$org_mounts" | cut -d" " -f2)
# remove the MS_SHARED flag from the original rootfs mount, which isn't supported by pivot_root(8) and would cause it to fail (see: https://lxc-users.linuxcontainers.narkive.com/pNQKxcnN/pivot-root-failures-when-is-mounted-as-shared)
sudo mount --make-rprivate /
# prepare for the pivot_root(8) and execute, swapping places of the original rootfs and the new one on overlayfs (with its lowerdir still being the original one)
# (what this achieves is committing the state of the original rootfs and making it read-only, while creating a new, virtual read-write rootfs with all changes written into a separate directory, the upperdir)
cd /overlay
sudo mkdir -p old
sudo pivot_root . old # once this finishes, the system is moved to the new rootfs and all newly open file descriptors will point to it
#sudo systemctl daemon-reexec
cd
mount
ls /home/runner
sudo touch /root_commited
exec "$ORG_PWD/$0" "$@"
} }
restore_roota() { 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
echo failed at ${BASH_LINENO[0]} 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() { restore_root() {
echo failed at ${BASH_LINENO[0]} echo failed at ${BASH_LINENO[0]}
}
echo mounts "${mounts[@]}" build_inside_namespace() {
mount --bind / /base
cd /old mount -t overlay overlay -o lowerdir=/base,upperdir=/upper,workdir=/work /newroot
sudo mkdir -p new rm -f /newroot/etc/resolv.conf
sudo pivot_root . new touch /newroot/etc/resolv.conf
#sudo systemctl daemon-reexec cat /etc/resolv.conf > /newroot/etc/resolv.conf
cd
mkdir -p /newroot/old
cd /newroot
for (( i=${#mounts[@]}-1; i>=0; i-- )) pivot_root . old
do
#sudo lsof "/new/${mounts[i]}" || true mount -t proc proc /proc
sudo umount -l "/lower/overlay/${mounts[i]}" || true mount -t devtmpfs devtmpfs /dev
sudo umount -l "/new/${mounts[i]}" || true mkdir -p /dev/pts
done mount -t devpts devpts /dev/pts
mount -t proc proc /proc
mount mount -t sysfs sysfs /sys
rm -f /root_commited touch /root_committed
sudo -u runner /home/runner/work/openpilot/openpilot/selfdrive/test/build.sh
ec=$?
exit $ec
} }
echo AAA if [ "$1" = "build_inside_namespace" ]
mount then
echo BBB build_inside_namespace
exit
fi
if [ -f "$CACHE_ROOTFS_TARBALL_PATH" ] if [ -f "$CACHE_ROOTFS_TARBALL_PATH" ]
then then
# if the rootfs diff tarball (also created by this script) got restored from the CI native cache, unpack it, upgrading the rootfs # 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" echo "restoring rootfs from the native build cache"
cd / unpack_rootfs_tarball
sudo tar -xf "$CACHE_ROOTFS_TARBALL_PATH" 2>/dev/null || true
cd
rm "$CACHE_ROOTFS_TARBALL_PATH" rm "$CACHE_ROOTFS_TARBALL_PATH"
# before the next tasks are run, finalize the environment for them # before the next tasks are run, finalize the environment for them
@ -149,20 +100,14 @@ else
echo "no native build cache entry restored, rebuilding" echo "no native build cache entry restored, rebuilding"
fi fi
# in case this script was run on the same instance before, umount any overlays which were mounted by the previous runs
#tac /proc/mounts | grep overlay | grep -v "overlay / " | cut -d" " -f2 | while read line; do sudo umount "$line" || true; done
# 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; # 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 # below, we prepare the system and the new rootfs itself
if ! [ -e /root_committed ] if ! [ -e /root_committed ]
then then
commit_root commit_root
fi 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 -------- # -------- 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 # install and set up the native dependencies needed
@ -219,33 +164,18 @@ NVIDIA_DRIVER_CAPABILITIES=graphics,utility,compute
QTWEBENGINE_DISABLE_SANDBOX=1 QTWEBENGINE_DISABLE_SANDBOX=1
# install and set up the Python dependencies needed # install and set up the Python dependencies needed
#sudo useradd -m -s /bin/bash -u 1002 test
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" \ 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/ /home/runner/
#sudo chown -R test:test /home/test
cd cd
#chown -R runner:run
rm -rf .venv rm -rf .venv
mkdir aaa mkdir aaa
cd aaa cd aaa
../install_python_dependencies.sh ../install_python_dependencies.sh
cd cd
#sudo -u test bash -c " export HOME=/home/test ; export XDG_CONFIG_HOME=/home/test/.config ; cd /home/test ; ./install_python_dependencies.sh"
#sudo chown -R runner:runner /home/test
#cd /home/test ; rm pyproject.toml uv.lock install_python_dependencies.sh ; ls -la ; cd
rm pyproject.toml uv.lock install_python_dependencies.sh rm pyproject.toml uv.lock install_python_dependencies.sh
#sudo rsync -aL /home/test/.venv/ /home/runner/.venv/
#sudo rsync -aL /home/test/.local/ /home/runner/.local/
#sudo rm -rf /home/test
# add a git safe directory for compiling openpilot # add a git safe directory for compiling openpilot
sudo git config --global --add safe.directory /tmp/openpilot sudo git config --global --add safe.directory /tmp/openpilot

@ -1,35 +0,0 @@
#!/usr/bin/env bash
sudo 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
mount
touch /root_committed
sudo -u runner /home/runner/work/openpilot/openpilot/selfdrive/test/build.sh
ec=$?
echo "hello"
#sudo umount /newroot
#sudo umount /base
exit $ec
Loading…
Cancel
Save