From f63c8d7e369d0a8b72837869a54907f04167808c Mon Sep 17 00:00:00 2001 From: Bjerg Date: Tue, 14 Feb 2023 17:49:18 +0100 Subject: [PATCH] ci: split ci workflow (#1345) --- .github/workflows/bench.yml | 55 ++++++++ .github/workflows/ci.yml | 199 +---------------------------- .github/workflows/fuzz.yml | 65 ++++++++++ .github/workflows/integration.yml | 89 +++++++++++++ .github/workflows/unit.yml | 89 +++++++++++++ docs/README.md | 1 + docs/crates/README.md | 9 ++ docs/{repo => }/crates/db.md | 0 docs/{repo => }/crates/discv4.md | 0 docs/{repo => }/crates/eth-wire.md | 0 docs/{repo => }/crates/network.md | 0 docs/{repo => }/crates/stages.md | 0 docs/repo/README.md | 1 + docs/repo/ci.md | 32 +++++ 14 files changed, 343 insertions(+), 197 deletions(-) create mode 100644 .github/workflows/bench.yml create mode 100644 .github/workflows/fuzz.yml create mode 100644 .github/workflows/integration.yml create mode 100644 .github/workflows/unit.yml create mode 100644 docs/crates/README.md rename docs/{repo => }/crates/db.md (100%) rename docs/{repo => }/crates/discv4.md (100%) rename docs/{repo => }/crates/eth-wire.md (100%) rename docs/{repo => }/crates/network.md (100%) rename docs/{repo => }/crates/stages.md (100%) create mode 100644 docs/repo/ci.md diff --git a/.github/workflows/bench.yml b/.github/workflows/bench.yml new file mode 100644 index 000000000..723704ffb --- /dev/null +++ b/.github/workflows/bench.yml @@ -0,0 +1,55 @@ +on: + push: + branches: + - main + pull_request: + +env: + RUSTFLAGS: -D warnings + CARGO_TERM_COLOR: always + +concurrency: + group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} + cancel-in-progress: true + +name: bench +jobs: + iai: + # Pin to `20.04` instead of `ubuntu-latest`, until ubuntu-latest migration is complete + # See also + runs-on: ubuntu-20.04 + steps: + - name: Install Valgrind + run: | + sudo apt install valgrind + + - name: Checkout PR sources + uses: actions/checkout@v3 + with: + ref: main + + - uses: Swatinem/rust-cache@v1 + with: + cache-on-failure: true + + - name: Generate test vectors + uses: actions-rs/cargo@v1 + with: + command: run + args: --bin reth -- test-vectors tables + + - name: Set main baseline + uses: actions-rs/cargo@v1 + with: + command: bench + args: --package reth-db --bench iai + + - name: Checkout main sources + uses: actions/checkout@v3 + with: + clean: false + + - name: Compare PR benchmark + shell: 'script -q -e -c "bash {0}"' # required to workaround /dev/tty not being available + run: | + ./.github/scripts/compare_iai.sh diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e141a1284..5a171f117 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -7,7 +7,6 @@ on: env: RUSTFLAGS: -D warnings CARGO_TERM_COLOR: always - GETH_BUILD: 1.10.26-e5eb32ac concurrency: group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} @@ -15,153 +14,8 @@ concurrency: name: ci jobs: - test: - # Pin to `20.04` instead of `ubuntu-latest`, until ubuntu-latest migration is complete - # See also - runs-on: ubuntu-20.04 - steps: - - name: Checkout sources - uses: actions/checkout@v3 - - name: Install toolchain - uses: dtolnay/rust-toolchain@stable - with: - components: llvm-tools-preview - - uses: Swatinem/rust-cache@v2 - with: - cache-on-failure: true - - - name: Install geth - run: | - mkdir -p "$HOME/bin" - wget -q https://gethstore.blob.core.windows.net/builds/geth-linux-amd64-$GETH_BUILD.tar.gz - tar -xvf geth-linux-amd64-$GETH_BUILD.tar.gz - mv geth-linux-amd64-$GETH_BUILD/geth $HOME/bin/geth - chmod u+x "$HOME/bin/geth" - export PATH=$HOME/bin:$PATH - echo $HOME/bin >> $GITHUB_PATH - geth version - - - name: Install latest nextest release - uses: taiki-e/install-action@nextest - - name: Install cargo-llvm-cov - uses: taiki-e/install-action@cargo-llvm-cov - - - name: Run tests - run: cargo llvm-cov nextest --lcov --output-path lcov.info --locked --workspace --all-features - - - name: Upload coverage data to codecov - uses: codecov/codecov-action@v3 - with: - token: ${{ secrets.CODECOV_TOKEN }} - files: lcov.info - flags: unit-tests - - eth-blockchain: - name: ethereum blockchain tests (stable) - runs-on: ubuntu-latest - env: - RUST_LOG: info,sync=error - steps: - - name: Checkout sources - uses: actions/checkout@v2 - - - name: Checkout ethereum/tests - uses: actions/checkout@v2 - with: - repository: ethereum/tests - path: ethtests - submodules: recursive - - - name: Install toolchain - uses: actions-rs/toolchain@v1 - with: - toolchain: stable - profile: minimal - override: true - - - uses: Swatinem/rust-cache@v1 - with: - cache-on-failure: true - - - name: Run Ethereum tests - run: cargo run --release -- test-chain ethtests/BlockchainTests/GeneralStateTests/ - - eth-sync: - name: ethereum blockchain sync (${{ matrix.profile }}; 100k blocks) - strategy: - matrix: - profile: [release, dev] - runs-on: ubuntu-latest - env: - RUST_LOG: info,sync=error - steps: - - name: Checkout sources - uses: actions/checkout@v2 - - - name: Install toolchain - uses: actions-rs/toolchain@v1 - with: - toolchain: stable - profile: minimal - - - uses: Swatinem/rust-cache@v1 - with: - cache-on-failure: true - - - name: Run Sync (debug) - run: cargo run --profile ${{ matrix.profile }} --bin reth -- node --debug.tip 0x91c90676cab257a59cd956d7cb0bceb9b1a71d79755c23c7277a0697ccfaf8c4 --debug.max-block 100000 - - fuzz: - # Skip the Fuzzing Jobs until we make them run fast and reliably. Currently they will - # always recompile the codebase for each test and that takes way too long. - if: false - - # Pin to `20.04` instead of `ubuntu-latest`, until ubuntu-latest migration is complete - # See also - runs-on: ubuntu-20.04 - strategy: - matrix: - target: - - reth-primitives - - reth-db - - reth-eth-wire - - reth-codecs - steps: - - name: Checkout sources - uses: actions/checkout@v3 - - name: Install toolchain - uses: dtolnay/rust-toolchain@stable - with: - components: llvm-tools-preview - - uses: Swatinem/rust-cache@v2 - with: - cache-on-failure: true - - - name: Install fuzzer - uses: actions-rs/cargo@v1 - with: - command: install - args: cargo-test-fuzz afl - - name: Force install cargo-afl - run: | - cargo install --force afl - cargo afl --version - - name: Install cargo-llvm-cov - uses: taiki-e/install-action@cargo-llvm-cov - - - name: Run fuzz tests - run: | - ./.github/scripts/fuzz.sh ${{ matrix.target }} - env: - AFL_I_DONT_CARE_ABOUT_MISSING_CRASHES: 1 - - name: Upload coverage data to codecov - uses: codecov/codecov-action@v3 - with: - token: ${{ secrets.CODECOV_TOKEN }} - files: lcov.info - flags: fuzz-tests - lint: + name: code lint # Pin to `20.04` instead of `ubuntu-latest`, until ubuntu-latest migration is complete # See also runs-on: ubuntu-20.04 @@ -188,17 +42,8 @@ jobs: args: --all --all-features token: ${{ secrets.GITHUB_TOKEN }} - doc-test: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - - name: Install toolchain - uses: dtolnay/rust-toolchain@stable - - uses: Swatinem/rust-cache@v2 - - name: Run doctests - run: cargo test --doc --all --all-features - doc-lint: + name: doc lint runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 @@ -207,43 +52,3 @@ jobs: - uses: Swatinem/rust-cache@v2 - name: Check if documentation builds run: RUSTDOCFLAGS="-D warnings" cargo doc --all --no-deps --all-features --document-private-items - - benchmarks: - # Pin to `20.04` instead of `ubuntu-latest`, until ubuntu-latest migration is complete - # See also - runs-on: ubuntu-20.04 - steps: - - name: Install Valgrind - run: | - sudo apt install valgrind - - - name: Checkout PR sources - uses: actions/checkout@v3 - with: - ref: main - - - uses: Swatinem/rust-cache@v1 - with: - cache-on-failure: true - - - name: Generate test-vectors - uses: actions-rs/cargo@v1 - with: - command: run - args: --bin reth -- test-vectors tables - - - name: Set main baseline - uses: actions-rs/cargo@v1 - with: - command: bench - args: --package reth-db --bench iai - - - name: Checkout main sources - uses: actions/checkout@v3 - with: - clean: false - - - name: Compare PR benchmark - shell: 'script -q -e -c "bash {0}"' # required to workaround /dev/tty not being available - run: | - ./.github/scripts/compare_iai.sh diff --git a/.github/workflows/fuzz.yml b/.github/workflows/fuzz.yml new file mode 100644 index 000000000..8134b5ef4 --- /dev/null +++ b/.github/workflows/fuzz.yml @@ -0,0 +1,65 @@ +on: + push: + branches: + - main + pull_request: + +env: + RUSTFLAGS: -D warnings + CARGO_TERM_COLOR: always + +concurrency: + group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} + cancel-in-progress: true + +name: fuzz +jobs: + all: + # Skip the Fuzzing Jobs until we make them run fast and reliably. Currently they will + # always recompile the codebase for each test and that takes way too long. + if: false + + # Pin to `20.04` instead of `ubuntu-latest`, until ubuntu-latest migration is complete + # See also + runs-on: ubuntu-20.04 + strategy: + matrix: + target: + - reth-primitives + - reth-db + - reth-eth-wire + - reth-codecs + steps: + - name: Checkout sources + uses: actions/checkout@v3 + - name: Install toolchain + uses: dtolnay/rust-toolchain@stable + with: + components: llvm-tools-preview + - uses: Swatinem/rust-cache@v2 + with: + cache-on-failure: true + + - name: Install fuzzer + uses: actions-rs/cargo@v1 + with: + command: install + args: cargo-test-fuzz afl + - name: Force install cargo-afl + run: | + cargo install --force afl + cargo afl --version + - name: Install cargo-llvm-cov + uses: taiki-e/install-action@cargo-llvm-cov + + - name: Run fuzz tests + run: | + ./.github/scripts/fuzz.sh ${{ matrix.target }} + env: + AFL_I_DONT_CARE_ABOUT_MISSING_CRASHES: 1 + - name: Upload coverage data to codecov + uses: codecov/codecov-action@v3 + with: + token: ${{ secrets.CODECOV_TOKEN }} + files: lcov.info + flags: fuzz-tests \ No newline at end of file diff --git a/.github/workflows/integration.yml b/.github/workflows/integration.yml new file mode 100644 index 000000000..8875c3452 --- /dev/null +++ b/.github/workflows/integration.yml @@ -0,0 +1,89 @@ +on: + push: + branches: + - main + pull_request: + +env: + RUSTFLAGS: -D warnings + CARGO_TERM_COLOR: always + GETH_BUILD: 1.10.26-e5eb32ac + +concurrency: + group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} + cancel-in-progress: true + +name: integration +jobs: + test: + # Pin to `20.04` instead of `ubuntu-latest`, until ubuntu-latest migration is complete + # See also + runs-on: ubuntu-20.04 + steps: + - name: Checkout sources + uses: actions/checkout@v3 + - name: Install toolchain + uses: dtolnay/rust-toolchain@stable + with: + components: llvm-tools-preview + - uses: Swatinem/rust-cache@v2 + with: + cache-on-failure: true + + - name: Install geth + run: | + mkdir -p "$HOME/bin" + wget -q https://gethstore.blob.core.windows.net/builds/geth-linux-amd64-$GETH_BUILD.tar.gz + tar -xvf geth-linux-amd64-$GETH_BUILD.tar.gz + mv geth-linux-amd64-$GETH_BUILD/geth $HOME/bin/geth + chmod u+x "$HOME/bin/geth" + export PATH=$HOME/bin:$PATH + echo $HOME/bin >> $GITHUB_PATH + geth version + + - name: Install latest nextest release + uses: taiki-e/install-action@nextest + - name: Install cargo-llvm-cov + uses: taiki-e/install-action@cargo-llvm-cov + + - name: Run tests + run: | + cargo llvm-cov nextest --lcov --output-path lcov.info \ + --locked --workspace --all-features \ + -E 'kind(test)' + + - name: Upload coverage data to codecov + uses: codecov/codecov-action@v3 + with: + token: ${{ secrets.CODECOV_TOKEN }} + files: lcov.info + flags: integration-tests + + sync: + name: sync / 100k blocks (${{ matrix.profile }}) + strategy: + matrix: + profile: [release, dev] + runs-on: ubuntu-latest + env: + RUST_LOG: info,sync=error + steps: + - name: Checkout sources + uses: actions/checkout@v2 + + - name: Install toolchain + uses: actions-rs/toolchain@v1 + with: + toolchain: stable + profile: minimal + + - uses: Swatinem/rust-cache@v1 + with: + cache-on-failure: true + + - name: Run Sync (debug) + run: | + cargo run --profile ${{ matrix.profile }} \ + --bin reth -- node \ + --debug.tip 0x91c90676cab257a59cd956d7cb0bceb9b1a71d79755c23c7277a0697ccfaf8c4 \ + --debug.max-block 100000 diff --git a/.github/workflows/unit.yml b/.github/workflows/unit.yml new file mode 100644 index 000000000..25d80e108 --- /dev/null +++ b/.github/workflows/unit.yml @@ -0,0 +1,89 @@ +on: + push: + branches: + - main + pull_request: + +env: + RUSTFLAGS: -D warnings + CARGO_TERM_COLOR: always + +concurrency: + group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} + cancel-in-progress: true + +name: unit +jobs: + test: + # Pin to `20.04` instead of `ubuntu-latest`, until ubuntu-latest migration is complete + # See also + runs-on: ubuntu-20.04 + steps: + - name: Checkout sources + uses: actions/checkout@v3 + - name: Install toolchain + uses: dtolnay/rust-toolchain@stable + with: + components: llvm-tools-preview + - uses: Swatinem/rust-cache@v2 + with: + cache-on-failure: true + + - name: Install latest nextest release + uses: taiki-e/install-action@nextest + - name: Install cargo-llvm-cov + uses: taiki-e/install-action@cargo-llvm-cov + + - name: Run tests + run: | + cargo llvm-cov nextest --lcov --output-path lcov.info \ + --locked --workspace --all-features \ + -E 'kind(lib)' -E 'kind(bin)' -E 'kind(proc-macro)' + + - name: Upload coverage data to codecov + uses: codecov/codecov-action@v3 + with: + token: ${{ secrets.CODECOV_TOKEN }} + files: lcov.info + flags: unit-tests + + eth-blockchain: + name: ethereum / state tests (stable) + runs-on: ubuntu-latest + env: + RUST_LOG: info,sync=error + steps: + - name: Checkout sources + uses: actions/checkout@v2 + + - name: Checkout ethereum/tests + uses: actions/checkout@v2 + with: + repository: ethereum/tests + path: ethtests + submodules: recursive + + - name: Install toolchain + uses: actions-rs/toolchain@v1 + with: + toolchain: stable + profile: minimal + override: true + + - uses: Swatinem/rust-cache@v1 + with: + cache-on-failure: true + + - name: Run Ethereum tests + run: cargo run --release -- test-chain ethtests/BlockchainTests/GeneralStateTests/ + + doc-test: + name: rustdoc + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: Install toolchain + uses: dtolnay/rust-toolchain@stable + - uses: Swatinem/rust-cache@v2 + - name: Run doctests + run: cargo test --doc --all --all-features diff --git a/docs/README.md b/docs/README.md index 10afca01b..3ea7f9407 100644 --- a/docs/README.md +++ b/docs/README.md @@ -4,6 +4,7 @@ This directory contains documentation for contributors. - [Repository and Project Structure](./repo) - [Design](./design) +- [Crates](./crates) ### Meta diff --git a/docs/crates/README.md b/docs/crates/README.md new file mode 100644 index 000000000..bb88b852f --- /dev/null +++ b/docs/crates/README.md @@ -0,0 +1,9 @@ +## Crates + +A tour of the various crates that make up reth. + +- [`reth-db`](./db.md) +- [`reth-discv4`](./discv4.md) +- [`reth-eth-wire`](./eth-wire.md) +- [`reth-network`](./network.md) +- [`reth-stages`](./stages.md) diff --git a/docs/repo/crates/db.md b/docs/crates/db.md similarity index 100% rename from docs/repo/crates/db.md rename to docs/crates/db.md diff --git a/docs/repo/crates/discv4.md b/docs/crates/discv4.md similarity index 100% rename from docs/repo/crates/discv4.md rename to docs/crates/discv4.md diff --git a/docs/repo/crates/eth-wire.md b/docs/crates/eth-wire.md similarity index 100% rename from docs/repo/crates/eth-wire.md rename to docs/crates/eth-wire.md diff --git a/docs/repo/crates/network.md b/docs/crates/network.md similarity index 100% rename from docs/repo/crates/network.md rename to docs/crates/network.md diff --git a/docs/repo/crates/stages.md b/docs/crates/stages.md similarity index 100% rename from docs/repo/crates/stages.md rename to docs/crates/stages.md diff --git a/docs/repo/README.md b/docs/repo/README.md index 94035dd5a..ea5699ea7 100644 --- a/docs/repo/README.md +++ b/docs/repo/README.md @@ -9,3 +9,4 @@ Documents on planning and process in the repository: what the labels mean, how i ### Structure - [Layout](./layout.md): Describes each of the crates in the repository and their function. +- [CI](./ci.md): An overview of the CI workflows \ No newline at end of file diff --git a/docs/repo/ci.md b/docs/repo/ci.md new file mode 100644 index 000000000..dabb2f991 --- /dev/null +++ b/docs/repo/ci.md @@ -0,0 +1,32 @@ +## CI + +The CI runs a couple of workflows: + +### Code + +- **[ci]**: A catch-all for small jobs. Currently only runs lints (rustfmt, clippy etc.) +- **[unit]**: Runs unit tests (tests in `src/`) and doc tests +- **[integration]**: Runs integration tests (tests in `tests/` and sync tests) +- **[fuzz]**: Runs fuzz tests +- **[bench]**: Runs benchmarks + +### Docs + +- **[book]**: Builds, tests, and deploys the book. + +### Meta + +- **[deny]**: Runs `cargo deny` to check for license conflicts and security advisories in our dependencies +- **[sanity]**: Runs a couple of sanity checks on the code every night, such as checking for unused dependencies +- **[project]**: [GitHub Projects][gh-projects] automation. + +[ci]: https://github.com/paradigmxyz/reth/blob/main/.github/workflows/ci.yml +[unit]: https://github.com/paradigmxyz/reth/blob/main/.github/workflows/unit.yml +[integration]: https://github.com/paradigmxyz/reth/blob/main/.github/workflows/integration.yml +[fuzz]: https://github.com/paradigmxyz/reth/blob/main/.github/workflows/fuzz.yml +[bench]: https://github.com/paradigmxyz/reth/blob/main/.github/workflows/bench.yml +[book]: https://github.com/paradigmxyz/reth/blob/main/.github/workflows/book.yml +[deny]: https://github.com/paradigmxyz/reth/blob/main/.github/workflows/deny.yml +[sanity]: https://github.com/paradigmxyz/reth/blob/main/.github/workflows/sanity.yml +[project]: https://github.com/paradigmxyz/reth/blob/main/.github/workflows/project.yml +[gh-projects]: https://docs.github.com/en/issues/planning-and-tracking-with-projects/automating-your-project/automating-projects-using-actions \ No newline at end of file