name: CI on: push: branches: [main] pull_request: branches: [main] env: CARGO_TERM_COLOR: always # job 拓扑:fmt / clippy / build 三者并行独立;test 依赖 build(needs),在 # build 编译完成后启动,复用 build 的产物(经共享 rust-cache 传递 target/), # 只补编 test harness、不重编整个 workspace。各 job 单独状态,一个挂了不阻塞 # 无关者,GitHub 界面一眼看出哪个红。clippy 走 check 模式、产物与 build 不同, # 无法复用 build 产物,故保持独立并行。 # # sccache 与 mold:.cargo/config.toml 全局引用(rustc-wrapper 与 -fuse-ld=mold), # 凡跑 rustc 的 job(clippy/build/test)必须先装,否则构建直接失败。fmt 只跑 # rustfmt、不跑 rustc,无需安装。 jobs: fmt: name: Format runs-on: ubuntu-latest 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 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 steps: - uses: actions/checkout@v7 with: submodules: true - uses: dtolnay/rust-toolchain@stable - uses: Swatinem/rust-cache@v2 with: # 与 ci-test.yml 的 test job 同键:test 复用 build 的 target/ 缓存, # 只补编 test harness、不重编整个 workspace。自定义键避免按 profile # 自动分键(build/test 各一)导致 test 恢复陈旧缓存。 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)并行图。needs build 复用产物。 test: name: Test needs: [build] uses: ./.github/workflows/ci-test.yml secrets: inherit