Created
December 29, 2023 20:47
-
-
Save matoro/453ca912ca21b939a758e844ca05094d to your computer and use it in GitHub Desktop.
matoro's test script (as of 2023.12.29)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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}" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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}}" | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
DEFAULT_FLAVOR="arm64-openrc" | |
REPO_DIR="${HOME}/gentoo" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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