Updated September 5, 2026

Caching SwiftPM and DerivedData on macOS runners

On an ephemeral runner nothing survives between jobs by design, so caching is the only thing standing between you and a full dependency resolution on every run. On Manzanita, actions/cache works exactly as on GitHub-hosted runners; there is no vendor-specific cache to configure.

The configuration

- uses: actions/cache@v4
  with:
    path: |
      .build
      ~/Library/Developer/Xcode/DerivedData
      ~/Library/Caches/org.swift.swiftpm
    key: ${{ runner.os }}-${{ runner.arch }}-spm-${{ hashFiles('**/Package.resolved') }}
    restore-keys: |
      ${{ runner.os }}-${{ runner.arch }}-spm-

What not to cache

Expect these numbers

Cache restore on a Manzanita runner runs at GitHub's cache-service speed, so a 1–2 GB DerivedData restore is typically 20–40 s. A full resolution and build of a mid-sized SwiftPM app on the 6-vCPU Standard profile is usually 2–5 minutes cold; with a warm cache the same build is often under a minute. Your own numbers are on the Usage page per repository.

Provider-managed cache volumes

Persistent per-organization cache volumes are not yet part of the Manzanita product. When they are, they will be additive; the configuration above will keep working.

Try it on your own workflow. One Standard runner is free for 14 days or 300 build minutes, no card. Change runs-on to manzanita-standard and keep everything else. Start free · Read the docs

Related