GuideBuild infrastructure

Unreal Engine Build Infrastructure: A Practical System Map

Map the source, builder, cache, artifact, and promotion boundaries behind a repeatable Unreal Engine delivery path.

Last reviewed
Version
1.0
  • Unreal Engine
  • CI/CD
  • build engineering

A reliable Unreal build is not one command. It is a chain of contracts: which source revision entered, which toolchain produced it, where reusable cache stops, which artifacts are immutable, and what proves a client and server belong together.

The useful first step is not replacing CI. It is drawing that chain clearly enough that the team can identify where state hides and where recovery depends on one person or machine.

Start with the delivery contract#

Write down the smallest set of inputs needed to reproduce a release candidate:

  • source revision and stream or branch;
  • Unreal Engine revision, including source-build patches;
  • target platform and build configuration;
  • plugin, SDK, compiler, and packaging versions;
  • content inputs and cook settings;
  • build definition revision;
  • compatibility identifier shared by client and server.

If one of those inputs lives only in a builder image, a desktop shortcut, or a person’s memory, the build is not reproducible yet. The goal is not perfect hermeticity. The goal is to make every meaningful dependency declared, versioned, or recoverable.

Map five system boundaries#

Source intake#

Define what event starts work and which revisions are eligible. A release path should not silently build whatever happens to be at the head of a stream. Record the source revision and build-definition revision together.

For Perforce environments, include stream, changelist, workspace policy, and integration state. For Git-hosted supporting services, pin commit SHAs rather than floating branch names.

Builder environment#

Treat builders as replaceable capacity, not treasured machines. The baseline can be an image, provisioning workflow, or configuration contract, but the team needs a tested way to create another worker.

Separate long-lived credentials and licenses from the image. Inject them at runtime with the narrowest scope the build requires. A recovered builder should not depend on copying secrets or directories from the failed machine.

Cache and intermediate state#

Derived Data Cache, compiler cache, and workspace reuse can make builds dramatically faster. They are performance layers, not release evidence.

Document cache keys, ownership, invalidation, locality, capacity limits, and the behavior when cache is empty. A cold-cache build should be slow rather than mysterious. If clearing cache changes correctness, the cache boundary is hiding an undeclared input.

Artifact production#

Publish artifacts to immutable, addressable storage. Store a manifest beside them containing the source revision, build definition, engine/toolchain versions, platform, configuration, checksums, and compatibility identifier.

Do not make a later stage rediscover artifacts by browsing a workspace or choosing the newest filename. Promotion should reference an exact manifest.

Promotion and handoff#

Separate “the build completed” from “this candidate is safe to promote.” Promotion checks should verify expected outputs, checksums, smoke-test evidence, client/server compatibility, and any required content validation.

The same candidate should move through environments. Rebuilding during promotion creates a second unproven artifact.

Design recovery before optimization#

The fastest pipeline is not useful if a failed builder blocks the studio for a day. Prove these recovery paths early:

  1. replace a worker from the documented baseline;
  2. run with an empty workspace and cold cache;
  3. retrieve an older release candidate by manifest;
  4. identify the owner of a failed source integration;
  5. stop promotion when client and server identifiers differ.

These tests expose hidden state while changes are still inexpensive.

Implementation sequence#

  1. Observe one real release. Capture every handoff, wait state, manual command, and recovery decision.
  2. Define the input and artifact manifests. Make source and output identity explicit before changing orchestration.
  3. Prove one clean builder. Reproduce a known build from the declared inputs.
  4. Separate cache from artifacts. Give each a lifecycle, owner, and failure behavior.
  5. Add promotion checks. Verify compatibility and evidence before distribution.
  6. Scale capacity last. Autoscaling multiplies a sound worker contract; it does not repair an ambiguous one.

Practical checklist#

  • A release candidate identifies exact source and build-definition revisions.
  • Engine, compiler, SDK, plugin, and packaging versions are declared.
  • A builder can be replaced without copying state from another worker.
  • Cold-cache behavior is known and correct.
  • Cache invalidation and retention have owners.
  • Release artifacts are immutable and checksummed.
  • Promotion references an artifact manifest rather than a workspace.
  • Client and server compatibility is checked before promotion.
  • Failed integrations and failed builds have explicit owners.
  • The recovery path is exercised, not just documented.

A studio does not need every platform feature on day one. It needs a delivery path whose identity, ownership, and recovery behavior are visible. Build outward from that foundation only when the next bottleneck is real.