Skip to content

add debian release tests in CI - #731

Open
Marketen wants to merge 10 commits into
masterfrom
marc/debian-release-tests
Open

add debian release tests in CI#731
Marketen wants to merge 10 commits into
masterfrom
marc/debian-release-tests

Conversation

@Marketen

@Marketen Marketen commented Aug 20, 2026

Copy link
Copy Markdown
Contributor

Add standalone Debian and Ubuntu QEMU workflows that perform complete unattended installations.

The unattended USB E2E tests follow this flow:

  1. Build the Debian or Ubuntu ISO with UNATTENDED=true.
  2. Boot the exact ISO in QEMU as read-only UEFI USB media with a blank target disk.
  3. Complete the unattended OS installation using the ISO’s real bootloader and configuration.
  4. Remove the virtual USB and boot the installed system.
  5. Wait for DAppNode’s first-boot self-test, then perform the required second reboot.
  6. Verify the OS version, repositories, packages, Docker, installation logs, and running Dappmanager container.

@Marketen
Marketen requested a review from a team as a code owner August 20, 2026 08:41
Comment thread .github/workflows/debian-iso-e2e.yml Fixed
Comment thread .github/workflows/ubuntu-iso-e2e.yml Fixed
Marketen and others added 7 commits August 20, 2026 11:11
This PR should be scoped to the e2e test workflows. The grub-installer/bootdev
override added in f0718d0 is a change to the shipped Debian installer, and it is
very likely a no-op for the test it was added for: the e2e harness is UEFI-only,
where GRUB installs to the ESP and bootdev is the BIOS/i386-pc question.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The preseed sets grub-installer/bootdev to "default", which also marks the
question as seen. grub-installer then takes this path:

    db_fget grub-installer/bootdev seen
    if [ "$RET" = true ] && db_get grub-installer/bootdev && [ "$RET" ]; then
            if [ "$RET" = "default" ]; then
                    bootdev=$default_bootdev

$default_bootdev is the first grub-mkdevicemap entry -- (hd0), the installer
USB itself. The safeguard against installing onto the installation media only
runs in the *:grub-pc branch, so nothing protects a UEFI install.

The EFI install still succeeds, because grub-install writes to the ESP on the
real disk, but the step then exits 1 reading the ISO9660 partition table:

    grub-installer: info: Installing grub on '/dev/sda'
    grub-installer: info: grub-install ran successfully
    main-menu: (process:10646): Can't read partition table from /dev/sda
    main-menu: WARNING **: Configuring 'grub-installer' failed with error code 1

Reuse the non-USB disk list already computed for partman. Verified by a local
QEMU UEFI USB install of the Debian 13.5.0 unattended ISO, which now completes
the installer in ~4 minutes instead of stalling on the failure dialog.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
A failed run only tailed the serial logs, which hold three lines of EFI stub
output because d-i draws its UI on VT1 and streams its syslog to VT4, and the
first-boot test runs on a virtual terminal via openvt. Both real failures found
so far were invisible in the artifacts.

Screendump every console instead, and dump the guest's install logs, docker
state and connectivity over SSH, which is always up by the time a first-boot
wait times out.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The connectivity check was ping-only, so any network that filters ICMP failed
it. error_exit then blocks on `read` forever, .firstboot is never removed, and
the machine sits on "Check installation source. Press enter to continue".

That is not just CI: corporate, hotel and cloud networks filter ICMP too, and a
real DAppNode behind one dies the same way on its first boot. GitHub runners hit
it because Azure drops ICMP egress -- the ping_group_range sysctl in the e2e
workflows lets QEMU open the socket but cannot make the echo come back.

Fall back to an HTTPS probe, then to a bare TCP connect for the case where
neither curl nor wget is installed yet.

Verified on a local QEMU UEFI USB install of the Ubuntu 24.04.3 unattended ISO
with `iptables -A OUTPUT -p icmp --icmp-type echo-request -j DROP` applied in
the guest before the test ran: ping fails, the check passes, and the run
completes instead of stalling for the full 30 minute timeout.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants