Files
Cache/README.md
T
saru c9286e3624 Save atomically and auto-prune the cache store
Write the archive to a .tmp file then rename into place so a concurrent
prune can never delete a half-written archive, and run prune.sh after
every save: keep the 3 newest archives per key-prefix family, expire
anything older than 7 days, hard-cap the store at 2 GB (oldest first,
trumping the keep set), never touch files younger than 1h, and drop
stale run workspaces under ~/.cache/act older than 2 days.
2026-08-14 22:54:43 +08:00

3.1 KiB

Cache Action

A Gitea Action that caches build files as tar.xz archives on the runner filesystem. Simple, fast, no external dependencies.

Inputs

Input Description Required Default
path Single directory to cache No ~/.cache/
key-prefix Prefix for the cache key Yes
key-file File to hash (SHA-256) for the cache key Yes

Outputs

Output Description
cache-hit true if exact key match found, false otherwise

How It Works

  1. Hashes key-file with SHA-256, combines with key-prefix as <prefix>-<hash>
  2. Stores archives at ~/.cache/.cache-store/<key>.tar.xz
  3. Restores by extracting the archive to /, saves by creating one
  4. Saves atomically (write to <key>.tar.xz.tmp, then rename)

Cache Retention

Archives are content-addressed, so old keys are never needed again — the store is pruned automatically on every restore/save (best-effort, safe under concurrent runners):

  • The newest CACHE_KEEP_N (default 3) archives per key-prefix family are always kept, so reverting e.g. Cargo.lock still hits an older key
  • Anything older than CACHE_TTL_DAYS (default 7) outside the keep set is deleted
  • A hard size cap CACHE_CAP_GB (default 2) deletes oldest-first when exceeded
  • Files younger than 1 hour are never touched (in-flight save protection)
  • Stale run workspaces under ~/.cache/act/*/hostexecutor older than CACHE_WORKSPACE_TTL_DAYS (default 2) are removed

Override the defaults per-job via env: (e.g. env: { CACHE_KEEP_N: 5 }).

Usage

This action must be used twice in your workflow:

  1. Before build — restores cache if it exists
  2. After build — saves the cache archive (only on cache miss)

Rust Example

name: Rust Build
on: push

defaults:
  run:
    shell: bash

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      # 1. Restore cache before build
      - uses: Actions/Cache@main
        id: cache
        with:
          key-prefix: 'cargo-registry'
          key-file: 'Cargo.lock'
          path: '~/.cargo/registry'

      - name: Build
        run: cargo build --release

      # 2. Save cache after build
      - uses: Actions/Cache@main
        with:
          key-prefix: 'cargo-registry'
          key-file: 'Cargo.lock'
          path: '~/.cargo/registry'

Skip Steps on Cache Hit

name: Build with Conditional Steps
on: push

defaults:
  run:
    shell: bash

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      # 1. Restore cache
      - uses: Actions/Cache@main
        id: cache
        with:
          key-prefix: 'rust'
          key-file: 'Cargo.lock'
          path: '~/.cargo/registry'

      - name: Fetch dependencies
        if: steps.cache.outputs.cache-hit != 'true'
        run: cargo fetch

      - name: Build
        run: cargo build --release

      # 2. Save cache
      - uses: Actions/Cache@main
        with:
          key-prefix: 'rust'
          key-file: 'Cargo.lock'
          path: '~/.cargo/registry'