name: CI on: push: branches: [main, master] pull_request: branches: [main, master] permissions: contents: read env: CARGO_TERM_COLOR: always jobs: fmt: name: Format runs-on: ubuntu-latest steps: - uses: actions/checkout@v6 - name: Install Rust run: | rustup override set stable rustup update stable rustup component add rustfmt - run: cargo fmt --all --check clippy: name: Clippy runs-on: ubuntu-latest steps: - uses: actions/checkout@v6 - name: Install Rust run: | rustup override set stable rustup update stable rustup component add clippy - uses: Swatinem/rust-cache@v2 - run: cargo clippy --all-targets --all-features -- -D warnings test: name: Test runs-on: ubuntu-latest strategy: matrix: features: - "" - "async" steps: - uses: actions/checkout@v6 - name: Install Rust run: | rustup override set stable rustup update stable - uses: Swatinem/rust-cache@v2 - name: Run tests run: | if [ -z "${{ matrix.features }}" ]; then cargo test --verbose else cargo test --verbose --features "${{ matrix.features }}" fi examples: name: Examples runs-on: ubuntu-latest steps: - uses: actions/checkout@v6 - name: Install Rust run: | rustup override set stable rustup update stable - uses: Swatinem/rust-cache@v2 - name: Run sync example (ml_hyperparameter_tuning) run: cargo run --example ml_hyperparameter_tuning - name: Run async example (async_api_optimization) run: cargo run --example async_api_optimization --features async docs: name: Docs runs-on: ubuntu-latest steps: - uses: actions/checkout@v6 - name: Install Rust run: | rustup override set stable rustup update stable - uses: Swatinem/rust-cache@v2 - run: cargo doc --all-features --no-deps env: RUSTDOCFLAGS: -D warnings feature-check: name: Feature Combinations runs-on: ubuntu-latest steps: - uses: actions/checkout@v6 - name: Install Rust run: | rustup override set stable rustup update stable - name: Install cargo-hack uses: taiki-e/install-action@cargo-hack - uses: Swatinem/rust-cache@v2 - name: Check feature powerset run: cargo hack check --feature-powerset --no-dev-deps coverage: name: Coverage runs-on: ubuntu-latest steps: - uses: actions/checkout@v6 - name: Install Rust run: | rustup override set stable rustup update stable rustup component add llvm-tools-preview - name: Install cargo-llvm-cov uses: taiki-e/install-action@cargo-llvm-cov - uses: Swatinem/rust-cache@v2 - name: Generate coverage report run: cargo llvm-cov --all-features --lcov --output-path lcov.info - name: Upload coverage to Codecov uses: codecov/codecov-action@v5 with: token: ${{ secrets.CODECOV_TOKEN }} files: lcov.info fail_ci_if_error: true msrv: name: MSRV (1.88) runs-on: ubuntu-latest steps: - uses: actions/checkout@v6 - name: Install Rust 1.88 run: | rustup override set 1.88 rustup update 1.88 - uses: Swatinem/rust-cache@v2 - name: Check compilation run: cargo check --all-features deny: name: Cargo Deny runs-on: ubuntu-latest steps: - uses: actions/checkout@v6 - uses: EmbarkStudios/cargo-deny-action@v2 machete: name: Unused Dependencies runs-on: ubuntu-latest steps: - uses: actions/checkout@v6 - name: Install Rust run: | rustup override set stable rustup update stable - uses: Swatinem/rust-cache@v2 - name: Machete uses: bnjbvr/cargo-machete@7959c845782fed02ee69303126d4a12d64f1db18 semver: name: Semver Check runs-on: ubuntu-latest steps: - uses: actions/checkout@v6 - name: Install Rust run: | rustup override set stable rustup update stable - uses: Swatinem/rust-cache@v2 - name: Install cargo-semver-checks uses: taiki-e/install-action@cargo-semver-checks - name: Check semver run: cargo semver-checks check-release minimal-versions: name: Minimal Versions runs-on: ubuntu-latest steps: - uses: actions/checkout@v6 - name: Install Rust nightly run: | rustup toolchain install nightly rustup override set nightly - uses: Swatinem/rust-cache@v2 - name: Generate minimal version lockfile run: cargo +nightly -Z minimal-versions update - name: Install Rust stable run: | rustup override set stable rustup update stable - name: Check with minimal versions run: cargo check --all-features --locked cross-platform: name: ${{ matrix.os }} runs-on: ${{ matrix.os }} strategy: fail-fast: false matrix: os: [windows-latest, macos-latest] steps: - uses: actions/checkout@v6 - name: Install Rust run: | rustup override set stable rustup update stable - uses: Swatinem/rust-cache@v2 - name: Check compilation run: cargo check --all-features - name: Run tests run: cargo test --all-features cross-targets: name: ${{ matrix.target }} runs-on: ubuntu-latest strategy: fail-fast: false matrix: target: - aarch64-unknown-linux-gnu - i686-unknown-linux-gnu - powerpc64le-unknown-linux-gnu - s390x-unknown-linux-gnu steps: - uses: actions/checkout@v6 - name: Install Rust run: | rustup override set stable rustup update stable rustup target add ${{ matrix.target }} - uses: Swatinem/rust-cache@v2 - name: Check compilation run: cargo check --all-features --target ${{ matrix.target }} typos: name: Typos runs-on: ubuntu-latest steps: - uses: actions/checkout@v6 - name: Install Rust run: | rustup override set stable rustup update stable - uses: taiki-e/cache-cargo-install-action@v3 with: tool: typos-cli - name: Typos Check run: typos src/ publish: name: Publish to crates.io runs-on: ubuntu-latest if: github.event_name == 'push' needs: - fmt - clippy - test - examples - docs - feature-check - coverage - msrv - deny - machete - semver - minimal-versions - cross-platform - cross-targets - typos steps: - uses: actions/checkout@v6 - name: Install Rust run: | rustup override set stable rustup update stable - uses: Swatinem/rust-cache@v2 - name: Check if version already published id: check run: | CARGO_VERSION=$(cargo metadata --no-deps --format-version 1 | jq -r '.packages[0].version') echo "version=$CARGO_VERSION" >> "$GITHUB_OUTPUT" HTTP_STATUS=$(curl -s -o /dev/null -w "%{http_code}" "https://crates.io/api/v1/crates/optimizer/$CARGO_VERSION") if [ "$HTTP_STATUS" = "200" ]; then echo "Version $CARGO_VERSION already exists on crates.io, skipping publish" echo "skip=true" >> "$GITHUB_OUTPUT" else echo "Version $CARGO_VERSION not found on crates.io, will publish" echo "skip=false" >> "$GITHUB_OUTPUT" fi - name: Publish if: steps.check.outputs.skip == 'false' run: | cargo publish --allow-dirty 2>&1 | tee publish_output.txt || { if grep -q "already uploaded" publish_output.txt; then echo "Version already published, skipping" exit 0 fi exit 1 } env: CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }}