All checks were successful
PR Checks / rust-gates (pull_request) Successful in 7m43s
actions/cache restored the previous target/ through restore-keys and re-saved all of it under every new Cargo.lock hash, so each entry carried every older build and the runner's cache grew without bound. Swatinem/rust-cache strips the crate's own and stale artifacts before saving and saves only on a miss. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01E14m6SuuY6i1vASFeGDBeY
103 lines
4.5 KiB
YAML
103 lines
4.5 KiB
YAML
# Gate every pull request into `main` on the same Rust checks the release runs,
|
|
# so a formatting slip, a lint regression, or a failing test can't reach the
|
|
# deployable branch.
|
|
#
|
|
# Why this exists: release.yml runs only AFTER merge (on push to `main`) and its
|
|
# FIRST Rust step is `cargo fmt --check`. Before this workflow, an unformatted
|
|
# commit merged cleanly and then killed the release job before it could build,
|
|
# tag, or publish anything — the repo had no pull_request workflow at all. These
|
|
# gates are deliberately a mirror of release.yml's, in the same order, so a green
|
|
# PR means the release will get past its gates too.
|
|
#
|
|
# Enforcement (one-time, in the Gitea UI):
|
|
# Repository Settings → Branches → Branch Protection (rule for `main`)
|
|
# • Enable Status Check
|
|
# • Status check patterns: PR Checks / *
|
|
# Note: Gitea only lists a context in its dropdown after it has reported once,
|
|
# so let this workflow run on one PR first. The `PR Checks / *` glob matches
|
|
# without needing the dropdown.
|
|
#
|
|
# Scope note: `edge` is gated as well as `main`. Multi-phase work lands there
|
|
# first, so gating only the `main` hop would run these checks for the first time
|
|
# at the cutover — the one moment a red build is most expensive to discover. This
|
|
# is the same call `RunicGateway/installer` made for the same reason, and it was
|
|
# taken here after a nine-PR Android workstream landed on an ungated `edge` with
|
|
# no CI at all. Adding a branch to the `branches:` list is the whole change.
|
|
#
|
|
# Runner: the same self-hosted `ubuntu-latest` runner release.yml uses. Rust is
|
|
# not assumed to be preinstalled, so the toolchain step bootstraps it the same
|
|
# way release.yml does (minus the MinGW cross-compile deps — PRs build for the
|
|
# host only; the Windows cross-build stays a release-time concern).
|
|
|
|
name: PR Checks
|
|
|
|
on:
|
|
pull_request:
|
|
branches: [main, edge]
|
|
|
|
# A newer push to the same PR cancels the in-flight run.
|
|
concurrency:
|
|
group: pr-checks-${{ github.ref }}
|
|
cancel-in-progress: true
|
|
|
|
env:
|
|
WORKDIR: sidecar
|
|
|
|
jobs:
|
|
rust-gates:
|
|
runs-on: ubuntu-latest
|
|
timeout-minutes: 30
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
|
|
# One job runs all three gates on purpose: installing the toolchain costs
|
|
# far more than the checks themselves, so splitting fmt/clippy/test into
|
|
# parallel jobs would pay that cost three times for no wall-clock win.
|
|
- name: Install Rust toolchain (rustfmt + clippy)
|
|
run: |
|
|
set -euo pipefail
|
|
SUDO=""; [ "$(id -u)" -ne 0 ] && SUDO="sudo"
|
|
$SUDO apt-get update
|
|
$SUDO apt-get install -y --no-install-recommends \
|
|
build-essential curl ca-certificates git
|
|
|
|
if ! command -v cargo >/dev/null 2>&1; then
|
|
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs \
|
|
| sh -s -- -y --profile minimal --default-toolchain stable
|
|
fi
|
|
echo "${HOME}/.cargo/bin" >> "$GITHUB_PATH"
|
|
export PATH="${HOME}/.cargo/bin:${PATH}"
|
|
rustup component add rustfmt clippy
|
|
cargo --version && cargo fmt --version && cargo clippy --version
|
|
|
|
# Dependency builds are reused until a dep actually changes; a cache miss
|
|
# only makes the run slower, never wrong. rust-cache rather than a plain
|
|
# actions/cache of target/: it strips this crate's own artifacts and
|
|
# anything stale before saving, and saves only on a miss. The plain cache
|
|
# restored the previous target/ and re-saved all of it under every new
|
|
# Cargo.lock, so each entry carried every older build and the runner's
|
|
# cache grew without bound.
|
|
- name: Cache cargo registry and dependency builds
|
|
uses: Swatinem/rust-cache@v2
|
|
with:
|
|
workspaces: sidecar -> target
|
|
|
|
# Cheapest gate first — parses only, no compile, so a formatting slip
|
|
# fails in seconds instead of after a full build.
|
|
- name: cargo fmt --check
|
|
working-directory: sidecar
|
|
run: cargo fmt --check
|
|
|
|
# --all-targets covers tests and examples, not just the binary.
|
|
# -D warnings makes a lint a failure; the crate is clean at this bar today,
|
|
# so anything new here is a regression introduced by the PR.
|
|
- name: cargo clippy
|
|
working-directory: sidecar
|
|
run: cargo clippy --locked --all-targets -- -D warnings
|
|
|
|
# --locked matches release.yml: it also proves Cargo.lock is in sync with
|
|
# Cargo.toml, rather than letting the build silently update it.
|
|
- name: cargo test
|
|
working-directory: sidecar
|
|
run: cargo test --locked
|