Files
lumbridge-code/.gitea/workflows/ci.yml
T
Metal AgentandClaude Opus 5 ae22f5522b Stop CI from skipping the gates it exists to run
The workflow installed neither cargo-deny nor cargo-nextest, and ci.sh treated
both as optional. A run therefore reported green having never checked the
licence closure that DISTRIBUTION.md depends on, and having run cargo test
where the repository believes it runs nextest. Both tools are installed here
from prebuilt binaries -- compiling cargo-deny on this runner would cost more
than the job it guards -- and both jobs set LUMBRIDGE_CI_STRICT=1, which makes
a missing tool a failure rather than a warning.

The toolchain version was also written here twice while rust-toolchain.toml
declared it a third time. It is now read from that file, because a skew
between the compiler CI uses and the one a developer uses is precisely the
kind of difference that is invisible until it is expensive.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SPYebLiN2w4TqnHUYGdECq
2026-09-01 12:59:57 -07:00

149 lines
6.0 KiB
YAML

name: CI
on:
push:
pull_request:
jobs:
# Everything except the GPUI product. Builds in seconds, gates every push.
rust-headless:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
# The version is read from rust-toolchain.toml rather than written here.
# That file is the single declaration, and naming the version twice lets
# CI and a developer drift onto different compilers without either of
# them noticing -- which is the whole failure this indirection prevents.
- name: Read the pinned toolchain
id: toolchain
run: |
channel="$(sed -n 's/^channel = "\(.*\)"$/\1/p' rust-toolchain.toml)"
test -n "$channel" || { echo "no channel in rust-toolchain.toml" >&2; exit 1; }
echo "channel=$channel" >> "$GITHUB_OUTPUT"
- name: Install the pinned Rust toolchain
uses: dtolnay/rust-toolchain@master
with:
toolchain: ${{ steps.toolchain.outputs.channel }}
components: rustfmt, clippy
- name: Cache cargo
uses: actions/cache@v4
with:
path: |
~/.cargo/registry
~/.cargo/git
target
key: headless-${{ hashFiles('Cargo.lock') }}
# The gates cannot be allowed to skip themselves. Both tools ship prebuilt
# binaries; building cargo-deny from source on this runner would cost more
# than the job it guards. LUMBRIDGE_CI_STRICT below turns a missing tool
# from a warning into a failure, so a silent skip cannot read as green.
- name: Install gate tooling
run: |
set -euo pipefail
mkdir -p "$HOME/.local/bin"
arch="$(uname -m)"
case "$arch" in
x86_64) nextest_arch=x86_64-unknown-linux-gnu; deny_arch=x86_64-unknown-linux-musl ;;
aarch64) nextest_arch=aarch64-unknown-linux-gnu; deny_arch=aarch64-unknown-linux-musl ;;
*) echo "unsupported runner architecture: $arch" >&2; exit 1 ;;
esac
curl -fsSL "https://get.nexte.st/latest/$nextest_arch" | tar zxf - -C "$HOME/.local/bin"
deny_version=0.18.6
curl -fsSL "https://github.com/EmbarkStudios/cargo-deny/releases/download/${deny_version}/cargo-deny-${deny_version}-${deny_arch}.tar.gz" \
| tar zxf - -C "$HOME/.local/bin" --strip-components=1 --wildcards '*/cargo-deny'
echo "$HOME/.local/bin" >> "$GITHUB_PATH"
- name: Headless checks
env:
LUMBRIDGE_CI_STRICT: "1"
run: ./scripts/ci.sh --headless
# The GPUI product. Kept separate because it pulls a window toolkit, several
# hundred extra packages, and a large target directory.
#
# continue-on-error until this runner's disk, memory, and time budget have
# actually been measured against a GPUI build. A job that OOMs on every push
# trains people to ignore CI, which is worse than a job that reports and does
# not block. Remove the flag once it has run green a few times; do not remove
# it by assuming it will.
rust-ui:
runs-on: ubuntu-latest
needs: rust-headless
continue-on-error: true
steps:
- name: Checkout
uses: actions/checkout@v4
# The version is read from rust-toolchain.toml rather than written here.
# That file is the single declaration, and naming the version twice lets
# CI and a developer drift onto different compilers without either of
# them noticing -- which is the whole failure this indirection prevents.
- name: Read the pinned toolchain
id: toolchain
run: |
channel="$(sed -n 's/^channel = "\(.*\)"$/\1/p' rust-toolchain.toml)"
test -n "$channel" || { echo "no channel in rust-toolchain.toml" >&2; exit 1; }
echo "channel=$channel" >> "$GITHUB_OUTPUT"
- name: Install the pinned Rust toolchain
uses: dtolnay/rust-toolchain@master
with:
toolchain: ${{ steps.toolchain.outputs.channel }}
components: rustfmt, clippy
# GPUI's X11 backend links against these. libxkbcommon-x11-dev is the
# package scripts/native-libs.sh works around when it is missing.
- name: Install native dependencies
run: |
sudo apt-get update
sudo apt-get install -y --no-install-recommends \
libxkbcommon-x11-dev libxcb1-dev libwayland-dev \
libasound2-dev libfontconfig1-dev pkg-config
- name: Cache cargo
uses: actions/cache@v4
with:
path: |
~/.cargo/registry
~/.cargo/git
target
key: ui-${{ hashFiles('Cargo.lock') }}
- name: Report disk before build
run: df -h .
# The gates cannot be allowed to skip themselves. Both tools ship prebuilt
# binaries; building cargo-deny from source on this runner would cost more
# than the job it guards. LUMBRIDGE_CI_STRICT below turns a missing tool
# from a warning into a failure, so a silent skip cannot read as green.
- name: Install gate tooling
run: |
set -euo pipefail
mkdir -p "$HOME/.local/bin"
arch="$(uname -m)"
case "$arch" in
x86_64) nextest_arch=x86_64-unknown-linux-gnu; deny_arch=x86_64-unknown-linux-musl ;;
aarch64) nextest_arch=aarch64-unknown-linux-gnu; deny_arch=aarch64-unknown-linux-musl ;;
*) echo "unsupported runner architecture: $arch" >&2; exit 1 ;;
esac
curl -fsSL "https://get.nexte.st/latest/$nextest_arch" | tar zxf - -C "$HOME/.local/bin"
deny_version=0.18.6
curl -fsSL "https://github.com/EmbarkStudios/cargo-deny/releases/download/${deny_version}/cargo-deny-${deny_version}-${deny_arch}.tar.gz" \
| tar zxf - -C "$HOME/.local/bin" --strip-components=1 --wildcards '*/cargo-deny'
echo "$HOME/.local/bin" >> "$GITHUB_PATH"
- name: UI checks
env:
LUMBRIDGE_CI_STRICT: "1"
run: ./scripts/ci.sh --ui
- name: Report disk after build
run: df -h .