#!/bin/bash # This script is used for initializing the host environment for CI. # Supports Fedora and EL-based distributions. set -eux -o pipefail : "${LIBPATHRS_VERSION:=0.2.5}" # BATS_VERSION is only consumed for the EL8 platform as its bats package is too old. : "${BATS_VERSION:=v1.12.0}" SCRIPTDIR="$(dirname "${BASH_SOURCE[0]}")" # PLATFORM_ID is not available on Fedora PLATFORM_ID= grep -q ^PLATFORM_ID /etc/os-release && PLATFORM_ID="$(grep -oP '^PLATFORM_ID="\K[^"]+' /etc/os-release)" # Initialize DNF DNF=(dnf -y --setopt=install_weak_deps=False --setopt=tsflags=nodocs) case "$PLATFORM_ID" in platform:el8) # DNF+=(--exclude="kernel,kernel-core") seems to fail "${DNF[@]}" config-manager --set-enabled powertools # for glibc-static "${DNF[@]}" install epel-release ;; platform:el9 | platform:el10) DNF+=(--exclude="kernel,kernel-core") "${DNF[@]}" config-manager --set-enabled crb # for glibc-static "${DNF[@]}" install epel-release ;; *) # Fedora DNF+=(--exclude="kernel,kernel-core") ;; esac # Install common packages RPMS=(cargo container-selinux curl fuse-sshfs git-core glibc-static golang iptables jq libseccomp-devel lld make policycoreutils) # Work around dnf mirror failures by retrying a few times. for i in $(seq 0 2); do sleep "$i" "${DNF[@]}" update && "${DNF[@]}" install "${RPMS[@]}" && break done # shellcheck disable=SC2181 [ $? -eq 0 ] # fail if dnf failed # Install CRIU if [ "$PLATFORM_ID" = "platform:el8" ]; then # Use newer criu (with https://github.com/checkpoint-restore/criu/pull/2545). # Alas we have to disable container-tools for that. "${DNF[@]}" module disable container-tools "${DNF[@]}" copr enable adrian/criu-el8 fi "${DNF[@]}" install criu # Install BATS if [ "$PLATFORM_ID" = "platform:el8" ]; then # The packaged version of bats is too old: `BATS_ERROR_SUFFIX: unbound variable`, `bats_require_minimum_version: command not found` ( cd /tmp git clone https://github.com/bats-core/bats-core ( cd bats-core git checkout "$BATS_VERSION" ./install.sh /usr/local cat >>/etc/profile.d/sh.local <<'EOF' PATH="/usr/local/bin:$PATH" export PATH EOF cat >/etc/sudoers.d/local <<'EOF' Defaults secure_path = "/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin" EOF ) rm -rf bats-core ) else "${DNF[@]}" install bats fi # Clean up DNF dnf clean all # Install libpathrs "$SCRIPTDIR"/build-libpathrs.sh "$LIBPATHRS_VERSION" /usr # Setup rootless user. "$SCRIPTDIR"/setup_rootless.sh # Delegate all cgroup v2 controllers to rootless user via --systemd-cgroup if [ -e /sys/fs/cgroup/cgroup.controllers ]; then mkdir -p /etc/systemd/system/user@.service.d cat >/etc/systemd/system/user@.service.d/delegate.conf <<'EOF' [Service] # The default (since systemd v252) is "pids memory cpu". Delegate=yes EOF systemctl daemon-reload fi # Allow potentially unsafe tests. echo 'export RUNC_ALLOW_UNSAFE_TESTS=yes' >>/root/.bashrc