===========
autopkgtest
===========
The *autopkgtest* package runs `DEP-8 `_ tests.
This page mostly aims at running these tests manually within a (E)LTS
VM, for efficiently debugging, fixing and designing tests. This is
useful when salsa-ci/ci.debian.net/ci.freexian.com fails at the end of
a lengthy process with no debug access.
*As for 2025-02 bookworm is Debian Stable, and we still support jessie
in ELTS, so we focus on stable tooling and document jessie. When
trixie is released and jessie EOL, we can upgrade the tooling and drop
jessie documentation.*
See also https://wiki.debian.org/ContinuousIntegration/autopkgtest
.. contents:: :depth: 2
---------
Local run
---------
This runs tests directly in the current host. This is enough for most
tests and easiest to debug.
This complements working within a LTS VM for fine-grained
patch-by-patch testing.
In your test VM, examples/cheat-sheet with stretch+ syntax:
.. code-block:: bash
cd package-version/
apt-get build-dep .
debuild
apt install autopkgtest
# additional automatic/ecosystem tests:
# https://manpages.debian.org/unstable/autodep8/autodep8.1.en.html
apt install autodep8
autopkgtest ../..._amd64.changes -- null
# save the test logs (but no more colors):
autopkgtest -o ../test.outdir ../..._amd64.changes -- null
# test local debian/tests/ changes, without auto-rebuilding
autopkgtest -B . -- null
# run only selected test
autopkgtest --test-name=TEST ...
# run only selected testS (>=bookworm)
autopkgtest --test-name=TEST1 --test-name=TEST2 ...
# ensure you run test with a non-root user
autopkgtest -u dla ...
# run a reverse dependency's tests, simply:
autopkgtest rdep_source_package_name -- null
In your test VM, example with `rails `_, old (jessie) syntax:
.. code-block:: bash
cd rails-4.1.8/
apt-get build-dep rails
debuild
apt install autopkgtest
apt install ruby-spring ruby-jquery-rails ruby-sqlite3 ruby-sass-rails ruby-uglifier ruby-coffee-rails ruby-turbolinks ruby-jbuilder ruby-sdoc
apt install ruby-byebug ruby-web-console # stretch
# TODO: autopkgtest should install dependencies automatically, possibly those weren't due to APT::Install-Recommends "false", or it's a bug somewhere
adt-run -B ./ --- null
adt-run ../rails_4.1.8-1+deb8u7_amd64.changes --- null
TODO: can we pass DEB_BUILD_OPTIONS=xxx?
------------------------------------------
Full LXC environment (isolation-container)
------------------------------------------
This is for tests that would break the VM configuration (such as
``/etc``). It is easy to create LXC containers from within a VM,
here's how.
In your test VM, example with *apache2*, new (stretch+) syntax.
LXC setup (buster and above):
.. code-block:: bash
apt install autopkgtest
apt install lxc lxc-templates debootstrap rsync distro-info
systemctl status lxc-net
# If necessary:
cat >> /etc/lxc/default.conf <<'EOF'
lxc.apparmor.profile = unconfined
EOF
# Create base container
# Add security updates to better match target environment
DIST=bullseye
cat < ~/apt-security.sh
#!/bin/bash
echo 'deb http://security.debian.org/debian-security $DIST-security main' >> /etc/apt/sources.list
echo 'deb-src http://security.debian.org/debian-security $DIST-security main' >> /etc/apt/sources.list
apt update
apt -y upgrade
EOF
autopkgtest-build-lxc debian $DIST amd64 ~/apt-security.sh
TODO: adjust sources for buster/ELTS.
LXC setup (stretch):
.. code-block:: bash
apt install autopkgtest
apt install lxc debootstrap rsync ebtables
# Create network
apt install libvirt-daemon-system
# edit /etc/libvirt/qemu/networks/default.xml if needed (IP range...)
virsh net-autostart default
service libvirtd restart
cat > /etc/lxc/default.conf <<'EOF'
lxc.network.type = veth
lxc.network.flags = up
lxc.network.link = virbr0
EOF
# Create base container
# Add security updates to better match target environment
cat <<'EOF' > ~/apt-security.sh
#!/bin/bash
echo 'deb http://security.debian.org/debian-security stretch/updates main' >> /etc/apt/sources.list
echo 'deb-src http://security.debian.org/debian-security stretch/updates main' >> /etc/apt/sources.list
apt update
apt -y upgrade
EOF
autopkgtest-build-lxc debian stretch amd64 ~/apt-security.sh
Testing the package (buster and above):
.. code-block:: bash
DIST=bullseye
cd apache2-2.4.38/
apt-get build-dep .
debuild
# Test the package you're working on
autopkgtest --shell-fail ../apache2_2.4.38-3+deb10u9_amd64.changes \
-- lxc autopkgtest-$DIST-amd64
# Caveat: tests packages *from the archive* (not your new .deb):
#autopkgtest -B . -- lxc autopkgtest-$DIST-amd64
# use this instead:
autopkgtest -B . ../*.deb -- lxc autopkgtest-$DIST-amd64
Testing the package (stretch):
.. code-block:: bash
cd apache2-2.4.25/
apt-get build-dep apache2
debuild
# Test the package you're working on
autopkgtest ../apache2_2.4.25-3+deb9u11_amd64.changes \
-- lxc autopkgtest-stretch-amd64
# Caveat: tests packages *from the archive* (not your new .deb):
#autopkgtest -B . -- lxc autopkgtest-stretch-amd64
# use this instead:
autopkgtest -B . ../*.deb -- lxc autopkgtest-stretch-amd64
Testing the package (jessie syntax):
.. code-block:: bash
adt-build-lxc debian jessie amd64
# TODO: apply security updates in adt-jessie-amd64
adt-run ../apache2_2.4.10-10+deb8u19_amd64.changes \
--- lxc adt-jessie-amd64
---------------------------------------
Full VM environment (isolation-machine)
---------------------------------------
If you really need ``isolation-machine`` (which can break the VM,
reboot it, etc.), or if you'd rather work from your host rather than
within a LTS VM, you'll need to proceed differently.
First, create an autopkgtest VM image:
.. code-block:: bash
RELEASE=bullseye # or jessie, stretch, buster...
sudo autopkgtest-build-qemu --size=25G \
$RELEASE ./autopkgtest-$RELEASE.img
If you have an apt-cacher (note: 127.0.0.1 special-cased and works
within qemu, through 10.0.2.2):
.. code-block:: bash
--apt-proxy=http://127.0.0.1:3142 \
For non-Debian (e.g. ELTS) dists, also pass its mirror and `keyring
`_
(requires autopkgtest >= 5.29, cf. bookworm-backports):
.. code-block:: bash
--keyring=./freexian-archive-extended-lts.gpg \
--mirror=http://deb.freexian.com/extended-lts/ \
Note: this was tested on bookworm and trixie/202502. Sometimes the
resulting image is truncated (< 1MB), try re-running the command.
TODO: these autopkgtest Debian VMs don't have security sources.
Then, run the tests using the ``qemu`` backend (probably from outside
your LTS VM, unless you have support for nested virtualization):
.. code-block:: bash
autopkgtest --shell-fail --apt-upgrade [...] \
-- qemu /path/to/autopkgtest-$RELEASE.img
e.g.:
.. code-block:: bash
cd python2.7/
autopkgtest -sU \
. ../previous-run/binaries/*.deb -o ../out \
-- qemu ../../autopkgtest-buster.img
**Troubleshooting**
As usual, if working from a source directory, clean-up it up first
(especially big files), as autopkgtest will copy it to its VM.
If the VM status becomes *[paused] (io-error)* for no reason, check
if /tmp is filled, especially if it's a tmpfs (default in trixie).
When facing a bug, the maintainers are pretty responsive. In the team,
jochensp and paride among others contributed to the toolchain.
To investigate an issue in the tests, remember the ``-s|--shell-fail``
option, which here will just pause for you to access the VM through
serial and SSH (see setup below), actually available on boot.
Serial access:
.. code-block:: bash
minicom -D unix#/tmp/autopkgtest-qemu.xxx/ttyS0
minicom -D unix#/tmp/autopkgtest-qemu.xxx/ttyS1
minicom -D unix#/tmp/autopkgtest-qemu.xxx/monitor # QEMU monitor
# also try removing -nographics in /usr/share/autopkgtest/lib/autopkgtest_qemu.py
SSH access: autopkgtest redirects port 10022 to local SSH, but you
need it installed through ``autopkgtest-build-qemu --script=...``:
.. code-block:: bash
cat <<'EOF' > ./install-openssh-server.sh
#!/bin/sh
# Executed in the host, remember to use chroot
chroot "$1" apt-get -o "Acquire::http::Proxy=$AUTOPKGTEST_SETUP_APT_PROXY" \
install -y openssh-server < /dev/null
chroot "$1" mkdir -m 700 /root/.ssh/
cp -a /home/you/.ssh/yourkey.pub "$1/root/.ssh/authorized_keys"
EOF
chmod 755 ./install-openssh-server.sh
autopkgtest-build-qemu ... --script=./install-openssh-server.sh
autopkgtest ... -- qemu autopkgtest-$RELEASE.img
ssh -p 10022 -o StrictHostKeyChecking=no root@127.0.0.1
To investigate an issue in a disk image:
.. code-block:: bash
qemu-img convert autopkgtest-$RELEASE.img autopkgtest-$RELEASE.raw
sudo kpartx -av autopkgtest-$RELEASE.raw
sudo mount /dev/mapper/loop0p1 /mnt/inspection/
...
sudo umount /mnt/inspection
sudo kpartx -dv autopkgtest-$RELEASE.raw
If for some reason things don't work, an alternative is the ``ssh``
backend to connect to an existing VM, see also
``/usr/share/autopkgtest/ssh-setup/`` to handle reboot & reset.
Last resort, make a snapshot of your VM and try running with the
``null`` autopkgtest backend.
**mmdebstrap**: starting with trixie, ``mmdebstrap`` provides
``mmdebstrap-autopkgtest-build-qemu`` as an alternative/replacement.
Snippet for SSH setup:
.. code-block:: bash
mmdebstrap-autopkgtest-build-qemu ... -- \
--include=openssh-server \
--customize-hook='mkdir -m700 -p "$1/root/.ssh"' \
--customize-hook="upload /pass/to/key.pub /root/.ssh/authorized_keys"
-----------------
Local APT archive
-----------------
adt-run (jessie) can be confused by e.g. conflicting binary packages
from the same source package, in which case you need to setup a local
APT archive for your packages:
.. code-block:: bash
cd /usr/src/mysourcepackage/
apt-ftparchive packages . > Packages
apt-ftparchive release . > Release
echo 'deb [trusted=yes] file:///usr/src/mysourcepackage ./' >> /etc/apt/sources.list
apt update
Alternatively, for a single machine:
.. code-block:: bash
apt install local-apt-repository
mkdir /srv/local-apt-repository
cp -a *.deb /srv/local-apt-repository/
apt update
-----------
Backporting
-----------
stretch -> jessie:
* *$AUTOPKGTEST_TMP* -> *$ADTTMP*
* *build-essential* (e.g. *gcc*) not installed by default, re-add it if necessary
| Copyright (C) 2021, 2022, 2023, 2024, 2025 Sylvain Beucler