We install the rust toolchain, but then we have to manually source it in CI since the headless containers skip over the shell profiles that rustup typically uses. Ideally we'd set these as variables in the main image, but we don't have access to the buildah instance used in ci-templates/cbuild. However adding them to the toolbox image is good enough to have the toolbox setup work ootb even if it doesn't call the ci/scripts/source_image_env.sh script like the gitlab-ci jobs will do. Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/7816>
166 lines
4.2 KiB
Bash
166 lines
4.2 KiB
Bash
#!/bin/bash
|
|
# vi: sw=2 ts=4
|
|
|
|
# Shameless copy of the script from gnome-shell
|
|
# https://gitlab.gnome.org/GNOME/gnome-shell/-/blob/main/.gitlab-ci/build-toolbox-image.sh?ref_type=heads
|
|
|
|
set -e
|
|
|
|
die() {
|
|
echo "$@" >&2
|
|
exit 1
|
|
}
|
|
|
|
check_image_base() {
|
|
local base=$(
|
|
skopeo inspect docker://$TOOLBOX_IMAGE 2>/dev/null |
|
|
jq -r '.Labels["org.opencontainers.image.base.name"]')
|
|
[[ "$base" == "$BASE_CI_IMAGE" ]]
|
|
}
|
|
|
|
build_container() {
|
|
echo Building $TOOLBOX_IMAGE from $BASE_CI_IMAGE
|
|
|
|
export BUILDAH_ISOLATION=chroot
|
|
export BUILDAH_FORMAT=docker
|
|
|
|
local build_cntr=$(buildah from $BASE_CI_IMAGE)
|
|
local build_mnt=$(buildah mount $build_cntr)
|
|
|
|
[[ -n "$build_mnt" && -n "$build_cntr" ]] || die "Failed to mount the container"
|
|
|
|
# Copy pasted from github
|
|
# https://github.com/containers/toolbox/blob/main/images/fedora/f39/extra-packages
|
|
local extra_packages=(
|
|
bash-completion
|
|
bc
|
|
bzip2
|
|
cracklib-dicts
|
|
diffutils
|
|
dnf-plugins-core
|
|
findutils
|
|
flatpak-spawn
|
|
fpaste
|
|
gawk-all-langpacks
|
|
git
|
|
glibc-gconv-extra
|
|
gnupg2
|
|
gnupg2-smime
|
|
gvfs-client
|
|
hostname
|
|
iproute
|
|
iputils
|
|
keyutils
|
|
krb5-libs
|
|
less
|
|
lsof
|
|
man-db
|
|
man-pages
|
|
mesa-dri-drivers
|
|
mesa-vulkan-drivers
|
|
mtr
|
|
nano-default-editor
|
|
nss-mdns
|
|
openssh-clients
|
|
passwd
|
|
pigz
|
|
procps-ng
|
|
psmisc
|
|
rsync
|
|
shadow-utils
|
|
sudo
|
|
tcpdump
|
|
"time"
|
|
traceroute
|
|
tree
|
|
unzip
|
|
util-linux
|
|
vte-profile
|
|
vulkan-loader
|
|
wget
|
|
which
|
|
whois
|
|
words
|
|
xorg-x11-xauth
|
|
xz
|
|
zip
|
|
)
|
|
local our_extra_packages=(
|
|
gdb
|
|
ripgrep
|
|
fish
|
|
zsh
|
|
)
|
|
# local debug_packages=(
|
|
# glib2
|
|
# )
|
|
|
|
buildah run $build_cntr dnf install -y "${extra_packages[@]}"
|
|
buildah run $build_cntr dnf install -y "${our_extra_packages[@]}"
|
|
# buildah run $build_cntr dnf debuginfo-install -y "${debug_packages[@]}"
|
|
|
|
buildah run $build_cntr dnf clean all
|
|
buildah run $build_cntr rm -rf /var/lib/cache/dnf
|
|
|
|
# random uid
|
|
uid="10043"
|
|
name="containeruser"
|
|
buildah run $build_cntr -- groupadd $name -g $uid
|
|
buildah run $build_cntr -- useradd -u $uid -g $uid -ms /bin/bash $name
|
|
|
|
buildah run $build_cntr -- usermod -aG wheel $name
|
|
buildah run $build_cntr -- bash -c "echo $name ALL=\(ALL\) NOPASSWD:ALL > /etc/sudoers.d/$name"
|
|
buildah run $build_cntr -- chmod 0440 /etc/sudoers.d/$name
|
|
|
|
buildah config \
|
|
--env RUSTUP_HOME="/usr/local/rustup" \
|
|
--env CARGO_HOME="/usr/local/cargo/" \
|
|
--env PATH="$PATH:/usr/local/cargo/bin/" \
|
|
$build_cntr
|
|
|
|
# Remove the hardcoded HOME env var that ci-templates adds
|
|
# https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/2433#note_2243222
|
|
# Also add the OCI labels that toolbox expects, to advertize that image is compatible
|
|
# Additionally add a non-root default user
|
|
buildah config --env HOME- \
|
|
--user $name \
|
|
--label com.github.containers.toolbox=true \
|
|
--label org.opencontainers.image.base.name=$BASE_CI_IMAGE \
|
|
$build_cntr
|
|
|
|
buildah commit $build_cntr $TOOLBOX_IMAGE
|
|
buildah tag $TOOLBOX_IMAGE $TOOLBOX_LATEST
|
|
}
|
|
|
|
BASE_CI_IMAGE="$1"
|
|
TOOLBOX_BRANCH="$2"
|
|
GST_UPSTREAM_BRANCH="$3"
|
|
|
|
TOOLBOX_IMAGE="$CI_REGISTRY_IMAGE/$FDO_REPO_SUFFIX:gst-toolbox-${TOOLBOX_BRANCH}"
|
|
# push an unversioned tag to make it easier to use.
|
|
# ex. pull foobar:toolbox-main
|
|
TOOLBOX_LATEST="$CI_REGISTRY_IMAGE/$FDO_REPO_SUFFIX:gst-toolbox-${GST_UPSTREAM_BRANCH}"
|
|
|
|
[[ -n "$BASE_CI_IMAGE" && -n "$TOOLBOX_BRANCH" && -n "$GST_UPSTREAM_BRANCH" ]] ||
|
|
die "Usage: $(basename $0) BASE_CI_IMAGE TOOLBOX TAG GST_UPSTREAM_BRANCH"
|
|
|
|
[[ -n "$CI_REGISTRY" && -n "$CI_REGISTRY_USER" && -n "$CI_REGISTRY_PASSWORD" ]] ||
|
|
die "Insufficient information to log in."
|
|
|
|
podman login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
|
|
|
|
if ! check_image_base; then
|
|
build_container
|
|
|
|
podman push "$TOOLBOX_IMAGE"
|
|
if [ "$GST_UPSTREAM_BRANCH" == "$CI_COMMIT_BRANCH" ]; then
|
|
podman push "$TOOLBOX_LATEST"
|
|
fi
|
|
fi
|
|
|
|
echo "Create your toolbox with either of the following commands"
|
|
echo " $ toolbox create gst-$TOOLBOX_BRANCH --image $TOOLBOX_IMAGE"
|
|
if [ "$GST_UPSTREAM_BRANCH" == "$CI_COMMIT_BRANCH" ]; then
|
|
echo " $ toolbox create gst-$GST_UPSTREAM_BRANCH --image $TOOLBOX_LATEST"
|
|
fi
|