home / skills / pluginagentmarketplace / custom-plugin-game-developer / ci-cd-automation

ci-cd-automation skill

/skills/ci-cd-automation

This skill helps you design and optimize CI/CD pipelines for game development, automating tests, builds, and team workflows across engines.

npx playbooks add skill pluginagentmarketplace/custom-plugin-game-developer --skill ci-cd-automation

Review the files below or copy the command above to add this skill to your agents.

Files (4)
SKILL.md
10.5 KB
---
name: ci-cd-automation
version: "2.0.0"
description: |
  Continuous integration and deployment pipelines, automated testing, build automation,
  and team workflows for game development.
sasmp_version: "1.3.0"
bonded_agent: 06-tools-pipeline
bond_type: PRIMARY_BOND

parameters:
  - name: platform
    type: string
    required: false
    validation:
      enum: [github_actions, gitlab_ci, jenkins, azure_devops]
  - name: engine
    type: string
    required: false
    validation:
      enum: [unity, unreal, godot, custom]

retry_policy:
  enabled: true
  max_attempts: 3
  backoff: exponential

observability:
  log_events: [start, complete, error, deploy]
  metrics: [build_time_seconds, success_rate, cache_hit_rate]
---

# CI/CD Automation

## Pipeline Architecture

```
┌─────────────────────────────────────────────────────────────┐
│                    CI/CD PIPELINE STAGES                     │
├─────────────────────────────────────────────────────────────┤
│  TRIGGER: [Push] [PR] [Tag] [Schedule] [Manual]             │
│                              ↓                               │
│  VALIDATE (< 5 min):                                         │
│  Lint → Compile Check → Asset Validation                    │
│                              ↓                               │
│  TEST (10-30 min):                                           │
│  Unit Tests → Integration → PlayMode Tests                  │
│                              ↓                               │
│  BUILD (Parallel):                                           │
│  [Windows] [Linux] [macOS] [WebGL] [Android] [iOS]         │
│                              ↓                               │
│  DEPLOY:                                                     │
│  [Dev auto] → [Staging gate] → [Prod approval]             │
└─────────────────────────────────────────────────────────────┘
```

## GitHub Actions for Unity

```yaml
# ✅ Production-Ready: Unity CI/CD Pipeline
name: Unity Build Pipeline

on:
  push:
    branches: [main, develop]
  pull_request:
    branches: [main]
  workflow_dispatch:
    inputs:
      buildType:
        description: 'Build type'
        required: true
        default: 'development'
        type: choice
        options:
          - development
          - release

env:
  UNITY_LICENSE: ${{ secrets.UNITY_LICENSE }}

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          lfs: true

      - uses: actions/cache@v3
        with:
          path: Library
          key: Library-${{ hashFiles('Assets/**', 'Packages/**', 'ProjectSettings/**') }}
          restore-keys: Library-

      - uses: game-ci/unity-test-runner@v4
        with:
          testMode: all
          artifactsPath: test-results
          checkName: Test Results

      - uses: actions/upload-artifact@v3
        if: always()
        with:
          name: Test Results
          path: test-results

  build:
    needs: test
    runs-on: ubuntu-latest
    strategy:
      fail-fast: false
      matrix:
        targetPlatform:
          - StandaloneWindows64
          - StandaloneLinux64
          - WebGL
    steps:
      - uses: actions/checkout@v4
        with:
          lfs: true

      - uses: actions/cache@v3
        with:
          path: Library
          key: Library-${{ matrix.targetPlatform }}-${{ hashFiles('Assets/**', 'Packages/**') }}

      - uses: game-ci/unity-builder@v4
        with:
          targetPlatform: ${{ matrix.targetPlatform }}
          versioning: Semantic
          buildMethod: BuildScript.PerformBuild

      - uses: actions/upload-artifact@v3
        with:
          name: Build-${{ matrix.targetPlatform }}
          path: build/${{ matrix.targetPlatform }}
          retention-days: 14

  deploy-staging:
    needs: build
    if: github.ref == 'refs/heads/develop'
    runs-on: ubuntu-latest
    environment: staging
    steps:
      - uses: actions/download-artifact@v3
        with:
          name: Build-WebGL
          path: build/

      - name: Deploy to Staging
        run: |
          # Deploy to staging server
          aws s3 sync build/ s3://game-staging-bucket/
```

## Unreal Engine Pipeline

```yaml
# ✅ Production-Ready: Unreal CI/CD
name: Unreal Build Pipeline

on:
  push:
    branches: [main]

jobs:
  build:
    runs-on: [self-hosted, unreal]
    steps:
      - uses: actions/checkout@v4
        with:
          lfs: true

      - name: Build Development
        run: |
          & "$env:UE_ROOT/Engine/Build/BatchFiles/RunUAT.bat" `
            BuildCookRun `
            -project="${{ github.workspace }}/MyGame.uproject" `
            -platform=Win64 `
            -clientconfig=Development `
            -build -cook -stage -pak -archive `
            -archivedirectory="${{ github.workspace }}/Build"

      - uses: actions/upload-artifact@v3
        with:
          name: UnrealBuild-Win64
          path: Build/
```

## Build Optimization

```
BUILD TIME OPTIMIZATION:
┌─────────────────────────────────────────────────────────────┐
│  STRATEGY              │ TIME SAVINGS │ EFFORT            │
├────────────────────────┼──────────────┼───────────────────┤
│  Library caching       │ 30-50%       │ Low               │
│  Parallel builds       │ 40-60%       │ Low               │
│  Self-hosted runners   │ 20-40%       │ Medium            │
│  Incremental builds    │ 50-80%       │ Medium            │
│  Asset bundles split   │ 30-50%       │ High              │
└─────────────────────────────────────────────────────────────┘
```

## Automated Testing

```csharp
// ✅ Production-Ready: PlayMode Test
[TestFixture]
public class PlayerMovementTests
{
    private GameObject _player;
    private PlayerController _controller;

    [UnitySetUp]
    public IEnumerator SetUp()
    {
        var prefab = Resources.Load<GameObject>("Prefabs/Player");
        _player = Object.Instantiate(prefab);
        _controller = _player.GetComponent<PlayerController>();
        yield return null;
    }

    [UnityTest]
    public IEnumerator Player_MovesForward_WhenInputApplied()
    {
        var startPos = _player.transform.position;

        _controller.SetInput(Vector2.up);
        yield return new WaitForSeconds(0.5f);

        Assert.Greater(_player.transform.position.z, startPos.z);
    }

    [UnityTearDown]
    public IEnumerator TearDown()
    {
        Object.Destroy(_player);
        yield return null;
    }
}
```

## 🔧 Troubleshooting

```
┌─────────────────────────────────────────────────────────────┐
│ PROBLEM: Build times too long (>30 min)                     │
├─────────────────────────────────────────────────────────────┤
│ SOLUTIONS:                                                   │
│ → Enable Library folder caching                             │
│ → Use self-hosted runners with SSDs                         │
│ → Parallelize platform builds                               │
│ → Split large asset bundles                                 │
└─────────────────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────────────────┐
│ PROBLEM: Flaky tests causing failures                       │
├─────────────────────────────────────────────────────────────┤
│ SOLUTIONS:                                                   │
│ → Use test timeouts                                         │
│ → Isolate tests properly                                    │
│ → Add retry logic for network tests                         │
│ → Quarantine unstable tests                                 │
└─────────────────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────────────────┐
│ PROBLEM: Cache not restoring correctly                      │
├─────────────────────────────────────────────────────────────┤
│ SOLUTIONS:                                                   │
│ → Check cache key hash inputs                               │
│ → Verify cache path is correct                              │
│ → Use restore-keys for partial matches                      │
│ → Check cache size limits                                   │
└─────────────────────────────────────────────────────────────┘
```

## Deployment Strategies

| Strategy | Rollback Time | Risk | Best For |
|----------|---------------|------|----------|
| Blue-Green | Instant | Low | Web builds |
| Canary | Minutes | Low | Mobile apps |
| Rolling | Minutes | Medium | Game servers |
| Big Bang | Hours | High | Console releases |

---

**Use this skill**: When setting up build pipelines, automating testing, or improving team workflows.

Overview

This skill automates CI/CD pipelines, build orchestration, and automated testing tailored for game development workflows. It provides engine-specific patterns for Unity and Unreal, plus optimization and deployment strategies to reduce build time and increase release reliability. The focus is practical: faster feedback, repeatable builds, and controlled deployments across platforms.

How this skill works

It defines staged pipelines that validate, test, build in parallel, and deploy to gated environments. The skill supplies GitHub Actions examples for Unity and Unreal, caching and matrix build patterns, playmode/unit test integration, artifact handling, and staging/prod deployment steps. It also recommends build optimization techniques and troubleshooting tactics to stabilize pipelines.

When to use it

  • Setting up CI for a new game project across multiple target platforms
  • Adding automated PlayMode and integration tests to catch regressions early
  • Optimizing slow build times with caching and parallelization
  • Deploying WebGL, desktop, mobile, or server builds to staging and production
  • Creating gated release flows with approvals and environment promotion

Best practices

  • Cache engine-specific Library or intermediate folders to cut rebuild time
  • Use matrix builds to parallelize platform outputs and upload artifacts per target
  • Run linting and quick validation on push; run full tests on PRs or scheduled runs
  • Isolate flaky tests, add timeouts, and retry network-sensitive tests
  • Adopt semantic or automated versioning and artifact retention policies

Example use cases

  • Unity project: GitHub Actions pipeline with library caching, game-ci test runner, parallel builds for Windows/Linux/WebGL, and staged deploy to S3
  • Unreal project: self-hosted runner building via RunUAT, uploading build artifacts for QA
  • Mobile pipeline: matrix build for Android/iOS, artifact signing step, and canary rollout to testers
  • Server builds: rolling deployment strategy for multiplayer servers with incremental builds and health checks
  • Optimization sprint: introduce incremental builds, split asset bundles, and move heavy tasks to self-hosted runners

FAQ

How do I fix slow or inconsistent cache restores?

Ensure cache keys include stable hashes of Assets/Packages/ProjectSettings, verify correct cache paths, and use restore-keys for partial matches. Check cache size limits on the runner provider.

What to do about flaky PlayMode or integration tests?

Isolate stateful tests, add explicit setup/teardown, enforce timeouts, quarantine unstable tests, and add retries for network-dependent cases.