Some checks failed
Vierziel-Build und Pflichtabnahme / checks (push) Has been cancelled
Vierziel-Build und Pflichtabnahme / build (ghcr.io/rust-cross/cargo-zigbuild@sha256:82af75c41958c2af2787e8bedd912da7678a9438937e223e9d83d006d747b38b, aarch64-apple-darwin) (push) Has been cancelled
Vierziel-Build und Pflichtabnahme / build (ghcr.io/rust-cross/cargo-zigbuild@sha256:82af75c41958c2af2787e8bedd912da7678a9438937e223e9d83d006d747b38b, aarch64-unknown-linux-gnu) (push) Has been cancelled
Vierziel-Build und Pflichtabnahme / build (ghcr.io/rust-cross/cargo-zigbuild@sha256:82af75c41958c2af2787e8bedd912da7678a9438937e223e9d83d006d747b38b, x86_64-unknown-linux-gnu) (push) Has been cancelled
Vierziel-Build und Pflichtabnahme / build (messense/cargo-xwin@sha256:4696dd4e79edf8569fa99c4b06bd99273e0501c7adc983aa61d57945f795bef0, x86_64-pc-windows-msvc) (push) Has been cancelled
Vierziel-Build und Pflichtabnahme / stage (push) Has been cancelled
162 lines
15 KiB
Diff
162 lines
15 KiB
Diff
diff --git a/.gitignore b/.gitignore
|
|
index b7141ea..15c6f97 100644
|
|
--- a/.gitignore
|
|
+++ b/.gitignore
|
|
@@ -1,3 +1,8 @@
|
|
/target
|
|
**/*.rs.bk
|
|
*.pdb
|
|
+/dist
|
|
+/acceptance
|
|
+/artifacts
|
|
+/packages
|
|
+**/__pycache__
|
|
diff --git a/crates/tb-export/src/bin/tb-template.rs b/crates/tb-export/src/bin/tb-template.rs
|
|
index 7776b1a..c1ed101 100644
|
|
--- a/crates/tb-export/src/bin/tb-template.rs
|
|
+++ b/crates/tb-export/src/bin/tb-template.rs
|
|
@@ -1,10 +1,23 @@
|
|
//! Builder-Hilfe: geprüfte Metadaten für eine frisch gebaute Runtime schreiben.
|
|
fn main() -> anyhow::Result<()> {
|
|
- let args: Vec<_> = std::env::args().skip(1).collect();
|
|
+ let mut args: Vec<_> = std::env::args().skip(1).collect();
|
|
+ let inspect = args.first().is_some_and(|s| s == "--inspect");
|
|
+ if inspect {
|
|
+ args.remove(0);
|
|
+ }
|
|
anyhow::ensure!(
|
|
args.len() == 2,
|
|
- "Aufruf: tb-template <tbrt-Pfad> <Target-Triple>"
|
|
+ "Aufruf: tb-template [--inspect] <Executable-Pfad> <Target-Triple>"
|
|
);
|
|
+ if inspect {
|
|
+ let found = tb_export::native_target(&std::fs::read(&args[0])?)?;
|
|
+ anyhow::ensure!(
|
|
+ found == tb_export::Target::parse(&args[1])?,
|
|
+ "Executable hat falsches Ziel"
|
|
+ );
|
|
+ println!("{}", found.triple());
|
|
+ return Ok(());
|
|
+ }
|
|
tb_export::prepare_template(
|
|
std::path::Path::new(&args[0]),
|
|
tb_export::Target::parse(&args[1])?,
|
|
diff --git a/openspec/changes/phase-6-06-gitea-actions-und-releases/design.md b/openspec/changes/phase-6-06-gitea-actions-und-releases/design.md
|
|
index 9ed6dd3..8134698 100644
|
|
--- a/openspec/changes/phase-6-06-gitea-actions-und-releases/design.md
|
|
+++ b/openspec/changes/phase-6-06-gitea-actions-und-releases/design.md
|
|
@@ -12,7 +12,7 @@ Origin ist `https://git.rfc1437.de/hugo/TerminalBasic.git`; die read-only Versio
|
|
|
|
1. `.gitea/workflows/` nutzt den vorhandenen Linux-arm64-Runner für alle vier Build-/Paketziele. Vorhandene Workflowmuster der anderen Origin-Projekte wiederverwenden: cargo-zigbuild für Linux amd64 und macOS arm64, cargo-xwin für Windows amd64/MSVC; Linux arm64 nativ oder mit derselben festgelegten Linux-Zielbaseline. Container/Tools und benötigte SDKs/Sysroots reproduzierbar pinnen; konkrete Rust-/OS-/glibc-Versionen mit TerminalBasic prüfen. Das Runnerlabel `linux-arm64` bei Anbindung bestätigen. Vier native Buildrunner sind nicht erforderlich. `build-runtime.py` erzeugt Vorlagenmetadaten mit dem Hostwerkzeug für das jeweilige Target; fremde Executables werden auf dem Buildhost nicht nativ ausgeführt.
|
|
2. Wiederverwendbare Repository-Skripte erledigen Build, Tests, Paketierung und Prüfung auch lokal. Source-Checkout vom Gitea-Origin, alle zusätzlichen Actions nur über explizite Gitea-URLs und feste Revisionen, soweit überhaupt nötig; keine implizite fremde Action-Auflösung. Rust und benötigte Systemwerkzeuge versioniert bereitstellen. Server-/Runner-Kompatibilität praktisch prüfen, statt lediglich YAML zu validieren.
|
|
-3. Matrixprodukte: `terminalbasic-<version>-windows-amd64.7z`, `terminalbasic-<version>-macos-arm64.tar.gz`, `terminalbasic-<version>-linux-amd64.tar.gz`, `terminalbasic-<version>-linux-arm64.tar.gz`. Windows enthält `tb.exe`/`tbc.exe`/`tbrt.exe`, übrige `tb`/`tbc`/`tbrt`; tbrt ist die native Exportvorlage, dazu deren Metadaten, Lizenz, Kurzinstallation. Archive dürfen keine Buildverzeichnis-/Quellbaumabhängigkeiten haben. Exportierte Anwenderprogramme bleiben normale native Einzelartefakte; die Archivformate betreffen die Distribution.
|
|
+3. Matrixprodukte: `terminalbasic-<version>-windows-amd64.7z`, `terminalbasic-<version>-macos-arm64.tar.gz`, `terminalbasic-<version>-linux-amd64.tar.gz`, `terminalbasic-<version>-linux-arm64.tar.gz`. Windows enthält `tb.exe`/`tbc.exe`/`tbrt.exe`, übrige `tb`/`tbc`/`tbrt`; tbrt ist die native Exportvorlage unter `runtimes/<Target-Triple>/`, dazu deren Metadaten, Lizenz, Kurzinstallation. Das vorhandene CLI-/IDE-Suchschema bleibt erhalten. Archive dürfen keine Buildverzeichnis-/Quellbaumabhängigkeiten haben. Exportierte Anwenderprogramme bleiben normale native Einzelartefakte; die Archivformate betreffen die Distribution.
|
|
4. Der Linux-Buildhost erzeugt/prüft Windows-Archive mit 7-Zip und Unix-Archive mit tar+gzip unter Erhalt der Executable-Bits. Inhalts-/Formatprüfungen laufen dort; tatsächliche Start-/Exportprüfungen verwenden neu entpackte Pakete auf passenden Zielsystemen aus 05, automatisiert oder dokumentiert manuell. Externe Nachweise müssen an Revision und exakte Paketprüfsumme gebunden und vor Freigabe geprüft sein. Ein gemeinsames TBL-Testartefakt wird einmal erzeugt und mit nachgewiesen identischen Bytes auf allen vier Zielsystemen verwendet. Separate BASIC-Verbraucher werden mit den entpackten TB-Tools verknüpft, als TBC ausgeführt und mit tbrt als EXE exportiert. Library-Quellen sind dabei nicht verfügbar. Erzeugung/Linken werden in einer Umgebung ohne erreichbaren C-/Rust-Compiler oder nativen Linker geprüft; Systemhilfen zur EXE-Finalisierung dürfen verfügbar bleiben. Fertige EXEs laufen anschließend ohne externe TBL/TBC oder TB-Installation.
|
|
5. `cargo test --locked --workspace`, Clippy und Formatprüfung zentral auf dem Linux-arm64-Host; zielabhängige Rust-Testprogramme bei Bedarf cross-kompilieren und auf passenden Prüfsystemen ausführen. Native Tests aus 02/03/04 und automatisierbare Plattformtests aus 05 auf ihren tatsächlichen Zielen ausführen. Buildstatus und Ausführungsnachweise getrennt ausweisen; macOS-EXE-Finalisierung mit codesign erfolgt auf macOS. Den fixierten Fremdprogrammbestand ausdrücklich im erforderlichen Abnahmelauf bereitstellen. Compile-/VM-Messungen auf dokumentiertem Referenzrunner statt instabiler Debug-Zeitlimits in allen Jobs.
|
|
6. Gitea-Release erst nach allen Pflichtjobs, zugeordneten echten Zielnachweisen und Vollständigkeits-/Prüfsummenprüfung freigeben. Upload zunächst zu einem als Entwurf erkennbaren Release oder gleichwertigem nicht freigegebenen Staging; anschließend atomare Freigabe im Rahmen der verfügbaren API. PR-Jobs ohne Veröffentlichungsrechte und ohne Release-Secrets; fremder PR-Code darf nicht mit solchen Rechten auf persönlichen Runnern laufen. Zugangswerte werden als Gitea-Secrets konfiguriert, nicht committed. Tests erzeugen keine öffentlichen Testreleases.
|
|
@@ -28,3 +28,20 @@ Origin ist `https://git.rfc1437.de/hugo/TerminalBasic.git`; die read-only Versio
|
|
## Migration Plan
|
|
|
|
Lokale Skripte zuerst lauffähig machen, dann Gitea-Runner und Workflows anbinden. PR-/Push-Lauf ohne Veröffentlichung prüfen; kontrollierter Tag-/Release-Lauf nach erfolgreicher Matrix. Bisherige lokale Cargo-Nutzung erhalten. Rollback über vorheriges vollständiges Release und Rücknahme der Workflowänderung; keine Server-/Runnerinstallation durch bloße Proposal-Erstellung.
|
|
+
|
|
+## Konkretisierung während der Umsetzung
|
|
+
|
|
+- Rust 1.97.1, vorhandene Cross-Images per Digest, 7-Zip 25.01 per SHA-256.
|
|
+ SDK-/CRT-Versionen und ein Hash ihrer exakten Header-/Library-Bytes sind
|
|
+ für Windows fixiert; macOS-SDK/Zig stammen aus dem gepinnten Image.
|
|
+- `tb-template --inspect` nutzt den vorhandenen PE/ELF/Mach-O-Parser auch
|
|
+ für tb/tbc. Build und Paketprüfung laufen auf dem Host ohne fremde Programme
|
|
+ auszuführen. Die Anwenderpakete benötigen tb-template nicht.
|
|
+- Taglauf erzeugt erst nach Build/Grundabnahme einen überprüften Entwurf.
|
|
+ Originalpakete werden auf separaten Systemen geprüft. Ein manueller Workflow
|
|
+ auf main bindet deren Nachweise aus einem Origin-Commit an Tag, Revision und
|
|
+ Paket-SHA-256 und gibt erst dann denselben Entwurf frei; kein erneuter Bau.
|
|
+- Die Benutzerentscheidung aus 05, Windows-Ausführung vorerst offen zu lassen,
|
|
+ bleibt erhalten. Sie macht Windows-Builds zulässig, aber keinen Release mit
|
|
+ fehlender Windows-Abnahme erfolgreich. Fehlende Nachweise werden nicht auf
|
|
+ Basis der gemeinsamen ANSI-Technik von macOS/Linux pauschal abgehakt.
|
|
diff --git a/openspec/changes/phase-6-06-gitea-actions-und-releases/tasks.md b/openspec/changes/phase-6-06-gitea-actions-und-releases/tasks.md
|
|
index 3f1d0c2..a226e36 100644
|
|
--- a/openspec/changes/phase-6-06-gitea-actions-und-releases/tasks.md
|
|
+++ b/openspec/changes/phase-6-06-gitea-actions-und-releases/tasks.md
|
|
@@ -1,19 +1,27 @@
|
|
## 1. Gitea und Runner
|
|
|
|
- [ ] 1.1 Vorhandenen Linux-arm64-Gitea-Runner und tatsächliches Label bestätigen; Cross-Buildumgebungen mit cargo-zigbuild, cargo-xwin und benötigten SDKs/Sysroots reproduzierbar festlegen. Ein Gitea-Prüfjob muss den Buildhost nachweisen; separate echte Prüfsysteme aus 05 zuordnen, ohne vier native Buildrunner vorauszusetzen.
|
|
-- [ ] 1.2 Repositorylokale Build-/Testaufrufe und feste Toolchain-/Systemvoraussetzungen bereitstellen; alle vier Ziele müssen auf Linux arm64 mit --locked baubar sein. Zentrale Workspace-Regressionen und getrennte Aufrufe für echte Zielprüfungen bereitstellen; fremde Executables nicht als nativ auf dem Buildhost getestet ausweisen.
|
|
+- [x] 1.2 Repositorylokale Build-/Testaufrufe und feste Toolchain-/Systemvoraussetzungen bereitstellen; alle vier Ziele müssen auf Linux arm64 mit --locked baubar sein. Zentrale Workspace-Regressionen und getrennte Aufrufe für echte Zielprüfungen bereitstellen; fremde Executables nicht als nativ auf dem Buildhost getestet ausweisen.
|
|
- [ ] 1.3 Push-/PR-Workflow unter .gitea/workflows anbinden; ein tatsächlicher Origin-Lauf muss vier Zielergebnisse und Fehlerstatus liefern, ohne Release-Secrets im PR-Pfad.
|
|
|
|
## 2. Artefakte und Pakete
|
|
|
|
- [ ] 2.1 IDE, CLI und native `tbrt`-Exportvorlage je Ziel in Gitea Actions bauen; Format-/Architektur-/Versionsprüfungen müssen Windows amd64, macOS arm64 und beide Linux-Architekturen eindeutig bestätigen.
|
|
-- [ ] 2.2 Windows-Paket als .7z und macOS-/Linux-Pakete als .tar.gz erzeugen; Archivtests müssen Dateinamen, Paketinhalt, Executable-Rechte und notwendige Begleitdateien prüfen.
|
|
+- [x] 2.2 Windows-Paket als .7z und macOS-/Linux-Pakete als .tar.gz erzeugen; Archivtests müssen Dateinamen, Paketinhalt, Executable-Rechte und notwendige Begleitdateien prüfen.
|
|
- [ ] 2.3 Jedes fertige Paket auf dem tatsächlichen Ziel neu entpacken und die enthaltenen Programme starten; automatisierte oder dokumentiert manuelle Nachweise aus separaten Prüfsystemen an Revision und Paketprüfsumme binden; `tbc link` und EXE-/TBL-Beispiele müssen mit separaten BASIC-Verbrauchern ohne Library-Quellen/Entwicklungscheckout sowie ohne erreichbaren C-/Rust-Compiler oder nativen Linker funktionieren.
|
|
-- [ ] 2.4 Einmal erzeugte TBL-Probe mit identischen Bytes an alle vier Zielprüfungen verteilen sowie Artefaktmanifest und Prüfsummen erzeugen; absichtlich beschädigte oder vertauschte Zielartefakte müssen die Prüfung scheitern lassen.
|
|
+- [x] 2.4 Einmal erzeugte TBL-Probe mit identischen Bytes an alle vier Zielprüfungen verteilen sowie Artefaktmanifest und Prüfsummen erzeugen; absichtlich beschädigte oder vertauschte Zielartefakte müssen die Prüfung scheitern lassen.
|
|
|
|
## 3. Releasepfad
|
|
|
|
- [ ] 3.1 Taggebundenen Gitea-Releasepfad mit vollständiger Pflichtasset-Liste und getrennten Rechten einrichten; fehlgeschlagene/fehlende Zielbuilds oder zugeordnete echte Paket-/Zielprüfungen müssen die Freigabe verhindern.
|
|
-- [ ] 3.2 Upload zunächst als nicht freigegebenen Stand prüfen und erst vollständig freigeben; ein simulierter fehlender Upload darf keinen vollständigen bestehenden Release überschreiben.
|
|
-- [ ] 3.3 Fremdprogramm-, Inventar-, native und automatisierte Plattformnachweise sowie Referenzbenchmarks in den erforderlichen Abnahmelauf integrieren; ignorierte Pflichtfälle müssen als fehlend sichtbar bleiben.
|
|
+- [x] 3.2 Upload zunächst als nicht freigegebenen Stand prüfen und erst vollständig freigeben; ein simulierter fehlender Upload darf keinen vollständigen bestehenden Release überschreiben.
|
|
+- [x] 3.3 Fremdprogramm-, Inventar-, native und automatisierte Plattformnachweise sowie Referenzbenchmarks in den erforderlichen Abnahmelauf integrieren; ignorierte Pflichtfälle müssen als fehlend sichtbar bleiben.
|
|
- [ ] 3.4 Einen tatsächlichen vollständigen Gitea-Lauf mit vier Paketartefakten nachweisen; Run-/Commit-/Buildhost-/Targetdaten und paketprüfsummengebundene entpackte Prüfergebnisse an 07 übergeben, bevor der Change als fertig gilt.
|
|
+
|
|
+Stand 07.09.2026: Repository-Implementierung und lokale Prüfungen vorhanden.
|
|
+Alle vier Ziele wurden in den fixierten Containern auf Linux arm64 gebaut;
|
|
+Linux-arm64- und cross-kompilierte macOS-Pakete bestehen echte entpackte
|
|
+Automatikprüfungen. Das ist noch kein Actions-Lauf. 1.1/1.3/2.1/3.4 bleiben
|
|
+wegen des defekten gemeinsamen Runners offen; 2.3 wegen Windows/Linux-amd64
|
|
+und den restlichen visuellen Zielnachweisen. 3.1 bleibt bis zur Einrichtung
|
|
+des Releasezugangs und tatsächlichen Rechteprüfung offen. Details: verification.md.
|
|
diff --git a/tests/support/library-abnahme.py b/tests/support/library-abnahme.py
|
|
index c596219..003e064 100644
|
|
--- a/tests/support/library-abnahme.py
|
|
+++ b/tests/support/library-abnahme.py
|
|
@@ -63,8 +63,15 @@ def main():
|
|
library = root / 'library.tbl'
|
|
shutil.copyfile(args.library, library)
|
|
template = root / ('runtime' + suffix)
|
|
- shutil.copy2(binaries / ('tbrt' + suffix), template)
|
|
- run([template_tool, template, target], root, env)
|
|
+ runtime = binaries / ('tbrt' + suffix)
|
|
+ if not runtime.is_file():
|
|
+ runtime = binaries / 'runtimes' / target / ('tbrt' + suffix)
|
|
+ shutil.copy2(runtime, template)
|
|
+ metadata = Path(str(runtime) + '.meta')
|
|
+ if metadata.is_file():
|
|
+ shutil.copyfile(metadata, Path(str(template) + '.meta'))
|
|
+ else:
|
|
+ run([template_tool, template, target], root, env)
|
|
source = root / 'consumer.bas'
|
|
source.write_text(SOURCE, encoding='utf-8')
|
|
linked = root / 'consumer.tbc'
|
|
diff --git a/tests/support/native-abnahme.py b/tests/support/native-abnahme.py
|
|
index 78f4c2a..837d868 100644
|
|
--- a/tests/support/native-abnahme.py
|
|
+++ b/tests/support/native-abnahme.py
|
|
@@ -76,13 +76,19 @@ def main():
|
|
suffix = '.exe' if args.target == 'x86_64-pc-windows-msvc' else ''
|
|
tbc = binaries / ('tbc' + suffix)
|
|
rt = binaries / ('tbrt' + suffix)
|
|
+ if not rt.is_file():
|
|
+ rt = binaries / 'runtimes' / args.target / ('tbrt' + suffix)
|
|
prepare = binaries / ('tb-template' + suffix)
|
|
env = dict(os.environ, PATH='') # weder Cargo noch tbc/tbrt über PATH auflösbar
|
|
with tempfile.TemporaryDirectory(prefix='tb-native-') as work:
|
|
root = Path(work)
|
|
template = root / ('runtime' + suffix)
|
|
shutil.copy2(rt, template)
|
|
- must(run([prepare, template, args.target], root))
|
|
+ metadata = Path(str(rt) + '.meta')
|
|
+ if metadata.is_file():
|
|
+ shutil.copyfile(metadata, Path(str(template) + '.meta'))
|
|
+ else:
|
|
+ must(run([prepare, template, args.target], root))
|
|
empty = run([template], root, env=env)
|
|
assert empty.returncode == 1 and b'Nutzlast' in empty.stderr, empty
|
|
cases = {
|