mirror of
https://github.com/freemkv/libfreemkv.git
synced 2026-10-07 18:13:10 +00:00
The freemkv 1.7.6 Linux target compiles a GTK4 + libadwaita desktop shell, so this job's downstream `cargo test`/`cargo check` on freemkv hits `gtk4-sys`/`glib-sys` pkg-config probes that fail on a stock ubuntu runner. Adds the apt-get step alongside the existing sibling checkout, mirroring the fix in freemkv's own ci.yml `cli-linux` job. Kept local (not in the shared reusable checkout action) — only `freemkv` links against GTK; adding the deps to every downstream consumer would tax the six that don't.
277 lines
10 KiB
YAML
277 lines
10 KiB
YAML
name: CI
|
|
|
|
on:
|
|
push:
|
|
# dev -> qa -> main. `dev` is where work lands and is pushed to often: these
|
|
# are the FAST checks. `qa` runs these plus the expensive suite in qa.yml.
|
|
# `main` only moves at release time, to a commit already green on qa.
|
|
branches: [main, dev, qa]
|
|
pull_request:
|
|
|
|
# Rapid dev pushes supersede their own in-progress runs instead of stacking.
|
|
concurrency:
|
|
group: ${{ github.workflow }}-${{ github.ref }}
|
|
cancel-in-progress: true
|
|
|
|
jobs:
|
|
# Single source of truth for the MSRV: `rust-version` in Cargo.toml. Every job
|
|
# that builds AT the MSRV consumes needs.resolve-msrv.outputs.v so the floor
|
|
# cannot drift. clippy and `consumers` deliberately run on `stable`.
|
|
resolve-msrv:
|
|
runs-on: ubuntu-latest
|
|
outputs:
|
|
v: ${{ steps.msrv.outputs.v }}
|
|
steps:
|
|
- uses: actions/checkout@v5
|
|
- id: msrv
|
|
shell: bash
|
|
run: echo "v=$(grep -m1 '^rust-version' Cargo.toml | sed -E 's/.*\"([^\"]+)\".*/\1/')" >> "$GITHUB_OUTPUT"
|
|
|
|
# main may never carry a released version without a CHANGELOG.md entry. Hard-
|
|
# fails on main (and PRs to main); warns elsewhere so an in-progress branch
|
|
# whose entry isn't written yet is not blocked.
|
|
changelog:
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- uses: actions/checkout@v5
|
|
- name: Require a CHANGELOG entry for the crate version on main
|
|
shell: bash
|
|
run: |
|
|
set -euo pipefail
|
|
version=$(grep -m1 '^version = ' Cargo.toml | sed -E 's/.*"([^"]+)".*/\1/')
|
|
if grep -qE "^## \[${version}\]" CHANGELOG.md; then
|
|
echo "CHANGELOG.md has an entry for ${version}."
|
|
exit 0
|
|
fi
|
|
msg="CHANGELOG.md has no '## [${version}]' entry"
|
|
if [ "${GITHUB_REF_NAME:-}" = "main" ] || [ "${GITHUB_BASE_REF:-}" = "main" ]; then
|
|
echo "::error::${msg} — main requires a changelog entry for the released version."
|
|
exit 1
|
|
fi
|
|
echo "::warning::${msg} (allowed on ${GITHUB_REF_NAME:-unknown}; required before it can reach main)."
|
|
|
|
# fmt on the pinned MSRV; clippy on stable so new-lint debt is a blocking gate
|
|
# the pinned version would hide. --all-targets lints test code too.
|
|
lint:
|
|
needs: resolve-msrv
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- uses: actions/checkout@v5
|
|
with:
|
|
path: libfreemkv
|
|
- uses: freemkv/.github/.github/actions/checkout-siblings@v1
|
|
with:
|
|
checkout: freemkv-unlock
|
|
- uses: dtolnay/rust-toolchain@stable
|
|
with:
|
|
components: clippy
|
|
- uses: dtolnay/rust-toolchain@master
|
|
with:
|
|
toolchain: ${{ needs.resolve-msrv.outputs.v }}
|
|
components: rustfmt
|
|
- uses: Swatinem/rust-cache@v2
|
|
with:
|
|
workspaces: libfreemkv
|
|
- run: cargo fmt --check
|
|
working-directory: libfreemkv
|
|
- run: cargo +stable clippy --all-targets -- -D warnings
|
|
working-directory: libfreemkv
|
|
|
|
test:
|
|
needs: resolve-msrv
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- uses: actions/checkout@v5
|
|
with:
|
|
path: libfreemkv
|
|
- uses: freemkv/.github/.github/actions/checkout-siblings@v1
|
|
with:
|
|
checkout: freemkv-unlock
|
|
- uses: dtolnay/rust-toolchain@master
|
|
with:
|
|
toolchain: ${{ needs.resolve-msrv.outputs.v }}
|
|
- uses: Swatinem/rust-cache@v2
|
|
with:
|
|
workspaces: libfreemkv
|
|
- run: cargo test --tests
|
|
working-directory: libfreemkv
|
|
|
|
# The memory orderings in `scsi::fd_handoff` compile to the same instructions
|
|
# on x86_64, so the WRONG ones pass every run; loom enumerates the executions
|
|
# the C++20 model permits and is the only regression coverage that code has.
|
|
# Its own job because RUSTFLAGS is part of the rust-cache key. Takes the sibling
|
|
# checkout even with --no-default-features: features don't exempt an optional
|
|
# path dep from manifest RESOLUTION.
|
|
loom:
|
|
needs: resolve-msrv
|
|
runs-on: ubuntu-latest
|
|
env:
|
|
RUSTFLAGS: --cfg loom
|
|
steps:
|
|
- uses: actions/checkout@v5
|
|
with:
|
|
path: libfreemkv
|
|
- uses: freemkv/.github/.github/actions/checkout-siblings@v1
|
|
with:
|
|
checkout: freemkv-unlock
|
|
- uses: dtolnay/rust-toolchain@master
|
|
with:
|
|
toolchain: ${{ needs.resolve-msrv.outputs.v }}
|
|
components: clippy
|
|
- uses: Swatinem/rust-cache@v2
|
|
with:
|
|
workspaces: libfreemkv
|
|
- run: cargo test --lib --no-default-features --features scsi fd_handoff
|
|
working-directory: libfreemkv
|
|
# `lint` runs clippy without --cfg loom, so this is the only place the
|
|
# model code is linted at all.
|
|
- run: cargo clippy --lib --no-default-features --features scsi --profile test -- -D warnings
|
|
working-directory: libfreemkv
|
|
|
|
deny:
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- uses: actions/checkout@v5
|
|
with:
|
|
path: libfreemkv
|
|
- uses: freemkv/.github/.github/actions/checkout-siblings@v1
|
|
with:
|
|
checkout: freemkv-unlock
|
|
- uses: dtolnay/rust-toolchain@stable
|
|
- uses: EmbarkStudios/cargo-deny-action@v2
|
|
with:
|
|
command: check advisories bans licenses sources
|
|
manifest-path: libfreemkv/Cargo.toml
|
|
|
|
# dev is the FAST lane: the platform jobs run on qa/main only (qa.yml also
|
|
# covers macOS/Windows). `if` SKIPS (does not queue) so a never-scheduled job
|
|
# can't block the release gate.
|
|
check-macos:
|
|
needs: resolve-msrv
|
|
if: github.ref_name == 'qa' || github.ref_name == 'main'
|
|
runs-on: macos-latest
|
|
steps:
|
|
- uses: actions/checkout@v5
|
|
with:
|
|
path: libfreemkv
|
|
- uses: freemkv/.github/.github/actions/checkout-siblings@v1
|
|
with:
|
|
checkout: freemkv-unlock
|
|
- uses: dtolnay/rust-toolchain@master
|
|
with:
|
|
toolchain: ${{ needs.resolve-msrv.outputs.v }}
|
|
- uses: Swatinem/rust-cache@v2
|
|
with:
|
|
workspaces: libfreemkv
|
|
- run: cargo check
|
|
working-directory: libfreemkv
|
|
|
|
check-windows:
|
|
needs: resolve-msrv
|
|
if: github.ref_name == 'qa' || github.ref_name == 'main'
|
|
runs-on: windows-latest
|
|
steps:
|
|
- uses: actions/checkout@v5
|
|
with:
|
|
path: libfreemkv
|
|
- uses: freemkv/.github/.github/actions/checkout-siblings@v1
|
|
with:
|
|
checkout: freemkv-unlock
|
|
- uses: dtolnay/rust-toolchain@master
|
|
with:
|
|
toolchain: ${{ needs.resolve-msrv.outputs.v }}
|
|
- uses: Swatinem/rust-cache@v2
|
|
with:
|
|
workspaces: libfreemkv
|
|
# Build the tests: forces full codegen of the Windows-only SPTI transport
|
|
# (src/scsi/windows.rs), which never compiles on Linux/macOS dev hosts.
|
|
- run: cargo build --tests
|
|
working-directory: libfreemkv
|
|
|
|
# Did this change break anything downstream? libfreemkv sits below all five
|
|
# dependents; a break here is worth strictly more than anywhere else. Runs
|
|
# their suites (not just check) — a behavioural change keeps signatures but
|
|
# fails a dependent's tests, which is the shape worth catching. This caught an
|
|
# engine fixture break the moment it landed, so it stays on the dev fast lane.
|
|
consumers:
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- uses: actions/checkout@v5
|
|
with: { path: libfreemkv }
|
|
- uses: freemkv/.github/.github/actions/checkout-siblings@v1
|
|
with:
|
|
checkout: freemkv-unlock freemkv-keysources freemkv-engine freemkv-i18n freemkv autorip bdemu
|
|
- name: Point every dependent at THIS libfreemkv commit
|
|
shell: bash
|
|
run: |
|
|
for c in freemkv-keysources freemkv-engine freemkv autorip bdemu; do
|
|
mkdir -p "$c/.cargo"
|
|
cat > "$c/.cargo/config.toml" <<'EOF'
|
|
[patch.crates-io]
|
|
libfreemkv = { path = "../libfreemkv" }
|
|
freemkv-keysources = { path = "../freemkv-keysources" }
|
|
freemkv-engine = { path = "../freemkv-engine" }
|
|
freemkv-i18n = { path = "../freemkv-i18n" }
|
|
EOF
|
|
done
|
|
# Since freemkv 1.7.6 the `freemkv` consumer's Linux target compiles a
|
|
# GTK4 + libadwaita desktop shell, so `cargo test` on it needs the
|
|
# pkg-config dev headers the `gtk4-sys`/`glib-sys` build.rs scripts
|
|
# probe. Kept local (not in the shared reusable) — only freemkv links
|
|
# against GTK; adding the deps to every consumer would tax the six
|
|
# that don't.
|
|
- name: Install GTK4 + libadwaita development headers (for freemkv)
|
|
run: |
|
|
sudo apt-get update
|
|
sudo apt-get install -y libgtk-4-dev libadwaita-1-dev build-essential
|
|
# Dependents track the highest supported Rust — build on stable so this job
|
|
# satisfies the highest dependent floor (the library's own lower MSRV, which
|
|
# the `test` job verifies, cannot compile them).
|
|
- uses: dtolnay/rust-toolchain@stable
|
|
- uses: Swatinem/rust-cache@v2
|
|
with:
|
|
workspaces: |
|
|
freemkv-keysources
|
|
freemkv-engine
|
|
freemkv
|
|
autorip
|
|
bdemu
|
|
- run: cargo test --tests
|
|
working-directory: freemkv-keysources
|
|
- run: cargo test --tests
|
|
working-directory: freemkv-engine
|
|
- run: cargo test --tests
|
|
working-directory: freemkv
|
|
- run: cargo test --tests
|
|
working-directory: autorip
|
|
- run: cargo test --tests
|
|
working-directory: bdemu
|
|
|
|
# Coverage: non-required, informational only (codecov.yml), no job needs: it.
|
|
coverage:
|
|
needs: resolve-msrv
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- uses: actions/checkout@v5
|
|
with:
|
|
path: libfreemkv
|
|
- uses: freemkv/.github/.github/actions/checkout-siblings@v1
|
|
with:
|
|
checkout: freemkv-unlock
|
|
- uses: dtolnay/rust-toolchain@master
|
|
with:
|
|
toolchain: ${{ needs.resolve-msrv.outputs.v }}
|
|
components: llvm-tools-preview
|
|
- uses: Swatinem/rust-cache@v2
|
|
with:
|
|
workspaces: libfreemkv
|
|
- uses: taiki-e/install-action@cargo-llvm-cov
|
|
- run: cargo llvm-cov --workspace --ignore-run-fail --lcov --output-path lcov.info
|
|
working-directory: libfreemkv
|
|
- uses: codecov/codecov-action@v7
|
|
with:
|
|
token: ${{ secrets.CODECOV_TOKEN }}
|
|
files: libfreemkv/lcov.info
|
|
slug: freemkv/libfreemkv
|
|
fail_ci_if_error: false
|