Test-Workflows
Diese Anleitung fasst die plattformspezifischen Test-Workflows zusammen, die früher in der Haupt-README.md standen.
Nutzen Sie die plattformübergreifende Matrix im Root-README für einen schnellen Überblick über die unterstützten Plattformen. Die konkreten Befehle finden Sie in den folgenden Abschnitten.
Einheitlicher VM-Workflow
Abschnitt betitelt „Einheitlicher VM-Workflow“Die meisten VM-gestützten Testabläufe folgen vom Repository-Root aus demselben Lebenszyklus:
sailwright build <osname> [--type <type>] [--arch <arch>]sailwright create <osname> [--type <type>] [--arch <arch>]sailwright start <osname> [--type <type>] [--arch <arch>]sailwright provision <osname> [--type <type>] [--arch <arch>] --checksailwright provision <osname> [--type <type>] [--arch <arch>]sailwright stop <osname> [--type <type>] [--arch <arch>]sailwright destroy <osname> [--type <type>] [--arch <arch>]builderstellt oder aktualisiert das wiederverwendbare VM-Artefakt.createerstellt das verwaltete VM-Ziel aus diesem Artefakt.startstartet eine bereits erstellte VM, wenn sie gestoppt ist.provisionführt den Ansible-Workflow gegen das laufende Ziel aus.stopfährt die VM herunter, ohne sie zu löschen.destroyentfernt das verwaltete VM-Ziel.
Je nach Backend startet die VM bereits während create zum ersten Mal, oder es ist noch ein kleiner hostspezifischer Schritt nötig. Sobald eine VM erstellt wurde, verwenden Sie start, um sie erneut zu booten.
Verwenden Sie die list-Subcommands, um zu sehen, was Ihr aktueller Host unterstützt:
sailwright build listsailwright create listsailwright start listsailwright provision listsailwright stop listsailwright destroy listVerwenden Sie --help beim Root-Befehl oder einem beliebigen Subcommand, um unterstützte Flags und Nutzungsdetails einzusehen:
sailwright --helpsailwright create --helpsailwright start --helpsailwright provision --helpOCI-Build-Artefakt-Registry-Workflow
Abschnitt betitelt „OCI-Build-Artefakt-Registry-Workflow“Fertige Build-Artefakte können in eine OCI-Registry gepusht und aus ihr gepullt werden. Die Befehle verwenden dasselbe Zielvokabular wie der VM-Workflow sowie ein Docker-ähnliches Referenz-Argument:
sailwright push listsailwright pull list
sailwright push localhost:5000/sailwright/ubuntu-server-amd64:qemu \ --plain-http \ --os ubuntu \ --type server \ --arch amd64 \ --host-os linux
sailwright pull localhost:5000/sailwright/ubuntu-server-amd64:qemu \ --plain-http \ --os ubuntu \ --type server \ --arch amd64 \ --host-os linuxDer OCI-Client liest standardmäßig Docker-Anmeldedaten, sodass docker login
bei authentifizierten Registries funktioniert. Verwenden Sie --username,
--password-stdin oder --access-token, wenn Sie befehlsspezifische
Anmeldedaten benötigen.
Der Linux-GitHub-Actions-Build-Workflow veröffentlicht fertige Ubuntu-Artefakte
bei Pushes auf main sowie bei manuell von main gestarteten
workflow_dispatch-Läufen in der GitHub Container Registry. Artefakte werden
unter ghcr.io/<owner>/ubuntu-24 mit Tags nach dem Schema
<type>-<arch>-<hostos>-build abgelegt, zum Beispiel:
ghcr.io/csautter/ubuntu-24:server-amd64-linux-buildghcr.io/csautter/ubuntu-24:desktop-arm64-linux-buildWindows-VM-Build-Artefakte werden absichtlich nicht veröffentlicht.
Fügen Sie bei HTTPS-Registries mit einem internen oder selbstsignierten
Zertifikat bevorzugt die Registry-CA mit --ca-file /path/to/ca.pem hinzu.
Für kurzlebige Tests gegen eine Registry, der Sie bereits vertrauen,
deaktiviert --insecure-skip-tls-verify die TLS-Zertifikatsprüfung.
Verwenden Sie --plain-http für eine lokale zot-Registry. Um den
Opt-in-Integrationstest gegen diese Registry auszuführen:
DEV_ALCHEMY_OCI_INTEGRATION_REF=localhost:5000/sailwright/integration:oci \DEV_ALCHEMY_OCI_INTEGRATION_PLAIN_HTTP=true \go test ./pkg/oci -run TestOCIRegistryPushPullIntegration -count=1Das gepushte Artefakt ist ein gewöhnliches OCI-Artefakt und kann daher auch mit ORAS untersucht werden:
oras manifest fetch --plain-http localhost:5000/sailwright/ubuntu-server-amd64:qemuSystemunabhängiger Docker-Workflow
Abschnitt betitelt „Systemunabhängiger Docker-Workflow“Lokales Host-Provisioning
Abschnitt betitelt „Lokales Host-Provisioning“Verwenden Sie den gemeinsamen lokalen Wrapper, wenn Sie das Playbook auf die aktuelle Maschine anwenden möchten, statt auf eine verwaltete VM:
sailwright provision local --checksailwright provision local --proto ssh --checksailwright provision local --playbook ./playbooks/setup.yml --checksailwright provision localPlattform-Standardwerte, die konfigurierte Playbook-Auflösung, erweiterte Flags und das Windows-Cleanup-Verhalten finden Sie unter Lokales Provisioning.
Ubuntu-Rollentests unter Linux, WSL, Windows oder macOS
Abschnitt betitelt „Ubuntu-Rollentests unter Linux, WSL, Windows oder macOS“Verwenden Sie das mitgelieferte Docker-Compose-Setup, um das Ubuntu-fokussierte Ansible-Playbook in einem Container auszuführen:
docker compose -f deployments/docker-compose/ansible/docker-compose.yml upRäumen Sie anschließend wie folgt auf:
docker compose -f deployments/docker-compose/ansible/docker-compose.yml downLinux-Host-Workflows
Abschnitt betitelt „Linux-Host-Workflows“Ubuntu unter Linux mit QEMU/KVM und virt-manager
Abschnitt betitelt „Ubuntu unter Linux mit QEMU/KVM und virt-manager“Installieren Sie zunächst die Host-Abhängigkeiten:
sailwright installsailwright install installiert die libvirt- und QEMU-Host-Pakete, aber bei
einigen Distributionen ist vor dem Start der verwalteten VM noch ein manueller
Host-Schritt erforderlich: Aktivieren Sie das default-Netzwerk von libvirt,
oder gewähren Sie ACL-/Gruppenzugriff auf das System-libvirt-Image-Verzeichnis,
falls der Daemon Gäste als anderer Benutzer ausführt.
Bauen und erstellen Sie die Ubuntu-VM:
arch=amd64 # or arm64type=desktop # or serversailwright build ubuntu --arch "$arch" --type "$type"sailwright create ubuntu --arch "$arch" --type "$type"Standardmäßig verwendet der Linux-Workflow für create/start/stop/destroy die
libvirt-Systemverbindung (qemu:///system), sodass die VM an libvirts
Standard-NAT-Netzwerk angebunden wird und im üblichen Fall ausgehenden
Internetzugang erhält. Verwaltete QCOW2-Disks liegen standardmäßig unter
/var/tmp/dev-alchemy/libvirt/images, wodurch kein vorab angelegtes,
root-eigenes Image-Verzeichnis nötig ist. Sailwright erstellt verwaltete
Image-Verzeichnisse mit dem Modus 0750; falls Ihr System-libvirt-Daemon
Gäste als anderer Benutzer ausführt, gewähren Sie den Zugriff explizit über
einen libvirt-Storage-Pool, Gruppenbesitz/ACLs für
DEV_ALCHEMY_LIBVIRT_IMAGE_DIR, oder verwenden Sie die Session-Verbindung
weiter unten.
Wenn eine VM ein benanntes libvirt-Netzwerk verwendet, prüft Sailwright dieses vorab, bevor die Domain definiert oder gestartet wird. Mit der Standard-System-URI wird dabei Folgendes geprüft:
virsh --connect qemu:///system net-info defaultFalls das default-Netzwerk existiert, aber inaktiv ist, aktivieren Sie es
mit:
sudo virsh --connect qemu:///system net-start defaultsudo virsh --connect qemu:///system net-autostart defaultWenn Sie stattdessen die rootlose libvirt-Benutzer-Session bevorzugen, setzen Sie:
export DEV_ALCHEMY_LIBVIRT_URI=qemu:///session# Optional when you want a custom storage location for the session connection:export DEV_ALCHEMY_LIBVIRT_IMAGE_DIR="$HOME/.local/share/dev-alchemy/libvirt/images"Der eingebaute Session-Pfad verwendet libvirts User-Mode-Networking und
benötigt daher nicht das default-NAT-Netzwerk. Wird später ein benanntes
Netzwerk für eine Session-URI konfiguriert, wird dieselbe Vorabprüfung gegen
qemu:///session ausgeführt.
Wenn Sie stattdessen den traditionellen System-libvirt-Image-Speicherort bevorzugen, setzen Sie:
export DEV_ALCHEMY_LIBVIRT_URI=qemu:///systemexport DEV_ALCHEMY_LIBVIRT_IMAGE_DIR=/var/lib/libvirt/images/dev-alchemyAnschließend können Sie die erstellte VM entweder über virt-manager oder
über die CLI booten:
sailwright start ubuntu --arch "$arch" --type "$type"sailwright provision ubuntu --arch "$arch" --type "$type" --checksailwright provision ubuntu --arch "$arch" --type "$type"sailwright stop ubuntu --arch "$arch" --type "$type"sailwright destroy ubuntu --arch "$arch" --type "$type"Der Provision-Wrapper ermittelt die libvirt-Gast-IP mit virsh domifaddr und
führt ansible-playbook mit einem inline definierten SSH-Inventory-Ziel aus.
Optionale Ubuntu-Provisioning-Overrides können in .env oder der
Prozessumgebung über LIBVIRT_UBUNTU_ANSIBLE_* gesetzt werden:
LIBVIRT_UBUNTU_ANSIBLE_USER=packerLIBVIRT_UBUNTU_ANSIBLE_PASSWORD=P@ssw0rd!LIBVIRT_UBUNTU_ANSIBLE_BECOME_PASSWORD=P@ssw0rd!# Optional (defaults shown):LIBVIRT_UBUNTU_ANSIBLE_CONNECTION=sshLIBVIRT_UBUNTU_ANSIBLE_SSH_COMMON_ARGS=-o StrictHostKeyChecking=no -o ServerAliveInterval=10 -o ServerAliveCountMax=3 -o ControlMaster=no -o ControlPersist=noLIBVIRT_UBUNTU_ANSIBLE_SSH_TIMEOUT=120LIBVIRT_UBUNTU_ANSIBLE_SSH_RETRIES=3Zugehörige Anleitung:
Windows unter Linux mit QEMU/KVM und virt-manager
Abschnitt betitelt „Windows unter Linux mit QEMU/KVM und virt-manager“Installieren Sie zunächst die Host-Abhängigkeiten:
sailwright installBauen und erstellen Sie die Windows-11-VM:
arch=amd64 # or arm64sailwright build windows11 --arch "$arch" --headlesssailwright create windows11 --arch "$arch"Anschließend können Sie die erstellte VM entweder über virt-manager oder
über die CLI booten:
sailwright start windows11 --arch "$arch"Der Lebenszyklus verwendet dieselben libvirt-Standardwerte wie Ubuntu unter
Linux: qemu:///system sowie verwaltete Disks unter
/var/tmp/dev-alchemy/libvirt/images, sofern nicht
DEV_ALCHEMY_LIBVIRT_URI oder DEV_ALCHEMY_LIBVIRT_IMAGE_DIR gesetzt ist.
Falls /dev/kvm nicht verfügbar oder unzuverlässig ist, setzen Sie
DEV_ALCHEMY_QEMU_FORCE_SOFTWARE_EMULATION=1, um die KVM-Erkennung zu
umgehen und die QEMU-TCG-Softwareemulation zu erzwingen.
Setzen Sie die WinRM-Anmeldedaten in der .env im Projekt-Root oder in der
Prozessumgebung:
LIBVIRT_WINDOWS_ANSIBLE_USER=AdministratorLIBVIRT_WINDOWS_ANSIBLE_PASSWORD=your-secure-password# Optional (defaults shown):LIBVIRT_WINDOWS_ANSIBLE_CONNECTION=winrmLIBVIRT_WINDOWS_ANSIBLE_WINRM_TRANSPORT=basicLIBVIRT_WINDOWS_ANSIBLE_PORT=5985Führen Sie das Provisioning vom Repository-Root aus durch:
sailwright provision windows11 --arch "$arch" --checksailwright provision windows11 --arch "$arch"sailwright stop windows11 --arch "$arch"sailwright destroy windows11 --arch "$arch"Der Provision-Wrapper ermittelt die libvirt-Gast-IP mit virsh domifaddr und
führt ansible-playbook mit einem inline definierten WinRM-Inventory-Ziel
aus.
Zugehörige Anleitung:
Windows-Host-Workflows
Abschnitt betitelt „Windows-Host-Workflows“Ubuntu unter Windows mit Hyper-V
Abschnitt betitelt „Ubuntu unter Windows mit Hyper-V“Installieren Sie zunächst die Host-Abhängigkeiten:
sailwright.exe installBauen Sie das Ubuntu-Artefakt:
# serversailwright.exe build ubuntu --type server --arch amd64# desktopsailwright.exe build ubuntu --type desktop --arch amd64Erstellen Sie die VM:
$env:VAGRANT_HYPERV_SWITCH = "Default Switch"sailwright.exe create ubuntu --type server --arch amd64# or desktopsailwright.exe create ubuntu --type desktop --arch amd64Führen Sie das Provisioning durch:
sailwright.exe provision ubuntu --type server --arch amd64 --checksailwright.exe provision ubuntu --type server --arch amd64Der Befehl ermittelt die VM-IP automatisch und führt Ansible über den
Windows/Cygwin-Wrapper aus.
Optionale Ubuntu-Provisioning-Overrides können in .env über
HYPERV_UBUNTU_ANSIBLE_* gesetzt werden.
Zugehörige Anleitungen:
Windows unter Windows mit Docker Desktop
Abschnitt betitelt „Windows unter Windows mit Docker Desktop“Verwenden Sie Docker Desktop mit aktivierten Windows-Containern:
docker compose -f deployments/docker-compose/ansible-windows/docker-compose.yml upRäumen Sie anschließend wie folgt auf:
docker compose -f deployments/docker-compose/ansible-windows/docker-compose.yml downWeitere Details:
Windows unter Windows mit Hyper-V
Abschnitt betitelt „Windows unter Windows mit Hyper-V“Installieren Sie zunächst die Host-Abhängigkeiten:
sailwright.exe installFür den Build benötigen Sie ein Windows-ISO. Sie können eines manuell von Microsoft herunterladen oder Folgendes verwenden:
Build-Details finden Sie hier:
Sobald die VM läuft, führen Sie das Provisioning vom Repository-Root aus durch:
sailwright.exe provision windows11 --arch amd64 --checksailwright.exe provision windows11 --arch amd64Setzen Sie die WinRM-Anmeldedaten in der .env im Projekt-Root oder in der
Prozessumgebung:
HYPERV_WINDOWS_ANSIBLE_USER=AdministratorHYPERV_WINDOWS_ANSIBLE_PASSWORD=your-secure-password# Optional (defaults shown):HYPERV_WINDOWS_ANSIBLE_CONNECTION=winrmHYPERV_WINDOWS_ANSIBLE_WINRM_TRANSPORT=basicHYPERV_WINDOWS_ANSIBLE_PORT=5985Optionale Shell-Pfad-Overrides für den Windows/Cygwin-Wrapper:
$env:CYGWIN_BASH_PATH = "C:\tools\cygwin\bin\bash.exe"# or, if you prefer setting the Cygwin terminal path:$env:CYGWIN_TERMINAL_PATH = "C:\tools\cygwin\bin\mintty.exe"Reihenfolge der Pfadauflösung für das Provisioning:
CYGWIN_BASH_PATHCYGWIN_TERMINAL_PATH, wennCYGWIN_BASH_PATHnicht gesetzt ist- Automatische Erkennung von
C:\tools\cygwin\bin\bash.exe - Automatische Erkennung von
C:\cygwin64\bin\bash.exe
Wenn CYGWIN_TERMINAL_PATH auf mintty.exe verweist, löst das Provisioning
es zur benachbarten bash.exe auf.
macOS-Host-Workflows
Abschnitt betitelt „macOS-Host-Workflows“macOS unter macOS mit Tart
Abschnitt betitelt „macOS unter macOS mit Tart“Verwenden Sie das mitgelieferte Skript:
./scripts/macos/test-ansible-macos.shDas Skript führt das Ansible-Playbook gegen eine temporäre Tart-VM aus. Tart-Projekt:
Standardmäßig verwendet Sailwright die Entwicklungs-Anmeldedaten des
Tart-Images für den Ansible-Zugriff (admin / admin).
Überschreiben Sie diese bei Bedarf in .env:
TART_MACOS_ANSIBLE_USER=adminTART_MACOS_ANSIBLE_PASSWORD=adminTART_MACOS_ANSIBLE_BECOME_PASSWORD verwendet standardmäßig den Wert von
TART_MACOS_ANSIBLE_PASSWORD, wenn nicht gesetzt.
Räumen Sie anschließend wie folgt auf:
tart delete sequoia-baseWindows unter macOS mit UTM
Abschnitt betitelt „Windows unter macOS mit UTM“Installieren Sie zunächst die Host-Abhängigkeiten:
sailwright installBauen und erstellen Sie die Windows-11-VM:
# arm64 requires sudo to create a custom .iso file for automated installation.# sudo rights are evaluated at runtime, so you can run the build command without sudo and it will ask for sudo rights only if needed.arch=arm64 # or amd64# sudo sailwright build windows11 --arch $arch --headlesssailwright build windows11 --arch $arch --headless# `--headless` applies to `build`, not `create`.sailwright create windows11 --arch $archÖffnen Sie UTM und starten Sie die erstellte VM.
Setzen Sie die WinRM-Anmeldedaten in der .env im Projekt-Root oder in der
Prozessumgebung:
UTM_WINDOWS_ANSIBLE_USER=AdministratorUTM_WINDOWS_ANSIBLE_PASSWORD=your-secure-password# Optional (defaults shown):UTM_WINDOWS_ANSIBLE_CONNECTION=winrmUTM_WINDOWS_ANSIBLE_WINRM_TRANSPORT=basicUTM_WINDOWS_ANSIBLE_PORT=5985Führen Sie das Provisioning vom Repository-Root aus durch:
sailwright provision windows11 --arch $arch --checksailwright provision windows11 --arch $archDer Wrapper ermittelt die VM-IP automatisch aus der generierten
UTM-Konfiguration und arp -a und führt anschließend ansible-playbook mit
einem inline definierten Inventory-Ziel aus.
Unter macOS setzt er außerdem automatisch
OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES für den Ansible-Prozess.
Wenn Sie die ermittelte IP manuell prüfen möchten:
bash ./deployments/utm/determine-vm-ip-address.sh --arch $arch --os windows11Zugehörige Anleitung:
Neu gebaute Windows-Images installieren eine dedizierte WinRM-Firewallregel
für TCP 5985 auf allen Netzwerkprofilen, sodass spätere Änderungen an NIC
oder Netzwerkprofil die Erreichbarkeit nicht beeinträchtigen sollten.
Bei älteren Images muss das Netzwerk unter Umständen noch manuell auf
Private umgestellt oder eine entsprechende Firewallregel hinzugefügt
werden.
Ubuntu unter macOS mit UTM
Abschnitt betitelt „Ubuntu unter macOS mit UTM“Installieren Sie zunächst die Host-Abhängigkeiten:
sailwright installBauen und erstellen Sie die Ubuntu-VM:
arch=arm64 # or amd64type=desktop # or serversailwright build ubuntu --arch $arch --type $typesailwright create ubuntu --arch $arch --type $typeÖffnen Sie UTM und starten Sie die erstellte VM.
Setzen Sie die Ubuntu-SSH-Anmeldedaten in der .env im Projekt-Root oder in
der Prozessumgebung:
UTM_UBUNTU_ANSIBLE_USER=packerUTM_UBUNTU_ANSIBLE_PASSWORD=P@ssw0rd!UTM_UBUNTU_ANSIBLE_BECOME_PASSWORD=P@ssw0rd!# Optional (defaults shown):UTM_UBUNTU_ANSIBLE_CONNECTION=sshUTM_UBUNTU_ANSIBLE_SSH_COMMON_ARGS=-o StrictHostKeyChecking=no -o ServerAliveInterval=10 -o ServerAliveCountMax=3 -o ControlMaster=no -o ControlPersist=noUTM_UBUNTU_ANSIBLE_SSH_TIMEOUT=120UTM_UBUNTU_ANSIBLE_SSH_RETRIES=3Führen Sie das Provisioning vom Repository-Root aus durch:
sailwright provision ubuntu --type $type --arch $arch --checksailwright provision ubuntu --type $type --arch $archDer Wrapper ermittelt die VM-IP automatisch aus der generierten
UTM-Konfiguration und arp -a und führt anschließend ansible-playbook mit
einem inline definierten Inventory-Ziel aus.
Unter macOS setzt er außerdem automatisch
OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES für den Ansible-Prozess.
Wenn Sie die ermittelte IP manuell prüfen möchten:
bash ./deployments/utm/determine-vm-ip-address.sh --arch $arch --os "ubuntu-$type"