ci: cache Rust toolchain, registry and build directories

Every Rust job restores the stable toolchain, Cargo registry and its own
target directories from the runner cache. Keys combine the ISO week and
all Cargo.lock files, so dependencies are reused across pushes while
stale build output and old toolchains expire weekly. Release jobs keep
separate entries per plugin.
This commit is contained in:
nvrl committed 2026-11-06 01:43:17 +01:00
1 parent 17c6fe3ab9
commit abd37fd4fe
4 files changed
+89 -10

No files matched your search

+52 -10
View File
@@ -1,27 +1,69 @@
name: Rust plugin toolchain
description: Native checks and optional Windows GNU cross-compilation in Node's Debian container
description: >-
Native checks and optional Windows GNU cross-compilation in Node's Debian
container. Restores the Rust toolchain, Cargo registry, and the caller's
build directories from the runner cache, and saves them after the job.
inputs:
windows:
description: Install the Windows cross compiler
default: "false"
cache-name:
description: Distinguishes build-directory caches of different jobs
required: true
target-paths:
description: Build directories to cache, one per line, relative to the workspace
default: target
runs:
using: composite
steps:
- name: Cache keys
id: keys
shell: bash
run: |
# A new ISO week starts fresh caches, so stale build output cannot grow forever
# and the stable toolchain is refreshed regularly.
echo "week=$(date -u +%G-%V)" >> "$GITHUB_OUTPUT"
- name: Restore Rust toolchain and Cargo registry
uses: https://github.com/actions/cache@v4
with:
path: |
.cargo-ci/bin
.cargo-ci/registry/index
.cargo-ci/registry/cache
.cargo-ci/git/db
.rustup-ci
key: rust-${{ inputs.windows }}-${{ steps.keys.outputs.week }}-${{ hashFiles('Cargo.lock', 'plugins/*/plugin/Cargo.lock', 'tools/editor-check/Cargo.lock') }}
restore-keys: |
rust-${{ inputs.windows }}-${{ steps.keys.outputs.week }}-
- name: Restore build directories
uses: https://github.com/actions/cache@v4
with:
path: ${{ inputs.target-paths }}
# One entry per job, week, and dependency set: compiled dependencies are
# reused, and only this repository's crates rebuild on each push.
key: build-${{ inputs.cache-name }}-${{ steps.keys.outputs.week }}-${{ hashFiles('Cargo.lock', 'plugins/*/plugin/Cargo.lock', 'tools/editor-check/Cargo.lock') }}
restore-keys: |
build-${{ inputs.cache-name }}-${{ steps.keys.outputs.week }}-
- name: Install build prerequisites
shell: bash
run: |
apt-get update
apt-get install -y --no-install-recommends python3 curl ca-certificates pkg-config libgl1-mesa-dev libx11-dev libxcursor-dev libx11-xcb-dev libxcb1-dev libxcb-dri2-0-dev libxcb-icccm4-dev libxkbcommon-x11-dev
if [ "${{ inputs.windows }}" = "true" ]; then
apt-get install -y --no-install-recommends gcc-mingw-w64-x86-64
fi
- name: Install Rust
shell: bash
run: |
curl --proto '=https' --tlsv1.2 -fsSL https://sh.rustup.rs -o /tmp/rustup-init.sh
sh /tmp/rustup-init.sh -y --profile minimal --default-toolchain stable
if [ ! -x "$CARGO_HOME/bin/rustup" ]; then
curl --proto '=https' --tlsv1.2 -fsSL https://sh.rustup.rs -o /tmp/rustup-init.sh
sh /tmp/rustup-init.sh -y --profile minimal --default-toolchain none --no-modify-path
fi
echo "$CARGO_HOME/bin" >> "$GITHUB_PATH"
"$CARGO_HOME/bin/rustup" component add rustfmt clippy
- name: Install Windows target
if: inputs.windows == 'true'
shell: bash
run: |
apt-get install -y --no-install-recommends gcc-mingw-w64-x86-64
rustup target add x86_64-pc-windows-gnu
# No-op when the restored toolchain is already current.
"$CARGO_HOME/bin/rustup" toolchain install stable --profile minimal -c rustfmt -c clippy
"$CARGO_HOME/bin/rustup" default stable
if [ "${{ inputs.windows }}" = "true" ]; then
"$CARGO_HOME/bin/rustup" target add x86_64-pc-windows-gnu
fi
"$CARGO_HOME/bin/rustc" --version
+13
View File
@@ -10,7 +10,10 @@ permissions:
env:
CARGO_HOME: ${{ gitea.workspace }}/.cargo-ci
RUSTUP_HOME: ${{ gitea.workspace }}/.rustup-ci
CARGO_TERM_COLOR: always
# Incremental data is not reused between CI runs; it only inflates the cache.
CARGO_INCREMENTAL: "0"
jobs:
check:
@@ -26,6 +29,11 @@ jobs:
token: ${{ secrets.GITEA_TOKEN }}
persist-credentials: false
- uses: ./.gitea/actions/setup
with:
cache-name: check-${{ matrix.plugin }}
target-paths: |
target
plugins/${{ matrix.plugin }}/plugin/target
- run: python3 -m unittest discover -s scripts/tests -v
- run: python3 scripts/check-plugin.py --plugin "${{ matrix.plugin }}"
@@ -38,6 +46,9 @@ jobs:
token: ${{ secrets.GITEA_TOKEN }}
persist-credentials: false
- uses: ./.gitea/actions/setup
with:
cache-name: previews
target-paths: tools/editor-check/target
- run: |
cargo fmt --all -- --check
cargo fmt --manifest-path tools/editor-check/Cargo.toml -- --check
@@ -65,6 +76,8 @@ jobs:
- uses: ./.gitea/actions/setup
with:
windows: "true"
cache-name: windows-preview
target-paths: target/windows
- run: |
python3 scripts/build-plugin.py --plugin rivet --target x86_64-pc-windows-gnu
python3 scripts/build-plugin.py --plugin patina --target x86_64-pc-windows-gnu
+6
View File
@@ -8,7 +8,9 @@ permissions:
env:
CARGO_HOME: ${{ gitea.workspace }}/.cargo-ci
RUSTUP_HOME: ${{ gitea.workspace }}/.rustup-ci
CARGO_TERM_COLOR: always
CARGO_INCREMENTAL: "0"
RELEASE_REF: ${{ gitea.ref }}
jobs:
@@ -44,6 +46,10 @@ jobs:
- uses: ./.gitea/actions/setup
with:
windows: "true"
# CARGO_TARGET_DIR holds both the native checks and the Windows build.
# Kept apart from branch builds; a release never reuses preview output.
cache-name: release-${{ needs.plan.outputs.plugin }}
target-paths: target/windows
- run: |
python3 -m unittest discover -s scripts/tests -v
python3 scripts/check-plugin.py --plugin "$PLUGIN"
+18
View File
@@ -64,6 +64,24 @@ Node runtime, and a local composite action installs Rust and build dependencies.
Windows binaries are cross-compiled with MinGW; no Windows runner or Linux release
binary is required.
### Build cache
Every Rust job restores two caches through the runner's cache server
(`actions/cache@v4`, run from the setup composite action):
- **Toolchain:** rustup's stable toolchain, Cargo's binaries, and the registry and
git sources, keyed by ISO week, Windows target, and all three `Cargo.lock` files.
- **Build directories:** each job's target directories (check per plugin,
previews, Windows preview, release per plugin), keyed the same way.
A new week or a changed lockfile starts a fresh entry, so stale build output does
not accumulate and the stable toolchain refreshes weekly. Within a week, pushes
reuse compiled dependencies and rebuild only this repository's crates. Release
jobs use their own entries and never reuse branch build output. A cache miss only
costs time. The runner's cache server must be enabled (`cache.enabled` in
`act_runner`'s config, the default) and must support post steps of actions
inside composite actions (current `act_runner` releases do).
The workflows use explicit action URLs and the v3-compatible artifact protocol.
Only the publish job requests `contents: write`. It authenticates against the
same Gitea instance using the automatic `secrets.GITEA_TOKEN`; no personal access