Skip to content

🌙 UFFS Tier 2 Nightly CI #202

🌙 UFFS Tier 2 Nightly CI

🌙 UFFS Tier 2 Nightly CI #202

Workflow file for this run

# UFFS Tier 2 Nightly CI
# Copyright 2025-2026 Robert Nio
# SPDX-License-Identifier: MIT OR Apache-2.0
#
# Tier 2 keeps the slower nightly checks out of the PR path while still
# exercising the important scheduled/on-demand validation gates.
name: 🌙 UFFS Tier 2 Nightly CI
on:
schedule:
- cron: '0 6 * * 1'
workflow_dispatch:
permissions:
contents: read
env:
CARGO_TERM_COLOR: always
RUST_BACKTRACE: 1
CARGO_TARGET_DIR: target
# Disable sccache in CI - it's configured in .cargo/config.toml for local dev
# but not installed on GitHub Actions runners
RUSTC_WRAPPER: ""
# Limit parallel jobs to reduce memory pressure during Polars compilation
# GitHub Actions runners have limited RAM; too many parallel rustc processes
# can trigger OOM killer or runner preemption (exit code 143)
CARGO_BUILD_JOBS: 2
jobs:
coverage:
name: Tier 2 / Coverage
runs-on: ubuntu-latest
timeout-minutes: 60
steps:
- name: Free up disk space
run: |
echo "🧹 Freeing up disk space for Polars compilation..."
sudo rm -rf /usr/share/dotnet
sudo rm -rf /usr/local/lib/android
sudo rm -rf /opt/ghc
sudo rm -rf /opt/hostedtoolcache/CodeQL
sudo docker image prune --all --force || true
- name: Checkout repository
uses: actions/checkout@v4
- name: Install nightly Rust toolchain
uses: dtolnay/rust-toolchain@nightly
with:
components: llvm-tools-preview
- name: Cache dependencies
uses: Swatinem/rust-cache@v2
- name: Install cargo-llvm-cov
uses: taiki-e/install-action@cargo-llvm-cov
- name: Generate coverage report
run: cargo llvm-cov --workspace --all-features --lcov --output-path lcov.info
- name: Upload coverage to Codecov
uses: codecov/codecov-action@v4
with:
files: lcov.info
token: ${{ secrets.CODECOV_TOKEN }}
fail_ci_if_error: false
verbose: true
cross-check:
name: Tier 2 / Windows Cross-Check
runs-on: ubuntu-latest
timeout-minutes: 30
steps:
- name: Free up disk space
run: |
echo "🧹 Freeing up disk space for Polars compilation..."
sudo rm -rf /usr/share/dotnet
sudo rm -rf /usr/local/lib/android
sudo rm -rf /opt/ghc
sudo rm -rf /opt/hostedtoolcache/CodeQL
sudo docker image prune --all --force || true
- name: Checkout repository
uses: actions/checkout@v4
- name: Install nightly Rust toolchain
uses: dtolnay/rust-toolchain@nightly
with:
targets: x86_64-pc-windows-msvc
- name: Cache dependencies
uses: Swatinem/rust-cache@v2
- name: Run Windows cross-check
run: cargo check --workspace --all-features --target x86_64-pc-windows-msvc
build-validation:
name: Tier 2 / Build Validation
runs-on: ubuntu-latest
timeout-minutes: 60
steps:
- name: Free up disk space
run: |
echo "🧹 Freeing up disk space for Polars compilation..."
sudo rm -rf /usr/share/dotnet
sudo rm -rf /usr/local/lib/android
sudo rm -rf /opt/ghc
sudo rm -rf /opt/hostedtoolcache/CodeQL
sudo docker image prune --all --force || true
- name: Checkout repository
uses: actions/checkout@v4
- name: Install nightly Rust toolchain
uses: dtolnay/rust-toolchain@nightly
- name: Cache dependencies
uses: Swatinem/rust-cache@v2
- name: Run build validation
run: cargo build --workspace --all-features --bins
udeps:
name: Tier 2 / cargo-udeps
runs-on: ubuntu-latest
timeout-minutes: 60
steps:
- name: Free up disk space
run: |
echo "🧹 Freeing up disk space for Polars compilation..."
sudo rm -rf /usr/share/dotnet
sudo rm -rf /usr/local/lib/android
sudo rm -rf /opt/ghc
sudo rm -rf /opt/hostedtoolcache/CodeQL
sudo docker image prune --all --force || true
- name: Checkout repository
uses: actions/checkout@v4
- name: Install nightly Rust toolchain
uses: dtolnay/rust-toolchain@nightly
- name: Cache dependencies
uses: Swatinem/rust-cache@v2
- name: Install cargo-udeps
uses: taiki-e/install-action@cargo-udeps
- name: Run cargo-udeps
run: cargo +nightly udeps --workspace --all-targets --all-features
miri:
name: Tier 2 / Miri
runs-on: ubuntu-latest
timeout-minutes: 90
steps:
- name: Free up disk space
run: |
echo "🧹 Freeing up disk space for Polars compilation..."
sudo rm -rf /usr/share/dotnet
sudo rm -rf /usr/local/lib/android
sudo rm -rf /opt/ghc
sudo rm -rf /opt/hostedtoolcache/CodeQL
sudo docker image prune --all --force || true
- name: Checkout repository
uses: actions/checkout@v4
- name: Install nightly Rust toolchain
uses: dtolnay/rust-toolchain@nightly
with:
components: miri
- name: Cache dependencies
uses: Swatinem/rust-cache@v2
- name: Run focused Miri coverage
env:
MIRIFLAGS: -Zmiri-disable-isolation
run: |
# These raw persistence tests use temp files, so Miri needs isolation disabled.
# Keep coverage focused on the subset that runs under Miri today; the zstd-backed
# compressed raw test uses foreign-function calls that Miri does not support.
cargo +nightly miri test -p uffs-mft raw::tests::test_header_roundtrip -- --exact
cargo +nightly miri test -p uffs-mft raw::tests::test_load_header_only -- --exact
cargo +nightly miri test -p uffs-mft raw::tests::test_save_load_uncompressed -- --exact
cargo +nightly miri test -p uffs-mft raw::tests::test_raw_compat_mode -- --exact
tier-2-summary:
name: Tier 2 / Summary
runs-on: ubuntu-latest
needs: [coverage, cross-check, build-validation, udeps, miri]
if: always()
timeout-minutes: 5
steps:
- name: Check pipeline success
run: |
if [[ "${{ needs.coverage.result }}" == "success" && \
"${{ needs.cross-check.result }}" == "success" && \
"${{ needs.build-validation.result }}" == "success" && \
"${{ needs.udeps.result }}" == "success" && \
"${{ needs.miri.result }}" == "success" ]]; then
echo "✅ All Tier 2 nightly checks passed!"
else
echo "❌ Some Tier 2 nightly checks failed - review above"
exit 1
fi
- name: Create summary
if: success()
run: |
echo "## ✅ UFFS Tier 2 Nightly CI Passed" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "| Check | Status |" >> $GITHUB_STEP_SUMMARY
echo "|-------|--------|" >> $GITHUB_STEP_SUMMARY
echo "| Coverage | ✅ |" >> $GITHUB_STEP_SUMMARY
echo "| Windows cross-check | ✅ |" >> $GITHUB_STEP_SUMMARY
echo "| Build validation | ✅ |" >> $GITHUB_STEP_SUMMARY
echo "| cargo-udeps | ✅ |" >> $GITHUB_STEP_SUMMARY
echo "| Miri | ✅ |" >> $GITHUB_STEP_SUMMARY