[go: up one dir, main page]

image 0.24.9

Imaging library. Provides basic image processing and encoders/decoders for common image formats.
Documentation
name: Rust CI

on:
  push:
    branches: [ master, main, next ]
  pull_request:
    branches: [ master, main, next ]
  schedule:
    - cron: '5 16 * * 6'

jobs:
  test_features:
    runs-on: ubuntu-latest
    strategy:
      fail-fast: false
      matrix:
        features: ['', default, gif, jpeg, png, tiff, ico, pnm, tga, webp, bmp, hdr, dxt, dds, farbfeld, openexr, jpeg_rayon, webp-encoder]
    steps:
    - uses: actions/checkout@v4
    - uses: dtolnay/rust-toolchain@stable
    - name: Cache Cargo Dependencies
      uses: Swatinem/rust-cache@v2
      with:
        cache-on-failure: true
    - name: build
      run: cargo build -v --no-default-features --features "$FEATURES"
      env:
        FEATURES: ${{ matrix.features }}
    - name: test
      run: >
        cargo test -v --no-default-features --features "$FEATURES" &&
        cargo doc -v --no-default-features --features "$FEATURES"
      env:
        FEATURES: ${{ matrix.features }}

  test_toolchains:
    runs-on: ubuntu-latest
    strategy:
      fail-fast: false
      matrix:
        rust: ["1.63.0", nightly, beta]
    steps:
    - uses: actions/checkout@v4

    - uses: dtolnay/rust-toolchain@nightly
      if: ${{ matrix.rust == '1.63.0' }}
    - name: Generate Cargo.lock with minimal-version dependencies
      if: ${{ matrix.rust == '1.63.0' }}
      run: cargo -Zminimal-versions generate-lockfile

    - uses: dtolnay/rust-toolchain@v1
      with:
        toolchain: ${{ matrix.rust }}
    - name: Cache Cargo Dependencies
      uses: Swatinem/rust-cache@v2
      with:
        cache-on-failure: true
    - name: build
      run: cargo build -v --features webp,webp-encoder
    - name: test
      if: ${{ matrix.rust != '1.63.0' }}
      run: >
        cargo test -v --features webp,webp-encoder &&
        cargo doc -v --features webp,webp-encoder

  test_other_archs:
    # github actions does not support 32-bit or big endian systems directly, but
    # it does support QEMU. so we install qemu, then build and run the tests in
    # an emulated mips system. NOTE: you can also use this approach to test for
    # big endian locally.
    runs-on: ubuntu-latest
    strategy:
      fail-fast: false
      matrix:
        arch: [powerpc-unknown-linux-gnu, i686-unknown-linux-gnu]
        features: [default, webp-encoder]
    steps:
      - uses: actions/checkout@v4
      - name: Install or use cached cross-rs/cross
        uses: baptiste0928/cargo-install@v2
        with:
          crate: cross
      - name: Cache Cargo Dependencies
        uses: Swatinem/rust-cache@v2
        with:
          cache-on-failure: true
      - name: Start Docker (required for cross-rs)
        run: sudo systemctl start docker
      - name: Cross-Run Tests using QEMU
        run: |
          cross test --target ${{ matrix.arch }} --verbose -v --no-default-features --features "$FEATURES"
        env:
          FEATURES: ${{ matrix.features }}

  test_avif:
    runs-on: ubuntu-latest
    steps:
    - name: install-dependencies
      run: sudo apt update && sudo apt install nasm
    - uses: actions/checkout@v4
    - uses: dtolnay/rust-toolchain@stable
    - name: build
      run: cargo build -v --no-default-features --features="avif"

  test_avif_decoding:
    runs-on: ubuntu-latest
    steps:
    - name: install-dependencies
      run: sudo apt update && sudo apt install ninja-build meson nasm
    - uses: actions/checkout@v4
    - uses: dtolnay/rust-toolchain@stable
    - name: build
      run: cargo build -v --no-default-features --features="avif,avif-decoder"
      env:
        SYSTEM_DEPS_DAV1D_BUILD_INTERNAL: always

  clippy:
    runs-on: ubuntu-latest
    steps:
    - name: install-dependencies
      run: sudo apt update && sudo apt install ninja-build meson nasm
    - uses: actions/checkout@v4
    - uses: dtolnay/rust-toolchain@nightly
      with:
        components: clippy
    - run: cargo clippy --all-features --all-targets -- -D warnings
      env:
        SYSTEM_DEPS_DAV1D_BUILD_INTERNAL: always

  build_fuzz_afl:
    name: "Fuzz targets (afl)"
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v4
    - uses: dtolnay/rust-toolchain@nightly
    - name: install-deps
      run: sudo apt-get -y install clang llvm
    - name: build
      run: |
        cargo install cargo-afl
        cd fuzz-afl
        cargo check --bin reproduce_webp
        cargo check --bin reproduce_pnm
        cargo afl check --bin fuzz_webp
        cargo afl check --bin fuzz_pnm
      env:
        RUSTFLAGS: ""

  build_fuzz_cargo-fuzz:
    name: "Fuzz targets (cargo-fuzz)"
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v4
    - uses: dtolnay/rust-toolchain@nightly
    - name: build
      run: |
        cargo install cargo-fuzz
        cargo fuzz build
    - name: fuzz
      run: |
        for format in $(cargo fuzz list); do
          cargo fuzz run "$format" -- -runs=0;
        done

  public_private_dependencies:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v4
    - uses: dtolnay/rust-toolchain@nightly
    - name: build
      run: |
        mv ./Cargo.toml.public-private-dependencies ./Cargo.toml
        echo "#![deny(exported_private_dependencies)]" | cat - src/lib.rs > src/lib.rs.0
        mv src/lib.rs.0 src/lib.rs
        cargo check

  build_benchmarks:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v4
    - uses: dtolnay/rust-toolchain@nightly
    - name: build
      run: cargo build -v --benches --features=benchmarks

  rustfmt:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v4
    - uses: dtolnay/rust-toolchain@stable
      with:
        components: rustfmt
    - name: Run rustfmt check
      run: cargo fmt -- --check

  cargo-deny:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: EmbarkStudios/cargo-deny-action@v1

  verify_msrv:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Install or use cached `cargo-msrv`
        uses: baptiste0928/cargo-install@v2
        with:
          crate: cargo-msrv

      - uses: dtolnay/rust-toolchain@nightly
      - name: Generate Cargo.lock with minimal-version dependencies
        run: cargo -Zminimal-versions generate-lockfile

      - name: Verify Minimum Rust Version against `-Zminimal-versions` dependencies
        run: cargo-msrv verify