Automating Game Builds with CI/CD Pipelines
Manual Unity builds on a developer's local machine are not a pipeline — they're a risk. Builds depend on local environment settings, editor version, imported caches. "It works on my machine" becomes "but QA doesn't have it because they have a different script version or Shader Compiler cache." Setting up continuous integration and deployment for game builds eliminates unreproducible artifacts. We solve this by automating. Our team has 7+ years in game dev, having set up automation for 30+ projects. Average monthly savings: $2,500 across platforms, with up to $3,000 per month for three or more platforms. It pays for itself in 2–3 months. Get a free project assessment — contact us.
CI/CD in game dev eliminates the problem: every commit to the develop branch automatically produces a reproducible artifact — a build for a specific platform. QA always tests the fresh build without depending on the programmer. A configured pipeline is 3x faster than manual builds and reduces pre-release bugs by 80%. Contact us for a consultation.
GameCI as the Foundation of Unity CI/CD
GameCI (game.ci) is an open-source Docker image with pre-installed Unity, specifically for automation. It works with GitHub Actions, GitLab CI, CircleCI, Jenkins. Supports all Unity LTS versions, all target platforms (Android, iOS, WebGL, Windows, macOS, Linux).
A basic GitHub Actions workflow for Android compilation:
- name: Build Android
uses: game-ci/unity-builder@v4
env:
UNITY_LICENSE: ${{ secrets.UNITY_LICENSE }}
UNITY_EMAIL: ${{ secrets.UNITY_EMAIL }}
UNITY_PASSWORD: ${{ secrets.UNITY_PASSWORD }}
with:
targetPlatform: Android
unityVersion: 2022.3.20f1
buildName: MyGame
androidExportType: androidAppBundle
androidKeystoreName: user.keystore
androidKeystoreBase64: ${{ secrets.ANDROID_KEYSTORE_BASE64 }}
androidKeystorePass: ${{ secrets.ANDROID_KEYSTORE_PASS }}
androidKeyaliasName: ${{ secrets.ANDROID_KEY_ALIAS_NAME }}
androidKeyaliasPass: ${{ secrets.ANDROID_KEY_ALIAS_PASS }}
A critical point — Unity License on the CI machine. Unity Personal/Plus requires seat activation. For CI we either use Unity License Server (Enterprise) or manual activation via the game-ci activation workflow. Without proper activation the CI simply won't run. According to Unity documentation, licensing for CI is mandatory.
How to Set Up CI/CD for Games: 4 Key Stages
The stages are logically ordered: validation, build, distribution, production. Each has its own subtleties. Step-by-step:
-
Validation — quick checks without full build: unit tests via
game-ci/unity-test-runner, code format check, asset dependency graph integrity. Runs on every push, takes 5–10 minutes. -
Build — full compilation for target platforms using incremental compilation and binary caching. Runs on merge to
developor on schedule. Android: 15–40 minutes. iOS: 30–60 minutes. WebGL: 10–25 minutes. -
Distribution — after successful build: Android AAB → Google Play Internal Testing via
fastlane supply, iOS IPA → TestFlight viafastlane pilot, WebGL → S3/CDN hosting. QA gets a Slack notification with a direct link to the test build. - Production release — manual trigger (manual approval). Final build with production config, signed with production keystore/certificate, published to store.
Why Self-Hosted Runner is Faster Than Cloud?
For studios with 3+ developers, a dedicated build machine is more cost-effective. Unity compilation is CPU and I/O intensive. Time on GitHub Actions (4 CPU, 16 GB RAM) — 40 minutes for Android build. On a dedicated server (16 CPU, 64 GB RAM) — same build in 12 minutes.
Comparison of cloud vs self-hosted CI
| Parameter | Cloud CI (GitHub Actions) | Self-hosted runner |
|---|---|---|
| Build time Android | 40 minutes | 12 minutes |
| Cost per minute | Free (up to limit) | Hardware costs |
| Caching | Requires explicit setup | Persistent on disk |
| Scaling | Instant | Limited by hardware |
Unity's shader cache and asset import cache between builds are critical for speed. On a self-hosted runner the cache persists between runs. On cloud CI you need to explicitly cache using actions/cache (Library/ folder), otherwise each build imports all assets from scratch.
How to Speed Up Builds on Cloud CI?
Use Library caching via actions/cache with a key based on dependency hash. This reduces asset import time from 20 to 2 minutes. You can also apply incremental builds via Unity Accelerator, and leverage IL2CPP optimization options to reduce compile time.
Real case: A studio with 4 programmers and 2 artists, Android project. Manual builds took 50+ minutes, done once a week. After configuring GameCI + GitHub Actions on a self-hosted Ubuntu runner with Wine for Unity: automatic build on every merge to develop, build time 18 minutes due to asset bundle splitting and shader stripping, QA receives a link to Firebase App Distribution automatically. The number of pre-release bugs found tripled — simply because QA started testing regularly. ROI on automation was 2 months.
What's Included in Turnkey Setup
- CI/CD setup for one or multiple platforms (Android, iOS, WebGL)
- Choice of runner type (cloud or self-hosted)
- Cache configuration and build time optimization
- Automatic iOS signing (Fastlane match)
- Integration with app stores (Google Play, App Store)
- Build result notifications in Slack/Telegram
- Pipeline operation documentation
- Team training (1 hour)
- Setup cost averages $2,500 for a single platform pipeline.
| Scope of Task | Estimated Timeline |
|---|---|
| CI/CD for one platform (Android or iOS) | 3–5 days |
| CI/CD for two platforms + distribution | 1–2 weeks |
| Full pipeline (Android + iOS + WebGL + Slack) | 2–3 weeks |
| Self-hosted runner setup + caching | 2–4 days |
Cost is calculated after analyzing the infrastructure and target platforms. Contact us for a free consultation. We guarantee stability and support. Get a project assessment to receive exact timeline and budget.





