feat: β¨ Add CI workflow configuration for cross-platform testing and coverage #14
Workflow file for this run
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| # Ultralytics π AGPL-3.0 License - https://ultralytics.com/license | |
| name: CI | |
| permissions: | |
| contents: read | |
| on: | |
| push: | |
| branches: [main] | |
| pull_request: | |
| branches: [main] | |
| schedule: | |
| - cron: "0 0 * * *" | |
| env: | |
| CARGO_TERM_COLOR: always | |
| jobs: | |
| # Cross-platform tests (default features only - no video/ffmpeg required) | |
| test: | |
| name: test / ${{ matrix.os }} | |
| runs-on: ${{ matrix.os }} | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| os: [ubuntu-latest, macos-latest, windows-latest] | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - name: Set up Rust | |
| uses: dtolnay/rust-toolchain@stable | |
| - name: Cache build artifacts | |
| uses: Swatinem/rust-cache@v2 | |
| - name: Format | |
| run: cargo fmt --all -- --check | |
| # Note: We skip 'visualize' feature in CI as minifb requires platform-specific | |
| # libraries (webgpu_dawn) that aren't available in GitHub Actions runners | |
| - name: Clippy (annotate feature) | |
| run: cargo clippy --all-targets --no-default-features --features annotate -- -D warnings | |
| - name: Tests (annotate feature) | |
| run: cargo test --no-default-features --features annotate | |
| # Video feature tests (requires ffmpeg) | |
| test-video: | |
| name: test / linux / ffmpeg ${{ matrix.ffmpeg_version }} | |
| runs-on: ubuntu-latest | |
| container: jrottenberg/ffmpeg:${{ matrix.ffmpeg_version }}-ubuntu | |
| strategy: | |
| matrix: | |
| ffmpeg_version: ["7.1"] | |
| fail-fast: false | |
| steps: | |
| - name: Checkout | |
| uses: actions/checkout@v4 | |
| - name: Install dependencies | |
| run: | | |
| DEBIAN_FRONTEND=noninteractive apt-get update | |
| DEBIAN_FRONTEND=noninteractive apt-get install -y build-essential ca-certificates clang curl pkg-config libssl-dev | |
| - name: Setup Rust | |
| uses: dtolnay/rust-toolchain@stable | |
| with: | |
| components: rustfmt, clippy | |
| - name: Cache build artifacts | |
| uses: Swatinem/rust-cache@v2 | |
| - name: Clippy (all features) | |
| run: cargo clippy --all --all-features -- -D warnings | |
| - name: Tests (all features) | |
| run: cargo test --all --all-features | |
| # macOS video build test | |
| build-macos-video: | |
| name: build / macos / ffmpeg 7 | |
| runs-on: macos-latest | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - name: Install dependencies | |
| run: brew install ffmpeg@7 pkg-config | |
| - name: Setup Rust | |
| uses: dtolnay/rust-toolchain@stable | |
| - name: Cache build artifacts | |
| uses: Swatinem/rust-cache@v2 | |
| - name: Build (all features) | |
| run: cargo build --all-features | |
| env: | |
| LDFLAGS: "-L/opt/homebrew/opt/ffmpeg@7/lib" | |
| CPPFLAGS: "-I/opt/homebrew/opt/ffmpeg@7/include" | |
| PKG_CONFIG_PATH: "/opt/homebrew/opt/ffmpeg@7/lib/pkgconfig" | |
| # Windows video build test | |
| build-windows-video: | |
| name: build / windows / ffmpeg 7.1 | |
| runs-on: windows-latest | |
| env: | |
| FFMPEG_DOWNLOAD_URL: https://www.gyan.dev/ffmpeg/builds/packages/ffmpeg-7.1.1-full_build-shared.7z | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - name: Install dependencies | |
| run: | | |
| $VCINSTALLDIR = $(& "${env:ProgramFiles(x86)}\Microsoft Visual Studio\Installer\vswhere.exe" -latest -property installationPath) | |
| Add-Content $env:GITHUB_ENV "LIBCLANG_PATH=${VCINSTALLDIR}\VC\Tools\LLVM\x64\bin" | |
| Invoke-WebRequest "${env:FFMPEG_DOWNLOAD_URL}" -OutFile ffmpeg-7.1.1-full_build-shared.7z | |
| 7z x ffmpeg-7.1.1-full_build-shared.7z | |
| mkdir ffmpeg | |
| mv ffmpeg-*/* ffmpeg/ | |
| Add-Content $env:GITHUB_ENV "FFMPEG_DIR=${pwd}\ffmpeg" | |
| Add-Content $env:GITHUB_PATH "${pwd}\ffmpeg\bin" | |
| - name: Setup Rust | |
| uses: dtolnay/rust-toolchain@stable | |
| - name: Cache build artifacts | |
| uses: Swatinem/rust-cache@v2 | |
| - name: Build (all features) | |
| run: cargo build --all-features | |
| # Code coverage (runs on ubuntu container with ffmpeg for all features) | |
| coverage: | |
| name: coverage | |
| runs-on: ubuntu-latest | |
| container: jrottenberg/ffmpeg:7.1-ubuntu | |
| needs: [test, test-video] | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - name: Install dependencies | |
| run: | | |
| DEBIAN_FRONTEND=noninteractive apt-get update | |
| DEBIAN_FRONTEND=noninteractive apt-get install -y build-essential ca-certificates clang curl pkg-config libssl-dev | |
| - name: Set up Rust | |
| uses: dtolnay/rust-toolchain@nightly | |
| - name: Cache build artifacts | |
| uses: Swatinem/rust-cache@v2 | |
| - name: Install cargo-llvm-cov | |
| uses: taiki-e/install-action@v2 | |
| with: | |
| tool: cargo-llvm-cov | |
| - name: Coverage | |
| run: cargo llvm-cov --all-features --workspace --lcov --output-path lcov.info | |
| - name: Upload coverage to Codecov | |
| uses: codecov/codecov-action@v5 | |
| with: | |
| files: ./lcov.info | |
| token: ${{ secrets.CODECOV_TOKEN }} | |
| flags: template_coverage |