1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
|
#!/bin/sh
# run upstream system integration tests via mkosi
set -e
set -x
RELEASE=$(
. /etc/os-release;
if [ "$ID" = "ubuntu" ]; then
echo "$VERSION_CODENAME"
elif [ "$ID" = "debian" ]; then
if [ -n "$VERSION_ID" ] && [ -n "$VERSION_CODENAME" ]; then
echo "$VERSION_CODENAME"
else
debian_version="$(cat /etc/debian_version)"
if [ "${debian_version#*/}" = sid ]; then
if [ "$VERSION_CODENAME" = sid ] || grep -q -r sid /etc/apt/sources.list* || grep -q -r unstable /etc/apt/sources.list*; then
echo "unstable"
else
echo "$VERSION_CODENAME"
fi
fi
fi
fi
)
cleanup () {
if [ -f "${workdir}/btrfs/build/meson-logs/testlog.txt" ]; then
cp "${workdir}/btrfs/build/meson-logs/testlog.txt" "$AUTOPKGTEST_ARTIFACTS"
fi
if [ -d "${workdir}/btrfs/build/test/journal" ]; then
cp -r "${workdir}/btrfs/build/test/journal" "$AUTOPKGTEST_ARTIFACTS"
fi
if [ -n "$workdir" ]; then
umount "$workdir/btrfs" || true
losetup --detach "$loop" || true
rm -rf "$workdir"
fi
}
# apparmor is not compatible with swtpm
aa-teardown >/dev/null 2>&1 || true
# we need user namespaces for some tests running in nspawn
sysctl -we kernel.apparmor_restrict_unprivileged_unconfined=0
sysctl -we kernel.apparmor_restrict_unprivileged_userns=0
mkdir -p /run/systemd/resolved.conf.d/
tee /run/systemd/resolved.conf.d/dns.conf <<EOF
[Resolve]
DNS=1.1.1.1#cloudflare-dns.com 1.0.0.1#cloudflare-dns.com 2606:4700:4700::1111#cloudflare-dns.com 2606:4700:4700::1001#cloudflare-dns.com
EOF
systemctl try-reload-or-restart systemd-resolved.service
workdir="$(mktemp --directory --tmpdir=/var/tmp integration-tests.XXXXXXXXXX)"
trap cleanup EXIT
# We need to make nearly identical copies of large images, so set up a BTRFS volume that
# can use copy-on-write and compression, as the available disk space is very limited
truncate --size=100G "$workdir/btrfs.raw"
mkfs.btrfs "$workdir/btrfs.raw"
mkdir -p "$workdir/btrfs"
loop="$(losetup --find --show --direct-io=on "$workdir/btrfs.raw")"
mount "$loop" "$workdir/btrfs" --options compress=zstd:1,user_subvol_rm_allowed,noatime,discard=async,space_cache=v2
# mkosi will drop privileges and fail if it detects that is ran under sudo,
# so unset these variables to hide it
unset SUDO_USER SUDO_UID SUDO_GID
mkosi_tree="${AUTOPKGTEST_TMP}/mkosi"
git clone https://github.com/systemd/mkosi.git "$mkosi_tree"
# If we have it, pin the mkosi version to the same one used by Github Actions, to ensure consistency
if [ -f .github/workflows/mkosi.yml ]; then
mkosi_hash="$(grep systemd/mkosi@ .github/workflows/mkosi.yml | sed "s|.*systemd/mkosi@||g")"
git -C "$mkosi_tree" checkout "$mkosi_hash"
fi
tee mkosi.local.conf <<EOF
[Output]
Format=disk
WorkspaceDirectory=$workdir
PackageCacheDirectory=$workdir/cache
[Distribution]
PackageManagerTrees=/etc/apt/preferences.d/:/etc/apt/preferences.d/
${RELEASE:+"Release=${RELEASE}"}
[Content]
Environment=NO_BUILD=1 NO_SYNC=1 ARTIFACT_DIRECTORY="$AUTOPKGTEST_ARTIFACTS" TEST_SAVE_JOURNAL=fail TEST_SHOW_JOURNAL=warning
[Host]
RuntimeBuildSources=no
Incremental=no
EOF
# reprepro is unhappy about non-existing directories
package_directories=""
if [ -d "${AUTOPKGTEST_TMP}/../binaries" ]; then
package_directories="${AUTOPKGTEST_TMP}/../binaries,$package_directories"
fi
if [ -d /var/cache/apt/archives/ ]; then
package_directories="/var/cache/apt/archives/,$package_directories"
fi
if [ -n "$package_directories" ]; then
tee -a mkosi.local.conf <<EOF
[Content]
PackageDirectories=$package_directories
EOF
fi
# Everything is already built and installed, but these dependencies will cause rebuilds which we want to
# avoid, so patch them out
sed -i "/depends : mkosi_depends/d" meson.build
# qemu/vsock does not appear to work on ppc64el/s390x, so skip those tests
# qemu tests time out on arm64, so skip them
dpkgarch=$(dpkg --print-architecture)
if [ "$dpkgarch" = ppc64el ] || [ "$dpkgarch" = s390x ] || [ "$dpkgarch" = arm64 ]; then
export TEST_NO_QEMU=1
fi
# If we don't have KVM, the explicitly disable it, as mkosi will fail. But try to load the module first.
modprobe kvm || true
if [ ! -e /dev/kvm ]; then
export TEST_NO_KVM=1
fi
# This test causes qemu to crash too often
if [ "${DEB_BUILD_PROFILES#*pkg.systemd.upstream*}" = "${DEB_BUILD_PROFILES:-}" ]; then
export TEST_SKIP=TEST-64-UDEV-STORAGE
fi
export ARTIFACT_DIRECTORY="$AUTOPKGTEST_ARTIFACTS"
export PATH="${mkosi_tree}/bin:$PATH"
export TEST_SAVE_JOURNAL=fail
export TEST_SHOW_JOURNAL=warning
export QEMU_TIMEOUT=2400
export NSPAWN_TIMEOUT=2400
export SYSTEMD_INTEGRATION_TESTS=1
export NO_BUILD=1
export NO_SYNC=1
mkosi summary
meson setup "${workdir}/btrfs/build" -Dintegration-tests=true -Dtests=true
mkosi --debug genkey
cp mkosi.key mkosi.crt "${workdir}/btrfs/build"
meson compile -C "${workdir}/btrfs/build" mkosi
meson test -C "${workdir}/btrfs/build" -v --no-rebuild --suite integration-tests --print-errorlogs --no-stdsplit
|