Test battery: run test_ammo_caliber.py too #56
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| # Baut S2Tweaker auf GitHub statt auf einem Privatrechner. | |
| # | |
| # Warum es das gibt (04.09.2026): der Nexus-Support konnte die hochgeladene | |
| # Datei nicht freigeben, weil Virenscanner sie als Malware markierten. Teil | |
| # der Antwort darauf ist Nachvollziehbarkeit — jede veroeffentlichte Datei | |
| # soll beweisbar aus DIESEM oeffentlichen Quellcode stammen und nicht aus | |
| # einem Ordner auf einem Laptop. | |
| # | |
| # Seit 1.21.0 (05.09.2026) gibt es keinen PyInstaller mehr: S2Tweaker.exe | |
| # ist die unveraenderte, von der Python Software Foundation signierte | |
| # pythonw.exe der python.org-Installation, und der Python-Code liegt lesbar | |
| # daneben. Die Bau-Anweisung steht NICHT hier, sondern in tools/build_exe.py | |
| # (dasselbe Skript, das build.bat lokal aufruft) — sonst haetten wir zwei | |
| # Kopien, die auseinanderlaufen. Das Skript prueft seinen Ordner selbst | |
| # (Signaturen, Hash-Gleichheit mit pythonw.exe, verbotene Dateien) und | |
| # startet ihn einmal probeweise. Der Schritt "Gegenprobe" unten wiederholt | |
| # die wichtigsten Punkte unabhaengig davon mit Windows-Bordmitteln. | |
| name: build | |
| on: | |
| push: | |
| branches: [main] | |
| tags: ['v*'] | |
| pull_request: | |
| workflow_dispatch: | |
| permissions: | |
| contents: read | |
| jobs: | |
| build: | |
| runs-on: windows-latest | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - uses: actions/setup-python@v5 | |
| with: | |
| python-version: '3.12' | |
| - name: Abhaengigkeiten | |
| run: pip install -r requirements.txt | |
| - name: repak aus dem Quellcode bauen | |
| # Ersetzt das im Repo liegende Binaerteil durch einen frischen Build | |
| # OHNE Download-Funktion (tools/build_repak.py erklaert warum). | |
| # Damit stammt am Ende jede ausgelieferte Datei aus offenem Quellcode. | |
| run: python tools/build_repak.py | |
| - name: Tests ohne Spieldaten | |
| # Die volle Batterie braucht den vanilla/-Ordner mit extrahierten | |
| # GameData. Die duerfen nie ins Repo (GSC-Copyright), also laeuft | |
| # hier nur, was ohne sie auskommt; der Rest vor jedem Release lokal. | |
| run: python tests/run_ci.py | |
| - name: Programmordner bauen (inkl. Gegenprobe und Selbsttest) | |
| run: python tools/build_exe.py | |
| - name: Gegenprobe — signierter Starter, keine Netzmodule | |
| # Unabhaengig vom Bau-Skript, mit Windows-Bordmitteln: der Starter | |
| # muss Byte fuer Byte die pythonw.exe des Runners sein und von der | |
| # Python Software Foundation signiert; jede DLL/PYD muss gueltig | |
| # signiert sein (einzige Ausnahme: das selbst gebaute repak.exe); | |
| # und nichts, was Netz oder TLS kann, darf im Paket liegen. | |
| shell: pwsh | |
| run: | | |
| $dist = "dist/S2Tweaker" | |
| $exe = "$dist/S2Tweaker.exe" | |
| if (-not (Test-Path $exe)) { throw "EXE fehlt: $exe" } | |
| $py = Join-Path $env:pythonLocation "pythonw.exe" | |
| $h1 = (Get-FileHash $exe -Algorithm SHA256).Hash | |
| $h2 = (Get-FileHash $py -Algorithm SHA256).Hash | |
| "S2Tweaker.exe : $h1" | |
| "pythonw.exe : $h2" | |
| if ($h1 -ne $h2) { throw "S2Tweaker.exe ist nicht die unveraenderte pythonw.exe" } | |
| $sig = Get-AuthenticodeSignature $exe | |
| "Signatur : $($sig.Status) / $($sig.SignerCertificate.Subject)" | |
| if ($sig.Status -ne 'Valid' -or $sig.SignerCertificate.Subject -notmatch 'Python Software Foundation') { | |
| throw "Starter nicht gueltig von der Python Software Foundation signiert" | |
| } | |
| $bins = Get-ChildItem $dist -Recurse -Include *.exe,*.dll,*.pyd | |
| $unsigned = @($bins | Where-Object { (Get-AuthenticodeSignature $_.FullName).Status -ne 'Valid' }) | |
| "Binaerdateien : $($bins.Count), davon unsigniert: $($unsigned.Name -join ', ')" | |
| if (@($unsigned | Where-Object { $_.Name -ne 'repak.exe' }).Count -gt 0) { | |
| throw "Unsignierte Binaerdatei ausser repak.exe im Paket" | |
| } | |
| foreach ($bad in '_ssl', '_socket', '_hashlib', 'libssl', 'libcrypto', 'sqlite3', '_multiprocessing') { | |
| if (Get-ChildItem $dist -Recurse -Filter "$bad*") { throw "$bad* im Paket" } | |
| } | |
| if (-not (Test-Path "$dist/_internal/sitecustomize.py")) { throw "Starter-Modul fehlt" } | |
| "Groesse : $((Get-ChildItem $dist -Recurse -File | Measure-Object Length -Sum).Sum) Bytes" | |
| - name: Programmordner als Artefakt | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: S2Tweaker-${{ github.sha }} | |
| path: dist/S2Tweaker/ | |
| if-no-files-found: error |