Fehler: Programm schließen, während der Einrichtungs-Assistent offen war → Zugriff auf geschlossene Datenbank, danach Absturz des Fehler-Handlers. - beenden(): schließt zuerst offene Dialoge/Rückfragen/Rundgang, lässt wartende Abläufe zu Ende laufen und schließt erst dann Datenbank und Fenster; mehrfacher Aufruf unschädlich - Fehler-Handler protokolliert immer, zeigt aber keine Meldung mehr ohne Fenster - Alt+F4 schließt nur das aktive bzw. modale Fenster (nicht mehr das ganze Programm) - Betrag ändern: Ersatz-Dialog, wenn die Zelle nicht sichtbar ist (vorher passierte still nichts) - tests/test_gui.py: Oberflächen-Tests inkl. Schließen bei jedem Dialog, Watchdog gegen Hänger - Build: ein Xvfb für den ganzen Build (Wine bindet sich an das erste DISPLAY), GUI-Tests unter Windows-Python, danach Selbsttest der fertigen .exe (--selbsttest) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
60 lines
2.6 KiB
Bash
Executable File
60 lines
2.6 KiB
Bash
Executable File
#!/usr/bin/env bash
|
||
# Baut die Windows-.exe mit Windows-Python unter Wine (z. B. im Container tobix/pywine:3.12).
|
||
# Ergebnis: dist/Provisionsmanager95.exe und dist/Provisionsmanager95-<version>.zip
|
||
set -euo pipefail
|
||
cd "$(dirname "$0")/.."
|
||
|
||
export WINEDEBUG=-all
|
||
export LANG=C.UTF-8 LC_ALL=C.UTF-8 # sonst kann Wine keine Umlaute in Dateinamen abbilden
|
||
export WINEPREFIX="${WINEPREFIX:-/opt/wineprefix}"
|
||
PY="wine python"
|
||
|
||
# Ein virtueller Bildschirm für den GANZEN Build – vor dem ersten Wine-Aufruf starten!
|
||
# Wine bindet seinen Hintergrundprozess (wineserver/Desktop) an das DISPLAY des ersten Aufrufs.
|
||
# Läuft z. B. „pip install“ ohne Bildschirm und die GUI-Tests später mit, scheitert Tk unter
|
||
# Wine mit „Failed to create the menu window“.
|
||
wineserver -k 2>/dev/null || true
|
||
ANZEIGE=":$((90 + RANDOM % 9))"
|
||
Xvfb "$ANZEIGE" -screen 0 1280x800x24 -nolisten tcp >/dev/null 2>&1 &
|
||
XVFB_PID=$!
|
||
trap 'wineserver -k 2>/dev/null || true; kill $XVFB_PID 2>/dev/null || true' EXIT
|
||
export DISPLAY="$ANZEIGE"
|
||
sleep 1
|
||
|
||
$PY --version
|
||
$PY -m pip install --disable-pip-version-check -q -r requirements-dev.txt
|
||
|
||
echo "== Tests inkl. Oberfläche (Windows-Python unter Wine) =="
|
||
# PROVTOOL_GUI_TESTS=1: fehlt der Bildschirm, ist das ein Fehler (nicht „übersprungen“)
|
||
PROVTOOL_GUI_TESTS=1 $PY -m pytest -q -p no:cacheprovider
|
||
|
||
echo "== Version =="
|
||
VERSION=$($PY build/version_info.py | tr -d '\r')
|
||
echo "Version $VERSION"
|
||
|
||
echo "== PyInstaller =="
|
||
$PY -m PyInstaller --noconfirm --clean --distpath dist --workpath build/tmp build/provisionsmanager.spec
|
||
|
||
test -f dist/Provisionsmanager95.exe
|
||
|
||
echo "== Selbsttest der fertigen .exe =="
|
||
rm -f selbsttest.txt
|
||
set +e
|
||
timeout 300 wine dist/Provisionsmanager95.exe --selbsttest selbsttest.txt
|
||
CODE=$?
|
||
set -e
|
||
cat selbsttest.txt 2>/dev/null || echo "(keine Ergebnisdatei – die .exe ist vermutlich gar nicht gestartet)"
|
||
if [ "$CODE" -ne 0 ] || ! head -1 selbsttest.txt 2>/dev/null | tr -d '\r' | grep -qx OK; then
|
||
echo "Selbsttest der .exe FEHLGESCHLAGEN (Exit-Code $CODE)"
|
||
exit 1
|
||
fi
|
||
echo "Selbsttest bestanden"
|
||
cp README.md dist/LIESMICH.md 2>/dev/null || true
|
||
( cd dist && rm -f Provisionsmanager95-*.zip && \
|
||
python3 -c "import zipfile,sys; z=zipfile.ZipFile(sys.argv[1],'w',zipfile.ZIP_DEFLATED); [z.write(f) for f in sys.argv[2:]]; z.close()" \
|
||
"Provisionsmanager95-${VERSION}.zip" Provisionsmanager95.exe LIESMICH.md 2>/dev/null \
|
||
|| $PY -c "import zipfile,sys; z=zipfile.ZipFile(sys.argv[1],'w',zipfile.ZIP_DEFLATED); [z.write(f) for f in sys.argv[2:]]; z.close()" \
|
||
"Provisionsmanager95-${VERSION}.zip" Provisionsmanager95.exe LIESMICH.md )
|
||
echo "$VERSION" > dist/VERSION
|
||
ls -la dist
|