Skip to content

feat: ✨ Add CI workflow configuration for cross-platform testing and coverage #18

feat: ✨ Add CI workflow configuration for cross-platform testing and coverage

feat: ✨ Add CI workflow configuration for cross-platform testing and coverage #18

Workflow file for this run

# 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
- 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 (annotate + video)
run: cargo clippy --all --features annotate,video -- -D warnings
- name: Tests (annotate + video)
run: cargo test --all --features annotate,video
# 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 (annotate + video features)
run: cargo build --features annotate,video
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 (annotate + video features)
run: cargo build --features annotate,video
# 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 libc6-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 --features annotate,video --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