| SS14 CI/CD Pipeline: Gitea Actions Build System for wylab-station-14 on Unraid |
|
2025 |
Internal Engineering Notes |
Not applicable — internal project |
1.0 |
CI/CD Infrastructure / Self-Hosted DevOps |
| gitea-actions |
| ci-cd |
| space-station-14 |
| docker |
| unraid |
| act-runner |
| dotnet |
| cache-corruption |
| arm64 |
| x86-64 |
|
| Mixed-architecture runners cause silent cache corruption: arm64 and x86-64 runners share incompatible .NET build cache entries, producing wrong artifacts without build errors. |
| Local file cache outperforms native Gitea remote cache: Gitea's built-in cache server times out under load (ETIMEDOUT on port 39913), while local file cache on the runner host is reliable. |
| Gitea runner DNS resolution fails in container-network mode: runner job containers cannot resolve internal hostnames (git.wylab.me) without host networking or external DNS, causing pipeline non-triggers. |
| OOM kills dominate under parallel dotnet builds: concurrent job capacity must be capped at 2 for dotnet workloads on a 32GB Unraid host to avoid out-of-memory crashes. |
| Pinning builds to a single runner architecture eliminates cross-arch cache corruption entirely. |
|
wylab-station-14 is a fork of space-wizards/space-station-14 (Space Station 14 game server)
run as a Docker container on an Unraid homelab server (UM790 Pro, 32GB RAM). The CI/CD pipeline
is implemented via Gitea Actions on a self-hosted Gitea instance (git.wylab.me) using act-runner.
This ARA documents the engineering decisions, failure modes, and dead ends encountered while
building and stabilizing this pipeline across three runner configurations: an Unraid-hosted
container runner, an external VPS runner (45.137.68.83), and a macOS ARM64 runner via OrbStack.
The most critical finding is silent cache corruption from mixed-architecture runners — arm64
macOS and x86-64 Unraid runners sharing cache entries leads to architecturally incompatible
build artifacts without any explicit build failure. The solution is architecture-tagged cache
keys or strict runner pinning. Secondary findings cover DNS resolution strategies, OOM capacity
limits for dotnet workloads, and remote vs. local cache reliability.
|