name: Rust Fuzz
on:
schedule:
- cron: "23 18 * * *"
workflow_dispatch:
permissions:
contents: read
concurrency:
group: ${{ github.repository }}-${{ github.workflow }}
cancel-in-progress: true
jobs:
fuzz:
runs-on: ubuntu-latest
timeout-minutes: 15
strategy:
fail-fast: false
matrix:
target: [decoder, json_decode_differential, json_budget_invariants, json_encode_invariants, json_tree_invariants]
steps:
- name: Checkout source
uses: actions/checkout@v6
with:
fetch-depth: 1
submodules: recursive
- name: Restore fuzz corpus
uses: actions/cache/restore@v4
with:
path: fuzz/corpus/${{ matrix.target }}
key: ${{ matrix.target }}-fuzz-corpus-${{ runner.os }}-${{ github.run_id }}
restore-keys: |
${{ matrix.target }}-fuzz-corpus-${{ runner.os }}-
- name: Install Rust nightly
run: rustup toolchain install nightly-2026-06-05 --profile minimal
- name: Install cargo-fuzz
run: cargo install cargo-fuzz --version 0.13.2 --locked
- name: Fuzz target
working-directory: fuzz
run: cargo +nightly-2026-06-05 fuzz run ${{ matrix.target }} -- -max_total_time=300 -max_len=4096
- name: Save fuzz corpus
if: always()
uses: actions/cache/save@v4
with:
path: fuzz/corpus/${{ matrix.target }}
key: ${{ matrix.target }}-fuzz-corpus-${{ runner.os }}-${{ github.run_id }}
- name: Upload fuzz artifacts
if: failure()
uses: actions/upload-artifact@v7
with:
name: ${{ matrix.target }}-fuzz-artifacts
path: fuzz/artifacts/${{ matrix.target }}/**
if-no-files-found: warn
retention-days: 14