-
Couldn't load subscription status.
- Fork 421
Upload CI generated fuzz corpus coverage to codecov #4153
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from all commits
7730f3b
89671a5
1ba5def
e0fc064
cc1355f
6cd3f8f
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -110,6 +110,7 @@ jobs: | |
| run: CI_ENV=1 CI_MINIMIZE_DISK_USAGE=1 ./ci/ci-tx-sync-tests.sh | ||
|
|
||
| coverage: | ||
| needs: fuzz | ||
| strategy: | ||
| fail-fast: false | ||
| runs-on: self-hosted | ||
|
|
@@ -133,6 +134,11 @@ jobs: | |
| # Maybe if codecov wasn't broken we wouldn't need to do this... | ||
| ./codecov --verbose upload-process --disable-search --fail-on-error -f target/codecov.json -t "f421b687-4dc2-4387-ac3d-dc3b2528af57" -F 'tests' | ||
| cargo clean | ||
| - name: Download honggfuzz corpus | ||
| uses: actions/download-artifact@v4 | ||
| with: | ||
| name: hfuzz-corpus | ||
| path: fuzz/hfuzz_workspace | ||
| - name: Run fuzz coverage generation | ||
| run: | | ||
| ./contrib/generate_fuzz_coverage.sh --output-dir `pwd` --output-codecov-json | ||
|
|
@@ -253,21 +259,47 @@ jobs: | |
|
|
||
| fuzz: | ||
| runs-on: self-hosted | ||
| env: | ||
| TOOLCHAIN: 1.75 | ||
| steps: | ||
| - name: Checkout source code | ||
| uses: actions/checkout@v4 | ||
| - name: Install Rust ${{ env.TOOLCHAIN }} toolchain | ||
| # For whatever reason, honggfuzz doesn't build on 1.75, and there's not a lot of | ||
| # reason to insist on 1.75 for fuzzing, so we just pick an MSRV of 1.80 for fuzz. | ||
| - name: Install Rust 1.80 toolchain | ||
| run: | | ||
| curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --profile=minimal --default-toolchain ${{ env.TOOLCHAIN }} | ||
| - name: Sanity check fuzz targets on Rust ${{ env.TOOLCHAIN }} | ||
| curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --profile=minimal --default-toolchain 1.80 | ||
| # This is read-only for PRs. It seeds the fuzzer for a more effective run. | ||
| # NOTE: The `key` is unique and will always miss, forcing a fallback to | ||
| # the `restore-keys` to find the latest global cache from the `main` branch. | ||
| - name: Restore persistent fuzz corpus (PR) | ||
| if: ${{ github.ref != 'refs/heads/main' }} | ||
| uses: actions/cache/restore@v4 | ||
| with: | ||
| path: fuzz/hfuzz_workspace | ||
| key: fuzz-corpus-${{ github.ref }}-${{ github.sha }} | ||
| restore-keys: | | ||
| fuzz-corpus-refs/heads/main- | ||
| # Only on the `main` branch, restores the latest corpus and also save a | ||
| # new, updated one. | ||
| - name: Restore/Save persistent honggfuzz corpus (Main) | ||
| if: ${{ github.ref == 'refs/heads/main' }} | ||
| uses: actions/cache@v4 | ||
| with: | ||
| path: fuzz/hfuzz_workspace | ||
| key: fuzz-corpus-refs/heads/main-${{ github.sha }} | ||
| restore-keys: | | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Presumably when running on main we don't need the restore-keys trick? |
||
| fuzz-corpus-refs/heads/main- | ||
| - name: Sanity check fuzz targets on Rust 1.80 | ||
| run: | | ||
| cd fuzz | ||
| RUSTFLAGS="--cfg=fuzzing --cfg=secp256k1_fuzz --cfg=hashes_fuzz" cargo test --verbose --color always --lib --bins -j8 | ||
| cargo clean | ||
| - name: Run fuzzers | ||
| run: cd fuzz && ./ci-fuzz.sh && cd .. | ||
| - name: Upload honggfuzz corpus | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Rather than only uploading, is there a way to make this directory persistent so that we can keep it between fuzz jobs? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I'm not sure if we really need to persist the directory here. My understanding is that the fuzz job runs on the latest code changes on every PR, so the generated corpus is tailored to the code changes on that PR. If we persist the corpus from a previous run and use that on a new run, won't that produce incorrect/misleading coverage data? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I don't think the point of the fuzz job is only to generate coverage data, but rather test the code :). Having a bit more coverage data from fuzzing than we "deserve" is okay, at least now that we split the coverage data out so that codecov shows fuzzing separately, and having persistent fuzzing corpus means our fuzzing is much more likely to catch issues. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Right, how long do you think we can have this directory persisted? The There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I believe the simple "upload-artifact" task just stores data for this CI run. What I was thinking is some kind of persistent directory that's shared across jobs so that each CI fuzz task picks up the latest directory, does some fuzzing, finds new test cases, then uploads a new copy with more tests in it. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Makes sense. I pushed eea2e4b to handle this using Github's cache action (https://github.com/actions/cache?tab=readme-ov-file). |
||
| uses: actions/upload-artifact@v4 | ||
| with: | ||
| name: hfuzz-corpus | ||
| path: fuzz/hfuzz_workspace | ||
|
|
||
| linting: | ||
| runs-on: ubuntu-latest | ||
|
|
||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Where do we save to
fuzz-corpus-refs/heads/main-? this includes the sha.