Windows-Setup (Inno Setup): Installation pro Benutzer, Installer-Test im Build
- PyInstaller baut unter Windows zusätzlich die Ordner-Variante dist/Provisionsmanager/ (schnellerer Start); onefile-.exe und .zip bleiben, Linux unverändert - build/installer.iss: ohne Admin nach %LOCALAPPDATA%\Programs\Provisionsmanager, Startmenü, optional Desktop, deutsch, feste AppId, CloseApplications, Benutzerdaten in %APPDATA%\Provisionsmanager95 bleiben bei Deinstallation erhalten - build_windows.sh: Inno Setup 6.7.3 (SHA256 geprüft) unter Wine installieren, Setup bauen, still installieren, Selbsttest der installierten .exe, still deinstallieren und prüfen - Pipeline: Setup als Artefakt und am Release; README-Abschnitt Installation Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
7b9a2acec0
commit
ec99042569
6 files changed
+130
-17
No files matched your search
+48
-12
@@ -1,6 +1,7 @@
|
||||
#!/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
|
||||
# Ergebnis: dist/Provisionsmanager95.exe, dist/Provisionsmanager95-<version>.zip und
|
||||
# dist/Provisionsmanager-Setup-<version>.exe (Inno Setup, Installation pro Benutzer)
|
||||
set -euo pipefail
|
||||
cd "$(dirname "$0")/.."
|
||||
|
||||
@@ -40,19 +41,24 @@ echo "== PyInstaller =="
|
||||
$PY -m PyInstaller --noconfirm --clean --distpath dist --workpath build/tmp build/provisionsmanager.spec
|
||||
|
||||
test -f dist/Provisionsmanager95.exe
|
||||
test -f dist/Provisionsmanager/Provisionsmanager.exe # Ordner-Variante für das Setup
|
||||
|
||||
selbsttest() { # $1 = zu prüfende .exe
|
||||
rm -f selbsttest.txt
|
||||
set +e
|
||||
timeout 300 wine "$1" --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 von $1 FEHLGESCHLAGEN (Exit-Code $CODE)"
|
||||
exit 1
|
||||
fi
|
||||
echo "Selbsttest bestanden"
|
||||
}
|
||||
|
||||
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"
|
||||
selbsttest dist/Provisionsmanager95.exe
|
||||
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()" \
|
||||
@@ -60,4 +66,34 @@ cp README.md dist/LIESMICH.md 2>/dev/null || true
|
||||
|| $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
|
||||
|
||||
echo "== Setup (Inno Setup) =="
|
||||
INNO_VERSION=6.7.3
|
||||
INNO_SHA256=9c73c3bae7ed48d44112a0f48e66742c00090bdb5bef71d9d3c056c66e97b732
|
||||
INNO_EXE=build/tmp/innosetup-$INNO_VERSION.exe
|
||||
mkdir -p build/tmp
|
||||
curl -fsSL -o "$INNO_EXE" "https://github.com/jrsoftware/issrc/releases/download/is-${INNO_VERSION//./_}/innosetup-$INNO_VERSION.exe"
|
||||
echo "$INNO_SHA256 $INNO_EXE" | sha256sum -c -
|
||||
timeout 300 wine "$INNO_EXE" /VERYSILENT /SUPPRESSMSGBOXES /NORESTART /SP- /CURRENTUSER '/DIR=C:\InnoSetup'
|
||||
rm -f dist/Provisionsmanager-Setup-*.exe
|
||||
timeout 300 wine 'C:\InnoSetup\ISCC.exe' /Q "/DAppVersion=$VERSION" 'build\installer.iss'
|
||||
SETUP="dist/Provisionsmanager-Setup-$VERSION.exe"
|
||||
test -f "$SETUP"
|
||||
|
||||
echo "== Installer-Test (still installieren, Selbsttest, still deinstallieren) =="
|
||||
winordner() { winepath -u "$(wine cmd /c echo "%$1%" | tr -d '\r')"; } # z. B. APPDATA -> /opt/wineprefix/...
|
||||
DATEN="$(winordner APPDATA)/Provisionsmanager95"
|
||||
ZIEL="$(winordner LOCALAPPDATA)/Programs/Provisionsmanager"
|
||||
mkdir -p "$DATEN"
|
||||
echo "Benutzerdaten" > "$DATEN/installer-test.txt"
|
||||
timeout 300 wine "$SETUP" /VERYSILENT /SUPPRESSMSGBOXES /CURRENTUSER /NORESTART
|
||||
test -f "$(winordner APPDATA)/Microsoft/Windows/Start Menu/Programs/Provisions-Manager.lnk"
|
||||
selbsttest "$ZIEL/Provisionsmanager.exe"
|
||||
timeout 300 wine "$ZIEL/unins000.exe" /VERYSILENT /SUPPRESSMSGBOXES /NORESTART
|
||||
# Der Deinstaller arbeitet als Kopie im Temp-Ordner weiter – auf das Ende warten
|
||||
for _ in $(seq 60); do [ -e "$ZIEL" ] || break; sleep 1; done
|
||||
if [ -e "$ZIEL" ]; then echo "Deinstallation FEHLGESCHLAGEN – Programmordner noch da:"; ls -la "$ZIEL"; exit 1; fi
|
||||
if [ ! -f "$DATEN/installer-test.txt" ]; then echo "Deinstallation hat Benutzerdaten gelöscht!"; exit 1; fi
|
||||
rm "$DATEN/installer-test.txt"
|
||||
echo "Installer-Test bestanden"
|
||||
ls -la dist
|
||||
Reference in new issue
Block a user