From 012386bf90aea36e1d0f32d0172b5cccac29ac20 Mon Sep 17 00:00:00 2001 From: Daniel Bigos Date: Tue, 26 Aug 2025 14:35:39 +0200 Subject: [PATCH] build(ci): optimize CI jobs --- .github/workflows/check-abi.yml | 24 ++++++-- .github/workflows/check-package.yml | 32 ++++++++--- .github/workflows/check-wasm.yml | 25 +++++++-- .github/workflows/check.yml | 55 ++++++++++++------- .github/workflows/e2e-tests.yml | 27 +++++++-- .github/workflows/gas-bench.yml | 37 +++++++++++-- .../workflows/publish-openzeppelin-crypto.yml | 17 ++++-- .../publish-openzeppelin-stylus-proc.yml | 20 +++++-- .../workflows/publish-openzeppelin-stylus.yml | 17 ++++-- .github/workflows/test.yml | 44 +++++++++------ 10 files changed, 222 insertions(+), 76 deletions(-) diff --git a/.github/workflows/check-abi.yml b/.github/workflows/check-abi.yml index 73665b97e..64ea17e2c 100644 --- a/.github/workflows/check-abi.yml +++ b/.github/workflows/check-abi.yml @@ -11,20 +11,36 @@ concurrency: cancel-in-progress: true env: CARGO_TERM_COLOR: always + CARGO_INCREMENTAL: 0 + RUST_BACKTRACE: 1 jobs: check-abi: name: Check ABI runs-on: ubuntu-latest + timeout-minutes: 30 steps: - - uses: actions/checkout@v4 + - name: Checkout code + uses: actions/checkout@v4 - - name: Install rust + - name: Install Rust toolchain uses: actions-rust-lang/setup-rust-toolchain@v1 with: rustflags: "" + cache: true + + - name: Cache cargo-stylus binary + id: cache-cargo-stylus + uses: actions/cache@v4 + with: + path: ~/.cargo/bin/cargo-stylus + key: cargo-stylus-0.6.3-${{ runner.os }} - name: Install cargo-stylus - run: cargo install --locked --force cargo-stylus@0.6.2 + if: steps.cache-cargo-stylus.outputs.cache-hit != 'true' + run: cargo install --locked --force cargo-stylus@0.6.3 + + - name: Verify cargo-stylus installation + run: cargo stylus --version - - name: Run export-abi + - name: Run export-abi check run: ./scripts/check-abi.sh diff --git a/.github/workflows/check-package.yml b/.github/workflows/check-package.yml index fadb314ca..8e1b4489f 100644 --- a/.github/workflows/check-package.yml +++ b/.github/workflows/check-package.yml @@ -13,23 +13,37 @@ concurrency: cancel-in-progress: true env: CARGO_TERM_COLOR: always + CARGO_INCREMENTAL: 0 + RUST_BACKTRACE: 1 jobs: check-package: name: Check package runs-on: ubuntu-latest + timeout-minutes: 20 + strategy: + fail-fast: false + matrix: + package: + - openzeppelin-crypto + - openzeppelin-stylus-proc + - openzeppelin-stylus steps: - - uses: actions/checkout@v4 + - name: Checkout code + uses: actions/checkout@v4 - - name: Install rust + - name: Install Rust toolchain uses: actions-rust-lang/setup-rust-toolchain@v1 with: rustflags: "" + cache: true + target: wasm32-unknown-unknown - - name: Check openzeppelin-crypto - run: cargo package -p openzeppelin-crypto --target wasm32-unknown-unknown + - name: Check package ${{ matrix.package }} + run: cargo package -p ${{ matrix.package }} --target wasm32-unknown-unknown - - name: Check openzeppelin-stylus-proc - run: cargo package -p openzeppelin-stylus-proc --target wasm32-unknown-unknown - - - name: Check openzeppelin-stylus - run: cargo package -p openzeppelin-stylus --target wasm32-unknown-unknown + - name: Verify package contents + run: | + crate_file=$(find target/package -name "${{ matrix.package }}-*.crate" | head -1) + if [ -z "$crate_file" ]; then + exit 1 + fi diff --git a/.github/workflows/check-wasm.yml b/.github/workflows/check-wasm.yml index 604364138..0c538e274 100644 --- a/.github/workflows/check-wasm.yml +++ b/.github/workflows/check-wasm.yml @@ -12,20 +12,37 @@ concurrency: cancel-in-progress: true env: CARGO_TERM_COLOR: always + CARGO_INCREMENTAL: 0 + RUST_BACKTRACE: 1 jobs: check-wasm: name: Check WASM binary runs-on: ubuntu-latest + timeout-minutes: 30 steps: - - uses: actions/checkout@v4 + - name: Checkout code + uses: actions/checkout@v4 - - name: Install rust + - name: Install Rust toolchain uses: actions-rust-lang/setup-rust-toolchain@v1 with: rustflags: "" + cache: true + target: wasm32-unknown-unknown + + - name: Cache cargo-stylus binary + id: cache-cargo-stylus + uses: actions/cache@v4 + with: + path: ~/.cargo/bin/cargo-stylus + key: cargo-stylus-0.6.3-${{ runner.os }} - name: Install cargo-stylus - run: cargo install --locked --force cargo-stylus@0.6.2 + if: steps.cache-cargo-stylus.outputs.cache-hit != 'true' + run: cargo install --locked --force cargo-stylus@0.6.3 + + - name: Verify cargo-stylus installation + run: cargo stylus --version - - name: Run wasm check + - name: Run WASM check run: ./scripts/check-wasm.sh diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index ed92f96ee..c0c8358a2 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -23,16 +23,20 @@ concurrency: cancel-in-progress: true env: CARGO_TERM_COLOR: always + CARGO_INCREMENTAL: 0 + RUST_BACKTRACE: 1 jobs: fmt: runs-on: ubuntu-latest name: nightly / fmt + timeout-minutes: 10 steps: - - uses: actions/checkout@v4 + - name: Checkout code + uses: actions/checkout@v4 with: submodules: true - - name: Install rust + - name: Install Rust nightly # We run in nightly to make use of some features only available there. # Check out `rustfmt.toml` to see which ones. uses: actions-rust-lang/setup-rust-toolchain@v1 @@ -40,6 +44,7 @@ jobs: toolchain: nightly components: rustfmt rustflags: "" + cache: true - name: Check formatting run: cargo fmt --all --check @@ -47,6 +52,7 @@ jobs: clippy: runs-on: ubuntu-latest name: ${{ matrix.toolchain }} / clippy + timeout-minutes: 20 permissions: contents: read checks: write @@ -57,22 +63,25 @@ jobs: # channels. toolchain: [stable, beta] steps: - - uses: actions/checkout@v4 + - name: Checkout code + uses: actions/checkout@v4 with: submodules: true - - name: Install rust ${{ matrix.toolchain }} + - name: Install Rust ${{ matrix.toolchain }} uses: actions-rust-lang/setup-rust-toolchain@v1 with: toolchain: ${{ matrix.toolchain }} components: clippy rustflags: "" + cache: true - name: Cargo clippy uses: giraffate/clippy-action@v1 with: reporter: "github-pr-check" github_token: ${{ secrets.GITHUB_TOKEN }} + doc: # Run docs generation on nightly rather than stable. This enables features # like https://doc.rust-lang.org/beta/unstable-book/language-features/doc-cfg.html @@ -80,18 +89,21 @@ jobs: # platforms. runs-on: ubuntu-latest name: nightly / doc + timeout-minutes: 15 steps: - - uses: actions/checkout@v4 + - name: Checkout code + uses: actions/checkout@v4 with: submodules: true - - name: Install rust + - name: Install Rust nightly uses: actions-rust-lang/setup-rust-toolchain@v1 with: toolchain: nightly rustflags: "" + cache: true - - name: Cargo doc + - name: Generate Rust documentation run: cargo doc --no-deps --all-features env: RUSTDOCFLAGS: --cfg docsrs @@ -101,35 +113,39 @@ jobs: # are all additive which is required for feature unification. runs-on: ubuntu-latest name: ubuntu / stable / features + timeout-minutes: 25 steps: - - uses: actions/checkout@v4 + - name: Checkout code + uses: actions/checkout@v4 with: submodules: true - - name: Install rust + - name: Install Rust stable uses: actions-rust-lang/setup-rust-toolchain@v1 with: toolchain: stable target: wasm32-unknown-unknown rustflags: "" + cache: true - - name: Cargo install cargo-hack + - name: Install cargo-hack uses: taiki-e/install-action@cargo-hack # Intentionally no target specifier; see https://github.com/jonhoo/rust-ci-conf/pull/4 # `--feature-powerset` runs for every combination of features. Note that # target in this context means one of `--lib`, `--bin`, etc, and not the # target triple. - - name: Cargo hack + - name: Run feature powerset check run: cargo hack check --feature-powerset --depth 2 --release --target wasm32-unknown-unknown --workspace --exclude e2e --exclude basic-script-example --exclude benches typos: runs-on: ubuntu-latest name: ubuntu / stable / typos + timeout-minutes: 5 steps: - - name: Checkout Actions Repository + - name: Checkout code uses: actions/checkout@v4 - - name: Check spelling of files in the workspace + - name: Check spelling uses: crate-ci/typos@v1 nostd: @@ -137,22 +153,23 @@ jobs: # library. runs-on: ubuntu-latest name: ${{ matrix.target }} + timeout-minutes: 15 strategy: matrix: target: [wasm32-unknown-unknown] steps: - - uses: actions/checkout@v4 + - name: Checkout code + uses: actions/checkout@v4 with: submodules: true - - name: Install rust + - name: Install Rust stable uses: actions-rust-lang/setup-rust-toolchain@v1 with: toolchain: stable rustflags: "" + cache: true + target: ${{ matrix.target }} - - name: Add rust targets ${{ matrix.target }} - run: rustup target add ${{ matrix.target }} - - - name: Cargo check + - name: Check no-std compatibility run: cargo check --release --target ${{ matrix.target }} --no-default-features diff --git a/.github/workflows/e2e-tests.yml b/.github/workflows/e2e-tests.yml index 2864aa947..a25311d2a 100644 --- a/.github/workflows/e2e-tests.yml +++ b/.github/workflows/e2e-tests.yml @@ -18,24 +18,41 @@ concurrency: cancel-in-progress: true env: CARGO_TERM_COLOR: always + CARGO_INCREMENTAL: 0 + RUST_BACKTRACE: 1 jobs: required: name: tests runs-on: ubuntu-latest + timeout-minutes: 45 steps: - - uses: actions/checkout@v4 + - name: Checkout code + uses: actions/checkout@v4 - - name: Install rust + - name: Install Rust toolchain uses: actions-rust-lang/setup-rust-toolchain@v1 with: cache-key: "e2e-tests" rustflags: "" + cache: true + target: wasm32-unknown-unknown + + - name: Cache cargo-stylus binary + id: cache-cargo-stylus + uses: actions/cache@v4 + with: + path: ~/.cargo/bin/cargo-stylus + key: cargo-stylus-0.6.3-${{ runner.os }} - name: Install cargo-stylus - run: cargo install --locked --force cargo-stylus@0.6.2 + if: steps.cache-cargo-stylus.outputs.cache-hit != 'true' + run: cargo install --locked --force cargo-stylus@0.6.3 + + - name: Verify cargo-stylus installation + run: cargo stylus --version - - name: Setup nitro node + - name: Setup nitro testnode run: ./scripts/nitro-testnode.sh -d -i - - name: run integration tests + - name: Run integration tests run: ./scripts/e2e-tests.sh diff --git a/.github/workflows/gas-bench.yml b/.github/workflows/gas-bench.yml index 963997cc9..7007e4f64 100644 --- a/.github/workflows/gas-bench.yml +++ b/.github/workflows/gas-bench.yml @@ -12,27 +12,54 @@ concurrency: cancel-in-progress: true env: CARGO_TERM_COLOR: always + CARGO_INCREMENTAL: 0 + RUST_BACKTRACE: 1 jobs: required: name: Gas usage report runs-on: ubuntu-latest + timeout-minutes: 45 steps: - - uses: actions/checkout@v4 + - name: Checkout code + uses: actions/checkout@v4 - - name: Install rust + - name: Install Rust toolchain uses: actions-rust-lang/setup-rust-toolchain@v1 with: cache-key: "gas-bench" rustflags: "" + cache: true + target: wasm32-unknown-unknown + + - name: Cache cargo-stylus binary + id: cache-cargo-stylus + uses: actions/cache@v4 + with: + path: ~/.cargo/bin/cargo-stylus + key: cargo-stylus-0.6.3-${{ runner.os }} - name: Install cargo-stylus - run: cargo install --locked --force cargo-stylus@0.6.2 + if: steps.cache-cargo-stylus.outputs.cache-hit != 'true' + run: cargo install --locked --force cargo-stylus@0.6.3 + + - name: Cache wasm-opt binary + id: cache-wasm-opt + uses: actions/cache@v4 + with: + path: ~/.cargo/bin/wasm-opt + key: wasm-opt-0.116.1-${{ runner.os }} - name: Install wasm-opt + if: steps.cache-wasm-opt.outputs.cache-hit != 'true' run: cargo install wasm-opt@0.116.1 - - name: Setup nitro node + - name: Verify installations + run: | + cargo stylus --version + wasm-opt --version + + - name: Setup nitro testnode run: ./scripts/nitro-testnode.sh -d -i - - name: run benches + - name: Run benchmarks run: ./scripts/bench.sh diff --git a/.github/workflows/publish-openzeppelin-crypto.yml b/.github/workflows/publish-openzeppelin-crypto.yml index 7186570bc..82bfe82d5 100644 --- a/.github/workflows/publish-openzeppelin-crypto.yml +++ b/.github/workflows/publish-openzeppelin-crypto.yml @@ -11,22 +11,31 @@ concurrency: cancel-in-progress: true env: CARGO_TERM_COLOR: always + CARGO_INCREMENTAL: 0 + RUST_BACKTRACE: 1 jobs: check-publish: name: Publish openzeppelin-crypto on crates.io env: OPENZEPPELIN_CRYPTO_TOKEN: ${{ secrets.OPENZEPPELIN_CRYPTO_TOKEN }} runs-on: ubuntu-latest + timeout-minutes: 15 steps: - - uses: actions/checkout@v4 + - name: Checkout code + uses: actions/checkout@v4 - - name: Install rust + - name: Install Rust toolchain uses: actions-rust-lang/setup-rust-toolchain@v1 with: rustflags: "" + cache: true + target: wasm32-unknown-unknown - - name: Check openzeppelin-crypto + - name: Verify package can be built + run: cargo check -p openzeppelin-crypto --target wasm32-unknown-unknown + + - name: Dry run publish run: cargo publish -p openzeppelin-crypto --target wasm32-unknown-unknown --dry-run - - name: Publish openzeppelin-crypto + - name: Publish to crates.io run: cargo publish -p openzeppelin-crypto --target wasm32-unknown-unknown --token $OPENZEPPELIN_CRYPTO_TOKEN diff --git a/.github/workflows/publish-openzeppelin-stylus-proc.yml b/.github/workflows/publish-openzeppelin-stylus-proc.yml index b2b80a7ed..451414d4a 100644 --- a/.github/workflows/publish-openzeppelin-stylus-proc.yml +++ b/.github/workflows/publish-openzeppelin-stylus-proc.yml @@ -2,29 +2,37 @@ name: publish openzeppelin-stylus-proc # This workflow publishes openzeppelin-stylus-proc on crates.io. permissions: contents: read -on: - workflow_dispatch +on: workflow_dispatch concurrency: group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} cancel-in-progress: true env: CARGO_TERM_COLOR: always + CARGO_INCREMENTAL: 0 + RUST_BACKTRACE: 1 jobs: check-publish: name: Publish openzeppelin-stylus-proc on crates.io env: OPENZEPPELIN_STYLUS_PROC_TOKEN: ${{ secrets.OPENZEPPELIN_STYLUS_PROC_TOKEN }} runs-on: ubuntu-latest + timeout-minutes: 15 steps: - - uses: actions/checkout@v4 + - name: Checkout code + uses: actions/checkout@v4 - - name: Install rust + - name: Install Rust toolchain uses: actions-rust-lang/setup-rust-toolchain@v1 with: rustflags: "" + cache: true + target: wasm32-unknown-unknown - - name: Check openzeppelin-stylus-proc + - name: Verify package can be built + run: cargo check -p openzeppelin-stylus-proc --target wasm32-unknown-unknown + + - name: Dry run publish run: cargo publish -p openzeppelin-stylus-proc --target wasm32-unknown-unknown --dry-run - - name: Publish openzeppelin-stylus-proc + - name: Publish to crates.io run: cargo publish -p openzeppelin-stylus-proc --target wasm32-unknown-unknown --token $OPENZEPPELIN_STYLUS_PROC_TOKEN diff --git a/.github/workflows/publish-openzeppelin-stylus.yml b/.github/workflows/publish-openzeppelin-stylus.yml index dbbe1f845..cfd0a5461 100644 --- a/.github/workflows/publish-openzeppelin-stylus.yml +++ b/.github/workflows/publish-openzeppelin-stylus.yml @@ -11,22 +11,31 @@ concurrency: cancel-in-progress: true env: CARGO_TERM_COLOR: always + CARGO_INCREMENTAL: 0 + RUST_BACKTRACE: 1 jobs: check-publish: name: Publish openzeppelin-stylus on crates.io env: OPENZEPPELIN_STYLUS_TOKEN: ${{ secrets.OPENZEPPELIN_STYLUS_TOKEN }} runs-on: ubuntu-latest + timeout-minutes: 15 steps: - - uses: actions/checkout@v4 + - name: Checkout code + uses: actions/checkout@v4 - - name: Install rust + - name: Install Rust toolchain uses: actions-rust-lang/setup-rust-toolchain@v1 with: rustflags: "" + cache: true + target: wasm32-unknown-unknown - - name: Check openzeppelin-stylus + - name: Verify package can be built + run: cargo check -p openzeppelin-stylus --target wasm32-unknown-unknown + + - name: Dry run publish run: cargo publish -p openzeppelin-stylus --target wasm32-unknown-unknown --dry-run - - name: Publish openzeppelin-stylus + - name: Publish to crates.io run: cargo publish -p openzeppelin-stylus --target wasm32-unknown-unknown --token $OPENZEPPELIN_STYLUS_TOKEN diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 853cc79ba..89a3b0b02 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -24,32 +24,37 @@ concurrency: cancel-in-progress: true env: CARGO_TERM_COLOR: always + CARGO_INCREMENTAL: 0 + RUST_BACKTRACE: 1 jobs: required: runs-on: ubuntu-latest name: ubuntu / ${{ matrix.toolchain }} + timeout-minutes: 25 strategy: matrix: # Run on stable and beta to ensure that tests won't break on the next # version of the rust toolchain. toolchain: [stable, beta] steps: - - uses: actions/checkout@v4 + - name: Checkout code + uses: actions/checkout@v4 with: submodules: true - - name: Install rust ${{ matrix.toolchain }} + - name: Install Rust ${{ matrix.toolchain }} uses: actions-rust-lang/setup-rust-toolchain@v1 with: toolchain: ${{ matrix.toolchain }} rustflags: "" + cache: true - - name: "Install nextest" + - name: Install nextest uses: taiki-e/install-action@v2 with: tool: cargo-nextest - - name: Cargo generate-lockfile + - name: Generate lockfile if missing # Enable this ci template to run regardless of whether the lockfile is # checked in or not. if: hashFiles('Cargo.lock') == '' @@ -62,10 +67,12 @@ jobs: # https://github.com/rust-lang/cargo/issues/6669 - name: Run doc tests run: cargo test --locked --doc + os-check: # Run cargo test on MacOS and Windows. runs-on: ${{ matrix.os }} name: ${{ matrix.os }} / stable + timeout-minutes: 30 strategy: fail-fast: false matrix: @@ -73,22 +80,24 @@ jobs: # Windows fails because of `stylus-proc`. # os: [macos-latest, windows-latest] steps: - - uses: actions/checkout@v4 + - name: Checkout code + uses: actions/checkout@v4 with: submodules: true - - name: Install rust + - name: Install Rust stable uses: actions-rust-lang/setup-rust-toolchain@v1 with: toolchain: stable rustflags: "" + cache: true - - name: "Install nextest" + - name: Install nextest uses: taiki-e/install-action@v2 with: tool: cargo-nextest - - name: Cargo generate-lockfile + - name: Generate lockfile if missing if: hashFiles('Cargo.lock') == '' run: cargo generate-lockfile @@ -119,12 +128,14 @@ jobs: # for lots of more discussion. runs-on: ubuntu-latest name: ubuntu / nightly / coverage + timeout-minutes: 35 steps: - - uses: actions/checkout@v4 + - name: Checkout code + uses: actions/checkout@v4 with: submodules: true - - name: Install rust + - name: Install Rust nightly # We run in nightly to make use of the `#[coverage(off)]` attribute (see _contracts/src/lib.rs_) # We'll return to stable release after the tracking issue is merged (and the feature is stable) # See: https://github.com/rust-lang/rust/issues/84605 @@ -133,26 +144,27 @@ jobs: toolchain: nightly components: llvm-tools-preview rustflags: "" + cache: true - - name: Cargo install cargo-llvm-cov + - name: Install cargo-llvm-cov uses: taiki-e/install-action@cargo-llvm-cov - - name: "Install nextest" + - name: Install nextest uses: taiki-e/install-action@v2 with: tool: cargo-nextest - - name: Cargo generate-lockfile + - name: Generate lockfile if missing if: hashFiles('Cargo.lock') == '' run: cargo generate-lockfile - - name: Cargo llvm-cov + - name: Generate coverage report run: cargo llvm-cov --locked --lcov --output-path lcov.info -p openzeppelin-stylus -p openzeppelin-stylus-proc -p openzeppelin-crypto - name: Record Rust version run: echo "RUST=$(rustc --version)" >> "$GITHUB_ENV" - - name: Prepare report for Codecov + - name: Run tests with coverage profile run: cargo nextest run --profile ci --locked --all-targets -p openzeppelin-stylus -p openzeppelin-stylus-proc -p openzeppelin-crypto --features ruint - name: Upload test results to Codecov @@ -162,7 +174,7 @@ jobs: files: target/nextest/ci/junit.xml token: ${{ secrets.CODECOV_TOKEN }} - - name: Upload to codecov.io + - name: Upload coverage to Codecov uses: codecov/codecov-action@v5 with: fail_ci_if_error: true