Plan Linux-hosted Windows release artifacts
This commit is contained in:
@@ -84,6 +84,43 @@ lightweight `v0.1.0` tag at `5fe3cd6` on 2026-08-03: the tag build and promotion
|
|||||||
the Gitea release carries the archive, archive checksum, build metadata, payload ledger, and smoke log. The Linux
|
the Gitea release carries the archive, archive checksum, build metadata, payload ledger, and smoke log. The Linux
|
||||||
CI/CD path is therefore accepted end to end.
|
CI/CD path is therefore accepted end to end.
|
||||||
|
|
||||||
|
## Planned Windows x64 CI/CD artifact
|
||||||
|
|
||||||
|
The Windows artifact will be cross-built on the existing Linux runner; neither a Windows runner nor Wine is part
|
||||||
|
of its build contract. The .NET SDK publishes `win-x64`, the Linux Godot editor exports through the pinned Windows
|
||||||
|
x86-64 template, and MinGW-w64 compiles the one project-owned native component. The pinned BtbN Windows FFmpeg
|
||||||
|
SDK already carries the required headers, runtime DLLs, and MinGW `.dll.a` import libraries. The conditional
|
||||||
|
`Age.Engine.Text.Windows` project contains managed P/Invoke declarations and therefore compiles on Linux without
|
||||||
|
loading GDI. Wine would add only an execution test, which is explicitly outside the requested CI gate.
|
||||||
|
|
||||||
|
The Windows build command will mirror the accepted Linux entry point while keeping target checks separate. It
|
||||||
|
will regenerate opcode metadata, selectively install the Windows template from the existing pinned Godot TPZ,
|
||||||
|
bootstrap/hash-check the pinned Windows FFmpeg SDK, cross-build and inspect `age_movie_ffmpeg.dll`, perform an
|
||||||
|
exact self-contained `ExportRelease/win-x64` publish, and run the real Godot Windows export. The low-memory publish
|
||||||
|
proxy will become target-parameterized rather than duplicating its fail-closed project/configuration/RID/output
|
||||||
|
checks. The accepted Linux path must remain byte- and behavior-compatible throughout this extension.
|
||||||
|
|
||||||
|
CI acceptance is structural because the produced executable will not run on the Linux host. The verifier must
|
||||||
|
require the Windows executable/PCK/self-contained managed directory, `Age.Engine.Text.Windows.dll`, the project
|
||||||
|
shim, all five pinned FFmpeg DLLs, and the FFmpeg license; reject Linux shared objects and incomplete/cross-target
|
||||||
|
payloads; and inspect every project-owned PE image as AMD64. The portable ZIP will carry the project license,
|
||||||
|
third-party notices, clean source/dependency metadata, and a complete payload checksum ledger. A manual packaged
|
||||||
|
`--package-smoke` command remains available for real-Windows acceptance, but its result is not fabricated or
|
||||||
|
reported as a hosted CI gate.
|
||||||
|
|
||||||
|
Develop, manual, and tag events will run independent Linux and Windows build jobs, each with read-only repository
|
||||||
|
permission and its own manifest-keyed cache/workflow artifact. Tag promotion will require both jobs, download
|
||||||
|
both already-built archives, verify their commit/build evidence, and publish two distributable release assets:
|
||||||
|
`OpenMaidEngine-Himegari-linux-x64.tar.gz` and `OpenMaidEngine-Himegari-windows-x64.zip`. A third small
|
||||||
|
`RELEASE-SHA256SUMS` attachment will authenticate both archives while keeping the release below Gitea's observed
|
||||||
|
five-attachment boundary; detailed build metadata, payload ledgers, and logs remain inside each archive and in
|
||||||
|
the retained workflow artifacts. The release notes will state that Linux received the dynamic package smoke and
|
||||||
|
Windows received structural cross-target verification only.
|
||||||
|
|
||||||
|
Code signing, an installer, Windows-on-Linux execution, and retroactively modifying the accepted Linux-only
|
||||||
|
`v0.1.0` release are outside this effort. A future signing slice can use `osslsigncode` and protected credentials
|
||||||
|
without changing how the unsigned portable ZIP is assembled.
|
||||||
|
|
||||||
## Dependency inventory
|
## Dependency inventory
|
||||||
|
|
||||||
| Area | Current dependency | Runtime impact | Portability status / future action |
|
| Area | Current dependency | Runtime impact | Portability status / future action |
|
||||||
|
|||||||
@@ -1031,6 +1031,36 @@ do not mix mechanical moves with semantic changes.
|
|||||||
and the resulting Gitea release exposes all five expected archive/evidence attachments. This accepts the Linux
|
and the resulting Gitea release exposes all five expected archive/evidence attachments. This accepts the Linux
|
||||||
CI/CD path end to end; future version tags use the same build-once/promote-on-success route.
|
CI/CD path end to end; future version tags use the same build-once/promote-on-success route.
|
||||||
|
|
||||||
|
**Planned Linux-hosted Windows release artifact (2026-08-03):** extend the accepted pipeline without a
|
||||||
|
Windows runner or Wine. The technical target and verification boundary live in `docs/platform-portability.md`.
|
||||||
|
The bounded execution order is:
|
||||||
|
|
||||||
|
1. **MinGW native foundation.** Add Linux-hosted bootstrap/build scripts over the existing pinned Windows
|
||||||
|
FFmpeg manifest and its `.dll.a` import libraries. Produce an AMD64 `age_movie_ffmpeg.dll`, copy the exact
|
||||||
|
five runtime DLLs/license, and verify PE architecture, exported ABI entry points, and FFmpeg imports. Keep
|
||||||
|
the existing MSVC path as the independent Windows-local builder.
|
||||||
|
2. **Cross-export and package contract.** Add the Windows x86-64 Godot preset and selectively pinned template;
|
||||||
|
parameterize the low-memory publish proxy for `win-x64`; generalize package smoke so the downloaded ZIP can
|
||||||
|
be tested manually on Windows; and add one Linux-hosted `build-windows-x64.sh` entry point. A new Windows
|
||||||
|
verifier/packager will reject Linux or incomplete payloads and emit a normalized, licensed, checksummed
|
||||||
|
`OpenMaidEngine-Himegari-windows-x64.zip`. Synthetic package/proxy regressions and a local WSL cross-export
|
||||||
|
are the slice gate; executing the `.exe` is not.
|
||||||
|
3. **Hosted Windows artifact job.** Add a read-only Windows-target job beside the existing Linux job on the
|
||||||
|
same `ubuntu-latest` runner. Provision/report MinGW, cache only hash-verified Godot/FFmpeg inputs, call the
|
||||||
|
accepted Windows build command, and retain the ZIP plus structural verification/build evidence. A develop
|
||||||
|
run must leave tag promotion skipped and keep the existing Linux job green.
|
||||||
|
4. **Dual-platform tag promotion.** Require both build jobs before promotion, download rather than rebuild
|
||||||
|
their outputs, refactor the release helper around two platform archives, and publish those two distributable
|
||||||
|
assets plus one combined archive-checksum attachment. Preserve job-local release authority, retry-safe
|
||||||
|
missing-asset completion, collision refusal, and the existing Gitea attachment ceiling. No version tag is
|
||||||
|
created until the user explicitly selects one after the hosted develop proof.
|
||||||
|
|
||||||
|
**Completion gate:** one deliberately selected future tag produces a single Gitea release containing the
|
||||||
|
Linux `.tar.gz`, Windows `.zip`, and combined archive checksums; both archives bind to the tag commit, Linux
|
||||||
|
retains its dynamic packaged smoke, Windows passes all structural PE/payload gates, and neither platform job
|
||||||
|
receives release-write permission. Signing, installers, Wine, Windows runners, and mutation of `v0.1.0` remain
|
||||||
|
out of scope.
|
||||||
|
|
||||||
**Not cleanup targets:** generated `build/` output, the two intentional solution files, historical
|
**Not cleanup targets:** generated `build/` output, the two intentional solution files, historical
|
||||||
`docs/superpowers/` plans/specifications, and fidelity-specific complexity that is directly covered by the
|
`docs/superpowers/` plans/specifications, and fidelity-specific complexity that is directly covered by the
|
||||||
native ABI. Reorganization is successful when ownership and reproduction become clearer, not when the raw
|
native ABI. Reorganization is successful when ownership and reproduction become clearer, not when the raw
|
||||||
|
|||||||
Reference in New Issue
Block a user