Spring Sale: 30% off bundles with SPRINGBUNDLE or 15% off individual products with SPRING15 — ends Apr 15

StraySparkStraySpark
ProductsFree AssetsDocsBlogGamesAbout
StraySparkStraySpark

Game Studio & UE5 Tool Developers. Building professional-grade tools for the Unreal Engine community.

Products

  • Complete Toolkit (Bundle)
  • Procedural Placement Tool
  • Cinematic Spline Tool
  • Blueprint Template Library
  • DetailForge
  • UltraWire
  • Unreal MCP Server
  • Blender MCP Server
  • Godot MCP Server

Resources

  • Free Assets
  • Documentation
  • Blog
  • Changelog
  • Roadmap
  • FAQ
  • Contact

Legal

  • Privacy Policy
  • Terms of Service

© 2026 StraySpark. All rights reserved.

Back to Blog
tutorial
StraySparkApril 9, 20265 min read
CI/CD Build Pipelines for UE5: Unreal Horde, GitHub Actions, and Jenkins 
Unreal EngineDevopsCi CdAutomationTeam Workflow

Why CI/CD for Game Development?

Every time someone commits broken code, the entire team stops. Every time a build fails at 11pm before a milestone, someone stays up fixing it. Every time a bug reaches QA that automated tests would have caught, everyone wastes time.

CI/CD (Continuous Integration / Continuous Delivery) prevents these problems by automatically building, testing, and validating every change. When a developer pushes code, the pipeline:

  1. Compiles the project (catches compile errors immediately)
  2. Cooks content (catches broken asset references)
  3. Runs tests (catches logic bugs and regressions)
  4. Packages a build (ready for QA or deployment)
  5. Notifies the team of results

The investment in pipeline setup pays for itself within weeks.

Comparing CI/CD Solutions

Unreal Horde

Epic's purpose-built distributed build system for UE5:

Pros:

  • Designed specifically for UE5 workflows
  • Distributed build execution across multiple machines
  • Native Derived Data Cache (DDC) sharing
  • Understands UE5 asset dependencies
  • Free and open source

Cons:

  • Complex initial setup
  • Requires dedicated build infrastructure
  • Less community documentation than Jenkins
  • Newer, fewer integrations

Best for: Studios with dedicated DevOps resources, large projects needing distributed builds.

Jenkins

The industry-standard CI server:

Pros:

  • Massive plugin ecosystem
  • Extensive documentation and community
  • Flexible pipeline definitions (Jenkinsfile)
  • Well-understood by DevOps engineers
  • Self-hosted with full control

Cons:

  • Not UE5-specific (requires custom configuration)
  • Java-based (resource-heavy server)
  • Plugin management can become complex
  • UI feels dated

Best for: Teams with Jenkins experience, projects needing extensive integration with other tools.

GitHub Actions

Cloud-based CI built into GitHub:

Pros:

  • No infrastructure to manage
  • YAML-based pipeline definitions (in repo)
  • GitHub integration (PR checks, issue linking)
  • Free minutes for open-source projects
  • Self-hosted runner support for UE5

Cons:

  • Requires self-hosted runners (UE5 can't run on GitHub's cloud runners due to licensing and size)
  • Limited build parallelism without enterprise plan
  • Less flexibility than Jenkins for complex workflows

Best for: Small teams already on GitHub, projects that want minimal DevOps overhead.

Setting Up a Basic Pipeline

The Minimum Viable Pipeline

Every UE5 project should have at least this:

On Push to main/develop:
  1. Compile project (Editor + Game target)
  2. Cook content for target platform
  3. Run unit tests
  4. Notify team of results

This catches 80% of integration problems automatically.

Pipeline with Jenkins

// Jenkinsfile
pipeline {
    agent { label 'ue5-build-agent' }

    environment {
        UE_ROOT = 'C:/Program Files/Epic Games/UE_5.7'
        PROJECT = "${WORKSPACE}/YourProject.uproject"
    }

    stages {
        stage('Compile') {
            steps {
                bat """
                    "${UE_ROOT}/Engine/Build/BatchFiles/RunUAT.bat" ^
                    BuildCookRun ^
                    -project="${PROJECT}" ^
                    -noP4 -platform=Win64 ^
                    -clientconfig=Development ^
                    -build -cook -stage -pak ^
                    -compressed
                """
            }
        }

        stage('Test') {
            steps {
                bat """
                    "${UE_ROOT}/Engine/Binaries/Win64/UnrealEditor-Cmd.exe" ^
                    "${PROJECT}" ^
                    -ExecCmds="Automation RunTests Game" ^
                    -NullRHI -unattended -nopause
                """
            }
        }

        stage('Package') {
            when { branch 'main' }
            steps {
                bat """
                    "${UE_ROOT}/Engine/Build/BatchFiles/RunUAT.bat" ^
                    BuildCookRun ^
                    -project="${PROJECT}" ^
                    -noP4 -platform=Win64 ^
                    -clientconfig=Shipping ^
                    -build -cook -stage -pak -archive ^
                    -archivedirectory="${WORKSPACE}/Build"
                """
            }
        }
    }

    post {
        failure {
            slackSend channel: '#builds', message: "Build FAILED: ${env.BUILD_URL}"
        }
        success {
            slackSend channel: '#builds', message: "Build SUCCESS: ${env.BUILD_URL}"
        }
    }
}

Pipeline with GitHub Actions

# .github/workflows/build.yml
name: UE5 Build Pipeline

on:
  push:
    branches: [main, develop]
  pull_request:
    branches: [main]

jobs:
  build:
    runs-on: [self-hosted, ue5]
    timeout-minutes: 120

    steps:
      - uses: actions/checkout@v4
        with:
          lfs: true

      - name: Compile Project
        run: |
          & "$env:UE_ROOT/Engine/Build/BatchFiles/RunUAT.bat" `
            BuildCookRun `
            -project="${{ github.workspace }}/YourProject.uproject" `
            -noP4 -platform=Win64 `
            -clientconfig=Development `
            -build -cook

      - name: Run Tests
        run: |
          & "$env:UE_ROOT/Engine/Binaries/Win64/UnrealEditor-Cmd.exe" `
            "${{ github.workspace }}/YourProject.uproject" `
            -ExecCmds="Automation RunTests Game" `
            -NullRHI -unattended

      - name: Upload Build Artifacts
        if: github.ref == 'refs/heads/main'
        uses: actions/upload-artifact@v4
        with:
          name: game-build-${{ github.sha }}
          path: Build/

Build Agent Setup

Hardware Requirements

UE5 builds are resource-intensive:

ComponentMinimumRecommended
CPU8 cores16+ cores (Ryzen 9 / i9)
RAM32 GB64 GB
Storage500 GB NVMe1 TB NVMe
GPUNone (for -NullRHI)Any (for shader compilation)

A dedicated build machine costs $2,000-4,000 and dramatically improves team productivity.

Shared Derived Data Cache (DDC)

The DDC caches compiled shaders, cooked assets, and other derived data. Sharing it across build agents and developer machines eliminates redundant work:

; DefaultEngine.ini
[DerivedDataBackendGraph]
; Local fast cache
Local=(Type=FileSystem, ReadOnly=false, Clean=false, Flush=false, PurgeTransient=true, DeleteUnused=true, UnusedFileAge=17, FoldersToClean=-1, Path="%ENGINEVERSIONAGNOSTICUSERDIR%DerivedDataCache", EnvPathOverride=UE-LocalDataCachePath)

; Shared network cache
Shared=(Type=FileSystem, ReadOnly=false, Clean=false, Flush=false, DeleteUnused=true, UnusedFileAge=19, FoldersToClean=-1, Path="\\\\BuildServer\\SharedDDC", EnvPathOverride=UE-SharedDataCachePath)

First build populates the cache. Subsequent builds (on any machine) reuse cached results — reducing build times by 50-80%.

Advanced Pipeline Stages

Content Validation

Check for broken references before they reach QA:

# Find assets with missing references
UnrealEditor-Cmd.exe YourProject.uproject -run=ResavePackages -verify -fixupredirects

Shader Compilation

Pre-compile shaders for target platforms:

RunUAT.bat BuildCookRun -project=YourProject.uproject \
    -platform=Win64 -targetplatform=Win64 \
    -DerivedDataCacheFill -DDCGraph=SharedDDC

Steam Upload

Automate Steam builds using SteamCMD:

# After successful build
steamcmd +login $STEAM_USER $STEAM_PASS \
    +run_app_build app_build.vdf \
    +quit

Size Tracking

Track build size over time to catch bloat:

# Record build size
BUILD_SIZE=$(du -sb Build/ | cut -f1)
echo "$BUILD_SIZE" >> build_size_history.csv
# Alert if size increased by more than 10%

Pipeline for Different Team Sizes

Solo Developer

Minimum viable setup:

  • Trigger: Manual or on push to main
  • Stages: Compile → Cook → Basic tests
  • Infrastructure: Your dev machine as build agent (run overnight)
  • Time investment: 2-4 hours to set up

Small Team (2-5)

Standard setup:

  • Trigger: Every push and PR
  • Stages: Compile → Cook → Test → Package
  • Infrastructure: One dedicated build machine + shared DDC
  • Time investment: 1-2 days to set up, periodic maintenance

Mid-Size Team (5-20)

Full pipeline:

  • Trigger: Every commit (compile/test), nightly (full build), weekly (all platforms)
  • Stages: Compile → Content validation → Test suite → Package → Deploy to QA → Steam upload
  • Infrastructure: 2-4 build agents, shared DDC, automated deployment
  • Time investment: 1-2 weeks to set up, dedicated DevOps attention

Common Pipeline Problems

"Works on my machine"

The build agent environment must match developer machines:

  • Same engine version
  • Same Visual Studio / build tools version
  • Same SDK versions (platform SDKs, DirectX)
  • Same environment variables

Use infrastructure-as-code (Docker, Ansible, or documented setup scripts) to keep environments consistent.

Build Times Too Long

Typical UE5 build times:

Project SizeClean BuildIncremental Build
Small (prototype)5-15 min1-3 min
Medium (indie)15-45 min3-10 min
Large (AAA)1-4 hours10-30 min

Optimization:

  • Incremental builds: Only rebuild changed code/content
  • Shared DDC: Eliminate redundant shader/asset compilation
  • Distributed builds: Split compilation across multiple machines (Unreal Horde, IncrediBuild, FASTBuild)
  • Cook only changed content: Use iterative cooking for PR validation

Flaky Tests

Tests that sometimes pass and sometimes fail destroy trust in the pipeline:

  • Identify and quarantine flaky tests immediately
  • Most flaky tests have timing dependencies — use proper async waits instead of sleep
  • Run flaky tests in isolation to diagnose
  • Fix or remove flaky tests — a flaky test is worse than no test

CI/CD isn't just for large studios. Even solo developers benefit from automated builds that catch problems before they become crises. Start simple, expand as needed, and never ship a build that hasn't passed the pipeline.

Tags

Unreal EngineDevopsCi CdAutomationTeam Workflow

Continue Reading

tutorial

World Partition Deep Dive: Streaming, Data Layers, and HLOD for Massive Open Worlds

Read more
tutorial

Motion Matching and Control Rig in UE5: The Future of Character Animation

Read more
tutorial

Getting Started with UE5 PCG Framework: Build Your First Procedural World

Read more
All posts