Release-Skript mit automatischer Versionierung und Docker-Builds

- scripts/release.py: Version (patch/minor/major) automatisch hochzaehlen, CHANGELOG
  abschliessen, committen, taggen; --build baut alle Pakete in Docker
- docker-build/: Build-Container fuer Windows (Wine + PyInstaller + Inno Setup),
  Linux und Android; Server-Image als docker-save-Archiv
- Versionsanzeige im Desktop-Client und in der Android-App
- Feste Android-Release-Signatur aus secrets/ (nicht im Git)
- Windows-Icon im Repo, damit der Wine-Build ohne Qt-Fenster auskommt

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
duffyduck
2026-10-17 12:45:17 +02:00
co-authored by Claude Opus 5.5
parent 5cbe6376f0
commit af51ef5701
20 changed files with 362 additions and 12 deletions
+3 -2
View File
@@ -17,8 +17,9 @@ ROOT = Path(__file__).resolve().parent
def main():
subprocess.check_call([sys.executable, "-m", "pip", "install", "-r", "requirements.txt", "pyinstaller"], cwd=ROOT)
if platform.system() == "Windows":
if "--no-install" not in sys.argv:
subprocess.check_call([sys.executable, "-m", "pip", "install", "-r", "requirements.txt", "pyinstaller"], cwd=ROOT)
if platform.system() == "Windows" and not (ROOT / "packaging" / "netclip.ico").exists():
make_ico()
subprocess.check_call([sys.executable, "-m", "PyInstaller", "--noconfirm", "--clean", "netclip.spec"], cwd=ROOT)
dist = ROOT / "dist"
+1
View File
@@ -0,0 +1 @@
__version__ = "1.0.0"
+3 -1
View File
@@ -14,13 +14,14 @@ from PySide6.QtCore import QTimer
from PySide6.QtNetwork import QLocalServer, QLocalSocket
from PySide6.QtWidgets import QApplication, QMessageBox, QSystemTrayIcon
from . import autostart, config, connection
from . import __version__, autostart, config, connection
INSTANCE = "netclip-instance"
def parse_args():
p = argparse.ArgumentParser(prog="netclip", description="Netzwerk-Zwischenablage")
p.add_argument("--version", action="version", version=f"NetClip {__version__}")
p.add_argument("--minimized", action="store_true")
p.add_argument("--show", action="store_true")
p.add_argument("--import", dest="import_file")
@@ -68,6 +69,7 @@ def main():
app = QApplication(sys.argv)
app.setApplicationName("NetClip")
app.setApplicationVersion(__version__)
app.setQuitOnLastWindowClosed(False)
# Einzelinstanz: laeuft schon eine, dort ggf. Verlauf öffnen bzw. neu laden und beenden
+4 -4
View File
@@ -9,7 +9,7 @@ from PySide6.QtWidgets import (QApplication, QCheckBox, QDialog, QDialogButtonBo
QMessageBox, QProgressBar, QPushButton, QSpinBox, QStyle, QSystemTrayIcon,
QVBoxLayout, QWidget)
from . import autostart, config, connection
from . import __version__, autostart, config, connection
from .controller import Controller, Entry
KIND_ICON = {"text": QStyle.StandardPixmap.SP_FileDialogDetailedView,
@@ -46,7 +46,7 @@ def app_icon(status: str = "") -> QIcon:
class SettingsDialog(QDialog):
def __init__(self, cfg: config.Config, parent=None):
super().__init__(parent)
self.setWindowTitle("NetClip – Einstellungen")
self.setWindowTitle(f"NetClip {__version__} – Einstellungen")
self.setWindowIcon(app_icon())
self.cfg = dataclasses.replace(cfg)
form = QFormLayout()
@@ -229,7 +229,7 @@ class HistoryWindow(QWidget):
def __init__(self, ctl: Controller):
super().__init__()
self.ctl = ctl
self.setWindowTitle("NetClip – Verlauf")
self.setWindowTitle(f"NetClip {__version__} – Verlauf")
self.setWindowIcon(app_icon())
self.resize(560, 640)
@@ -382,7 +382,7 @@ class Tray(QSystemTrayIcon):
c = self.ctl
status = "pause" if c.paused else ("ok" if c.connected else "off")
self.setIcon(app_icon(status))
self.setToolTip("NetClip – " + {"ok": "verbunden", "off": "getrennt", "pause": "pausiert"}[status])
self.setToolTip(f"NetClip {__version__} – " + {"ok": "verbunden", "off": "getrennt", "pause": "pausiert"}[status])
m = self.menu
m.clear()
for e in c.history[:self.QUICK]:
Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 842 B