Skip to content

Instantly share code, notes, and snippets.

@matoro
Created December 29, 2023 20:47
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save matoro/453ca912ca21b939a758e844ca05094d to your computer and use it in GitHub Desktop.
Save matoro/453ca912ca21b939a758e844ca05094d to your computer and use it in GitHub Desktop.
matoro's test script (as of 2023.12.29)
Directory structure should be as follows:
<test directory, you need write access to this>
-> dotest.sh
-> functions.sh
-> testreqs.package.use
-> $(hostname -s)
-> settings.sh
You execute from inside $(hostname -s) like:
$ ../dotest.sh <bug number or package atom> [flavor]
Set REPO_DIR to the desired location in settings.sh, it defaults to "${HOME}/gentoo".
If you want to test multiple atoms explicitly put them inside a single string, separated by spaces.
If [flavor] is not provided, then the value of DEFAULT_FLAVOR from settings.sh will be used.
To use a self-contained ext4 .img rather than a directory on disk, set NFS_WORKAROUND=1.
#!/usr/bin/env bash
set -euo pipefail
sudo id
source "/lib/gentoo/functions.sh"
[[ "$(basename "$(realpath .)")" != "$(hostname -s)" ]] && set +u && eerror "Must run from inside directory named $(hostname -s)"
[[ -f "settings.sh" ]] && source "settings.sh"
source "../functions.sh"
FLAVOR="${2:-"${DEFAULT_FLAVOR}"}"
ARCH="${ARCH:-"$(portageq envvar ARCH)"}"
MAKEOPTS="${MAKEOPTS:-"$(portageq envvar MAKEOPTS)"}"
[[ "$(stat -f -c %T "${PWD}")" == "nfs" ]] && export NFS_WORKAROUND="${NFS_WORKAROUND:-1}" || export NFS_WORKAROUND="${NFS_WORKAROUND:-0}"
URLBASE="https://gentoo.osuosl.org/releases/${RELARCH:-${ARCH}}/autobuilds"
unset GNUPGHOME
[[ -z "${GPGTMP:-}" ]] || return 0
GPGTMP="$(mktemp --suffix=.gpg)"
gpg --no-default-keyring --keyring "${GPGTMP}" --import "/usr/share/openpgp-keys/gentoo-release.asc"
function verifycommit()
{
git -C "${CHROOT_NAME}/var/db/repos/gentoo" cat-file commit HEAD | sed -e'/^gpgsig/d; /^ /d' > "/tmp/${CHROOT_NAME}_commit.txt"
git -C "${CHROOT_NAME}/var/db/repos/gentoo" cat-file commit HEAD | sed -ne '/^gpgsig/,/---END/s/^[a-z]* //p' > "/tmp/${CHROOT_NAME}_sig.txt"
gpg --no-default-keyring --keyring "${GPGTMP}" --verify "/tmp/${CHROOT_NAME}_sig.txt" "/tmp/${CHROOT_NAME}_commit.txt"
}
function trapunmounts()
{
EXIT_CODE="${?}"
set +e
run_dounmounts "${CHROOT_NAME}"
exit "${EXIT_CODE}"
}
trap trapunmounts EXIT
declare -a pkglist
if [[ "${1}" =~ ^[0-9]+$ ]]
then
# assume argument is bug number
git -C "${REPO_DIR:-${HOME}/gentoo}" checkout master
git -C "${REPO_DIR:-${HOME}/gentoo}" pull --ff-only
readarray -t pkglist < <(set +u; nattka --repo "${REPO_DIR:-${HOME}/gentoo}" apply -a "${ARCH}" -n ${NATTKA_ARGUMENTS} "${1}" | sed '/^#.*/d' | sed '/^$/d' | cut -d " " -f 1)
else
# assume argument is package atom(s)
pkglist=( ${1} )
fi
wget -c -O - "${URLBASE}/latest-stage3-${FLAVOR}.txt" | gpg --no-default-keyring --keyring "${GPGTMP}" | tee "latest-stage3-${FLAVOR}.txt"
TARBALL="$(grep -E -m1 "^[^#]" "latest-stage3-${FLAVOR}.txt" | cut -d " " -f 1)"
CHROOT_NAME="$(basename -s .tar.xz "${TARBALL}")"
wget -c -O "$(basename "${TARBALL}")" "${URLBASE}/${TARBALL}"
wget -c -O "$(basename "${TARBALL}.asc")" "${URLBASE}/${TARBALL}.asc"
sync
gpg --no-default-keyring --keyring "${GPGTMP}" --verify "$(basename "${TARBALL}.asc")"
ln -svnf "${CHROOT_NAME}" "latest-stage3-${FLAVOR}"
[[ "${FLAVOR}" == "${DEFAULT_FLAVOR}" ]] && ln -svnf "latest-stage3-${FLAVOR}" "latest-default"
mkdir -vp "${CHROOT_NAME}"
if [[ "${NFS_WORKAROUND}" == "1" ]]
then
if [[ ! -f "${CHROOT_NAME}.img" ]]
then
dd status=progress if=/dev/zero of="${CHROOT_NAME}.img" bs=10M count=1000 oflag=dsync
mkfs.ext4 "${CHROOT_NAME}.img"
fi
if ! mountpoint -q "${CHROOT_NAME}"
then
run_dounmounts "${CHROOT_NAME}"
sudo -E mount "${CHROOT_NAME}.img" "${CHROOT_NAME}"
fi
fi
if [[ ! -d "${CHROOT_NAME}" ]] || [[ "$(find "${CHROOT_NAME}" -mindepth 1 -maxdepth 1 | wc -l)" == "1" ]] || [[ "$(find "${CHROOT_NAME}" -mindepth 1 -maxdepth 1 | wc -l)" == "0" ]]
then
sudo -E tar -C "${CHROOT_NAME}" -x -v -J -f "$(basename "${TARBALL}")" --xattrs-include='*.*' --numeric-owner
run_domounts "${CHROOT_NAME}"
sudo -E cp -vaL "/etc/resolv.conf" "${CHROOT_NAME}/etc/resolv.conf"
sudo -E cp -va "/etc/security/limits.conf" "${CHROOT_NAME}/etc/security/limits.conf"
[[ -d "../releng" ]] || git -C .. clone "https://github.com/gentoo/releng"
git -C "../releng" pull --ff-only
sudo -E rsync -vhrltD --chown=root:root --chmod=Du=rwx,Dg=rx,Do=rx,Fu=rw,Fg=r,Fo=r --progress "../releng/releases/portage/stages/" "${CHROOT_NAME}/etc/portage/"
echo -e 'C.UTF8 UTF-8\nen_US.UTF-8 UTF-8' | sudo -E tee "${CHROOT_NAME}/etc/locale.gen"
sudo -E git -C "${CHROOT_NAME}/var/db/repos" clone --depth=1 "https://github.com/gentoo-mirror/gentoo"
verifycommit
if [[ -f "/usr/local/share/ca-certificates/ca.crt" ]]
then
sudo -E mkdir -vp "${CHROOT_NAME}/usr/local/share/ca-certificates"
sudo -E cp -va "/usr/local/share/ca-certificates/ca.crt" "${CHROOT_NAME}/usr/local/share/ca-certificates/ca.crt"
fi
sudo -E chroot "${CHROOT_NAME}" /bin/bash <<EOF
set -eo pipefail
source /etc/profile
type locale-gen && locale-gen
env-update && source /etc/profile
type locale-gen && eselect locale set en_US.utf8
env-update && source /etc/profile
update-ca-certificates --fresh
mkdir -vp /etc/portage/env
eselect news read
echo "PORTAGE_WORKDIR_MODE=\"0750\"" >> /etc/portage/make.conf
echo "MAKEOPTS=\"${MAKEOPTS}\"" >> /etc/portage/make.conf
echo "EMERGE_DEFAULT_OPTS=\"--autounmask=y --autounmask-continue=y\"" >> /etc/portage/make.conf
echo "PORTAGE_NICENESS=\"39\"" >> /etc/portage/make.conf
echo "FEATURES=\"-parallel-fetch\"" >> /etc/portage/make.conf
[[ "${CHROOT_NAME}" != *"musl"* ]] && echo "PORTAGE_SCHEDULING_POLICY=\"idle\"" >> /etc/portage/make.conf
[[ "${CHROOT_NAME}" == *systemd* ]] && systemd-machine-id-setup
echo "TZ=\"UTC\"" >> /etc/portage/make.conf
mkdir -vp /etc/portage/env
echo -e "USE=\"test\"\nFEATURES=\"test keeptemp\"" > /etc/portage/env/test
echo "virtual/linux-sources-9999" > /etc/portage/profile/package.provided
touch /.ready
sync
emerge -vuDN1 --autounmask=y --autounmask-continue=y --exclude sys-devel/gcc @world
eselect news read
EOF
fi
run_domounts "${CHROOT_NAME}"
if [[ ! -f "${CHROOT_NAME}/.ready" ]]
then
echo "Setup failed to complete, removing chroot"
run_dounmounts "${CHROOT_NAME}"
sudo rm -rf --one-file-system "${CHROOT_NAME}" "${CHROOT_NAME}.img"
exit 1
fi
[[ -f "../testreqs.package.use" ]] && sudo -E cp -vf "../testreqs.package.use" "${CHROOT_NAME}/etc/portage/package.use/testreqs"
sudo -E git -C "${CHROOT_NAME}/var/db/repos/gentoo" fetch --depth=1
sudo -E git -C "${CHROOT_NAME}/var/db/repos/gentoo" reset --merge origin/stable
verifycommit
sudo -E chroot "${CHROOT_NAME}" /bin/bash <<EOF
set -eo pipefail
source /etc/profile
[[ ! -f /.ready ]] && echo "Setup failed to complete, please delete and rerun" && exit 1
eselect news read
rm -rf /etc/portage/package.env /etc/portage/package.accept_keywords /var/tmp/portage/*
emerge -vuDN1 --autounmask=y --autounmask-continue=y --exclude sys-devel/gcc @world
for f in ${pkglist[@]@Q} ; do echo "\${f} test" >> /etc/portage/package.env ; done
echo emerge -v1 --autounmask=y --autounmask-continue=y --keep-going ${pkglist[@]@Q}
emerge -v1 --autounmask=y --autounmask-continue=y --keep-going ${pkglist[@]@Q}
EOF
run_dounmounts "${CHROOT_NAME}"
function run_dounmounts()
{
for f in dev/pts proc dev sys run usr/src var/cache/distfiles
do
if mountpoint -q "${1}/${f}"
then
sudo -E umount --lazy "${1}/${f}"
fi
done
if mountpoint -q "${1}"
then
sudo -E umount "${1}"
fi
}
function run_domounts()
{
run_dounmounts "${1}"
[[ "$(stat -f -c %T "${PWD}")" == "nfs" ]] && export NFS_WORKAROUND="${NFS_WORKAROUND:-1}" || export NFS_WORKAROUND="${NFS_WORKAROUND:-0}"
if [[ "${NFS_WORKAROUND}" == "1" ]]
then
sudo -E mount "$(basename "$(realpath "${1}")").img" "${1}"
fi
if ! mountpoint -q "${1}/proc"
then
sudo -E mount -t proc /proc "${1}/proc"
fi
for f in dev dev/pts sys run # var/cache/distfiles
do
if ! mountpoint -q "${1}/${f}"
then
sudo -E mount --rbind "/${f}" "${1}/${f}"
sudo -E mount --make-rslave "${1}/${f}"
fi
done
if ! mountpoint -q "${1}/usr/src"
then
sudo -E mount --rbind -o ro /usr/src "${1}/usr/src"
sudo -E mount --make-rslave "${1}/usr/src"
fi
}
function run_urlencode() {
perl -MURI::Escape -e 'print uri_escape shift, , q{^A-Za-z0-9\-._~/:}' "${1}" && echo
}
function run_urldecode() {
perl -MURI::Escape -e 'print uri_unescape shift' "${1}" && echo
}
function run_dokw()
{
[[ -z "${1}" ]] && return
[[ -f "settings.sh" ]] && source "settings.sh"
git -C "${REPO_DIR:-${HOME}/gentoo}" checkout master
git -C "${REPO_DIR:-${HOME}/gentoo}" pull --ff-only
git -C "${REPO_DIR:-${HOME}/gentoo}" checkout keywording
git -C "${REPO_DIR:-${HOME}/gentoo}" fetch
git -C "${REPO_DIR:-${HOME}/gentoo}" reset --hard fork/keywording
git -C "${REPO_DIR:-${HOME}/gentoo}" rebase master
nattka --repo "${REPO_DIR:-${HOME}/gentoo}" apply -a "${ARCH:-$(portageq envvar ARCH)}" ${NATTKA_ARGUMENTS} "${1}"
nattka --repo "${REPO_DIR:-${HOME}/gentoo}" commit -a "${ARCH:-$(portageq envvar ARCH)}" "${1}"
git -C "${REPO_DIR:-${HOME}/gentoo}" push --force
}
function run_testlogs()
{
[[ -f "settings.sh" ]] && source "settings.sh"
run_domounts "latest-stage3-${1:-${DEFAULT_FLAVOR}}"
awk '/>>> Test phase/{f=1} /(>>> Completed testing|disabled because of RESTRICT=test)/{f=0;print} f' latest-stage3-${1:-${DEFAULT_FLAVOR}}/var/tmp/portage/*/*/temp/build.log
run_dounmounts "latest-stage3-${1:-${DEFAULT_FLAVOR}}"
}
function run_addca()
{
[[ -f "settings.sh" ]] && source "settings.sh"
run_domounts "latest-stage3-${1:-${DEFAULT_FLAVOR}}"
[[ ! -d "latest-stage3-${1:-${DEFAULT_FLAVOR}}/usr/local" ]] && return
sudo -E mkdir -vp "latest-stage3-${1:-${DEFAULT_FLAVOR}}/usr/local/share/ca-certificates"
sudo -E cp -v "/usr/local/share/ca-certificates/ca.crt" "latest-stage3-${1:-${DEFAULT_FLAVOR}}/usr/local/share/ca-certificates/ca.crt"
sudo -E chroot "latest-stage3-${1:-${DEFAULT_FLAVOR}}" update-ca-certificates --fresh
run_dounmounts "latest-stage3-${1:-${DEFAULT_FLAVOR}}"
}
function run_notest()
{
FEATURES="-test" USE="-test" "${@}"
}
function run_addspace()
{
[[ -f "settings.sh" ]] && source "settings.sh"
[[ -f "$(readlink -f "latest-stage3-${1:-${DEFAULT_FLAVOR}}").img" ]] || return
run_dounmounts "latest-stage3-${1:-${DEFAULT_FLAVOR}}"
dd status=progress if=/dev/zero of="$(readlink -f "latest-stage3-${1:-${DEFAULT_FLAVOR}}").img" bs=100M count="$(( 10 * "${2%%G}" ))" oflag=append,dsync conv=notrunc
e2fsck -f "$(readlink -f "latest-stage3-${1:-${DEFAULT_FLAVOR}}").img"
resize2fs "$(readlink -f "latest-stage3-${1:-${DEFAULT_FLAVOR}}").img"
}
function run_remanifest()
{
[[ -f "settings.sh" ]] && source "settings.sh"
run_domounts "latest-stage3-${1:-${DEFAULT_FLAVOR}}"
(sudo -E git -C "latest-stage3-${1:-${DEFAULT_FLAVOR}}/var/db/repos/gentoo" ls-files --others --exclude-standard && sudo -E git -C "latest-stage3-${1:-${DEFAULT_FLAVOR}}/var/db/repos/gentoo" diff --name-only) | sort -u | grep -E ".*\.ebuild$" | while read line
do
sudo -E chroot "latest-stage3-${1:-${DEFAULT_FLAVOR}}" /bin/bash -c "cd /var/db/repos/gentoo/$(dirname "${line}") && ebuild "$(basename "${line}")" manifest"
done
run_dounmounts "latest-stage3-${1:-${DEFAULT_FLAVOR}}"
}
function run_resetgit()
{
[[ -f "settings.sh" ]] && source "settings.sh"
run_domounts "latest-stage3-${1:-${DEFAULT_FLAVOR}}"
sudo -E git -C "latest-stage3-${1:-${DEFAULT_FLAVOR}}/var/db/repos/gentoo" reset --hard
sudo -E git -C "latest-stage3-${1:-${DEFAULT_FLAVOR}}/var/db/repos/gentoo" clean -fdx
run_dounmounts "latest-stage3-${1:-${DEFAULT_FLAVOR}}"
}
DEFAULT_FLAVOR="arm64-openrc"
REPO_DIR="${HOME}/gentoo"
app-admin/salt cheetah genshi PYTHON_TARGETS: python3_10
app-i18n/man-pages-l10n L10N: es
app-misc/pax-utils python
dev-cpp/cairomm X
dev-cpp/gtkmm X
dev-lang/fennel LUA_SINGLE_TARGET: luajit
dev-libs/poco sqlite
dev-php/pecl-memcached igbinary
dev-python/PyQt5 bluetooth dbus declarative designer gui help location positioning
dev-python/PyQt6 qml
dev-python/pytest-salt-factories PYTHON_TARGETS: python3_10
dev-qt/qtconnectivity bluetooth
dev-qt/qtmultimedia qml
gnome-base/gnome-control-center elogind
gnome-base/gnome-settings-daemon elogind
mail-client/roundcube sqlite
mail-filter/amavisd-new spamassassin
media-gfx/imagemagick corefonts truetype
media-libs/kvazaar static-libs
media-libs/libaom CPU_FLAGS_X86: mmx sse2
media-libs/libavif dav1d
media-libs/libheif go
media-libs/libsdl opengl
media-libs/sdl2-mixer midi timidity
net-libs/webkit-gtk X
net-nds/openldap sasl
net-proxy/haproxy -slz
sys-apps/accountsservice elogind
sys-apps/rng-tools jitterentropy
sys-auth/nss-pam-ldapd pynslcd
sys-devel/gcc debug
sys-libs/libblockdev introspection lvm
www-servers/apache APACHE2_MODULES: -http2
x11-libs/wxGTK tiff
x11-terms/xfce4-terminal X
xfce-base/libxfce4windowing X
xfce-base/xfce4-panel X
xfce-base/xfce4-settings X
xfce-base/xfdesktop X
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment