Files

92 lines
3.3 KiB
YAML
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
name: CI
on:
push:
branches: [main]
pull_request:
branches: [main]
# 同一 PR 的新推送取消上一轮未完成的 run:一轮 CI 数十分钟,过期 run 继续跑纯浪费
# runner 分钟,且其状态已无意义。main 分支的推送不取消,保留每个提交的完整记录。
concurrency:
group: ci-${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: ${{ github.event_name == 'pull_request' }}
# 最小权限:CI 只读仓库内容,不需要写 token。
permissions:
contents: read
env:
CARGO_TERM_COLOR: always
# sccache 走 GitHub Actions 缓存后端:编译产物跨 run 复用。本地磁盘缓存无后端、
# 每个 job 用完即弃,跨 run 零命中,等于白装。须在 sccache 服务启动前设置。
SCCACHE_GHA_ENABLED: "true"
# job 拓扑:fmt / clippy / build 三者并行独立;test 依赖 build(needs),在 build
# 编译完成后启动。build 先编译 workspace 依赖,并把每个编译单元写进 sccache
# (GitHub Actions 缓存后端);test 各分区随后经 sccache 命中这些已编产物,只需
# 补编自己的 test harness,不重编整个 workspace。各 job 单独状态,一个挂了不阻塞
# 无关者,GitHub 界面一眼看出哪个红。
#
# sccache 与 mold:.cargo/config.toml 全局引用 rustc-wrapper=sccache,凡跑 rustc
# 的 job(clippy/build/test)都要经 setup-tools 装好 sccache,否则构建直接失败;
# mold 由 setup-tools 从工作副本剥掉,CI 链接统一走默认 ld。fmt 只跑 rustfmt、
# 不跑 rustc,无需 setup-tools。
jobs:
fmt:
name: Format
runs-on: ubuntu-latest
timeout-minutes: 10
steps:
- uses: actions/checkout@v7
- uses: dtolnay/rust-toolchain@stable
with:
components: rustfmt
- name: Check formatting
run: cargo fmt --all -- --check
clippy:
name: Clippy
runs-on: ubuntu-latest
timeout-minutes: 30
steps:
- uses: actions/checkout@v7
with:
submodules: true
- uses: dtolnay/rust-toolchain@stable
with:
components: clippy
- uses: Swatinem/rust-cache@v2
- uses: ./.github/actions/setup-tools
- name: Clippy
run: cargo clippy --all-targets -- -D warnings
build:
name: Build
runs-on: ubuntu-latest
timeout-minutes: 30
steps:
- uses: actions/checkout@v7
with:
submodules: true
- uses: dtolnay/rust-toolchain@stable
- uses: Swatinem/rust-cache@v2
with:
# 稳定键后缀:让 build 的依赖产物缓存跨 run 固定在同一命名空间。
# rust-cache 的自动键会附 job 名,故 build 与 test 仍是两份独立缓存;
# 且它只缓存依赖、不缓存 workspace 自身,workspace 产物的跨 job 复用
# 由 sccache 承担。
key: oxide-target-ubuntu-v1
- uses: ./.github/actions/setup-tools
- name: Build
run: cargo build --verbose
# test 是单一 job:经 workflow_call 调用 ci-test.yml,外观上主 CI 只有一个 test
# (全过才绿),点进去才见内部 matrix(os × group)并行图。build 先编 workspace
# 并填充 sccache,test 经 sccache 命中已编产物。
test:
name: Test
needs: [build]
uses: ./.github/workflows/ci-test.yml
secrets: inherit