Phase 12.L.E.4 — first Linux lifecycle E2E (E1.u1 download 404)
Summary
First production-flow E2E on the Linux side. Mirrors the J.E.3 Windows scoping discipline: start with simplest Phase A error scenario, surface any production .sh bugs the J.L.E.1 placeholder + parse pin couldn't catch, layer on full lifecycle in J.L.E.5+.
Tier .sh loaded verbatim via LinuxTentacleUpgradeStrategy.BuildScript; real LocalReleaseMirror serving real HTTP; real curl + tar on agent side. Only upstream GitHub Releases CDN replaced. Phase A only — Phase B (systemd-run + systemctl restart) lands in J.L.E.5.
New infrastructure
| Artifact | Role |
|---|---|
LocalReleaseMirror (copied from Windows project verbatim) |
Same wire shape (zip / tar.gz / .sha256). Intentional copy with explicit drift-acceptance note — refactor to shared library if meaningful divergence appears |
LinuxLifecycleContext |
IDisposable: fixture + mirror + state-dir override + cleanup. GUID-suffixed isolation. Tarball-only method render (skips apt/yum host-config sensitivity). 5min bash timeout matching production. |
New test (1)
E1u1_DownloadVersionNotFound_ExitsSixAndWritesFailedStatusWithDownloadDetail
| Step | Assertion |
|---|---|
| Mirror returns 404 for target version | (setup) |
.sh exits 6 |
Documented per .sh header: "target tarball URL not reachable" |
last-upgrade.json written with Status=FAILED
|
Operator UI visibility |
| Detail contains "not reachable" | Operator-actionable failure mode |
| Mirror got the HEAD probe | Proves .sh reached the network (vs failing earlier in Phase A) |
Each assertion has a customMessage explaining DIFFERENT possible exit codes (2 / 14) so a regression's error points at the right diagnosis.
Workflow filter updated
Default now includes Category=LinuxTentacleUpgradeLifecycleE2E.
Local verification (macOS)
6/6 tests pass: 3 cross-platform script tests run, 3 Linux-only tests skip-guard via IsAvailable=false. Linux runner verification on this PR's auto-trigger.
Expected Linux runner outcomes
This is the first time a real .sh upgrade flow runs on a real Linux runner end-to-end. May surface bugs analogous to J.E.3.1's 3 Windows P0s (placeholder-in-comment, Get-FileHash auto-loader, etc.). The detailed customMessage diagnostics + audit trail will point directly at the failing layer.
Next (J.L.E.5)
- SHA mismatch test (E12.u1-Linux analog)
- Linux full lifecycle (E1.h-Linux): needs LinuxServiceFixture-installed unit + Phase B handoff via systemd-run --scope. Larger work, own PR.