Skip to content

Nexus icon: sash generator for the mod thumbnail #46

Nexus icon: sash generator for the mod thumbnail

Nexus icon: sash generator for the mod thumbnail #46

Workflow file for this run

# 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