name: CI on: push: branches: [main, master, dev] pull_request: branches: [main, master] env: CARGO_TERM_COLOR: always RUSTFLAGS: "-Dwarnings" jobs: # ── Lint ───────────────────────────────────────────────────────────────────── lint: name: Lint (fmt + clippy) runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Install Rust toolchain uses: dtolnay/rust-toolchain@stable with: components: rustfmt, clippy - name: Cache cargo registry & build uses: actions/cache@v4 with: path: | ~/.cargo/registry ~/.cargo/git target key: ${{ runner.os }}-cargo-lint-${{ hashFiles('**/Cargo.lock') }} restore-keys: ${{ runner.os }}-cargo-lint- - name: Check formatting run: cargo fmt --all -- --check - name: Clippy lints run: cargo clippy --all-targets --all-features -- -D warnings # ── Test ───────────────────────────────────────────────────────────────────── test: name: Test (${{ matrix.os }}) runs-on: ${{ matrix.os }} strategy: fail-fast: false matrix: os: [ubuntu-latest, macos-latest] rust: [stable] include: - os: ubuntu-latest rust: nightly steps: - uses: actions/checkout@v4 - name: Install Rust toolchain uses: dtolnay/rust-toolchain@master with: toolchain: ${{ matrix.rust }} - name: Cache cargo registry & build uses: actions/cache@v4 with: path: | ~/.cargo/registry ~/.cargo/git target key: ${{ runner.os }}-${{ matrix.rust }}-cargo-test-${{ hashFiles('**/Cargo.lock') }} restore-keys: ${{ runner.os }}-${{ matrix.rust }}-cargo-test- - name: Run tests run: cargo test --all-features --verbose # ── Coverage ───────────────────────────────────────────────────────────────── coverage: name: Coverage runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Install Rust toolchain uses: dtolnay/rust-toolchain@stable - name: Install cargo-tarpaulin run: cargo install cargo-tarpaulin - name: Cache cargo registry & build uses: actions/cache@v4 with: path: | ~/.cargo/registry ~/.cargo/git target key: ${{ runner.os }}-cargo-cov-${{ hashFiles('**/Cargo.lock') }} restore-keys: ${{ runner.os }}-cargo-cov- - name: Generate coverage run: cargo tarpaulin --out xml --output-dir coverage --all-features --workspace --timeout 120 - name: Upload to Codecov uses: codecov/codecov-action@v4 with: files: coverage/cobertura.xml fail_ci_if_error: false token: ${{ secrets.CODECOV_TOKEN }} # ── Build ──────────────────────────────────────────────────────────────────── build: name: Build (${{ matrix.os }}) runs-on: ${{ matrix.os }} strategy: fail-fast: false matrix: os: [ubuntu-latest, macos-latest] steps: - uses: actions/checkout@v4 - name: Install Rust toolchain uses: dtolnay/rust-toolchain@stable - name: Cache cargo registry & build uses: actions/cache@v4 with: path: | ~/.cargo/registry ~/.cargo/git target key: ${{ runner.os }}-cargo-build-${{ hashFiles('**/Cargo.lock') }} restore-keys: ${{ runner.os }}-cargo-build- - name: Build release binary run: cargo build --release --verbose - name: Check binary size run: | ls -lh target/release/fetchx echo "Binary size: $(du -h target/release/fetchx | cut -f1)" - name: Upload binary artifact uses: actions/upload-artifact@v4 with: name: fetchx-${{ matrix.os }} path: target/release/fetchx retention-days: 7