From 50a4b2a8a2ea82c9e8ec2eb0af8428bb68c2f51a Mon Sep 17 00:00:00 2001 From: DaniPopes <57450786+DaniPopes@users.noreply.github.com> Date: Fri, 24 Feb 2023 20:45:48 +0100 Subject: [PATCH] ci: improve main CI jobs --- .github/scripts/install_test_binaries.sh | 45 +++ .github/workflows/ci.yml | 358 ++++++++++------------- 2 files changed, 205 insertions(+), 198 deletions(-) create mode 100755 .github/scripts/install_test_binaries.sh diff --git a/.github/scripts/install_test_binaries.sh b/.github/scripts/install_test_binaries.sh new file mode 100755 index 00000000..8c0634cd --- /dev/null +++ b/.github/scripts/install_test_binaries.sh @@ -0,0 +1,45 @@ +#!/usr/bin/env bash +# Installs Solc and Geth binaries +set -e + +GETH_BUILD=${GETH_BUILD:-"1.11.2-73b01f40"} +SOLC_VERSION=${SOLC_VERSION:-"0.8.19"} + +DIR="$HOME/bin" +# DIR="$HOME/github/danipopes/ethers-rs/test_bin" +mkdir -p "$DIR" +cd "$DIR" +export PATH="$DIR:$PATH" + +echo "Installing Geth" +PLATFORM="$(uname -s)" +case "$PLATFORM" in + Linux|Darwin) + GETH_ARCHIVE_NAME="geth-${PLATFORM,,}-amd64-$GETH_BUILD" + curl "https://gethstore.blob.core.windows.net/builds/$GETH_ARCHIVE_NAME.tar.gz" | tar -xzvf - + mv -f "$GETH_ARCHIVE_NAME/geth" ./ + rm -rf "$GETH_ARCHIVE_NAME" + chmod +x geth + ;; + *) + GETH_ARCHIVE_NAME="geth-windows-amd64-$GETH_BUILD" + wget -q "https://gethstore.blob.core.windows.net/builds/$GETH_ARCHIVE_NAME.zip" + unzip "$GETH_ARCHIVE_NAME.zip" + mv -f "$GETH_ARCHIVE_NAME/geth.exe" ./ + rm -rf "$GETH_ARCHIVE_NAME" "$GETH_ARCHIVE_NAME.zip" + ;; +esac + +geth version + +echo "Installing Solc" +cargo install --locked svm-rs +# install only if it doesn't exist already +if command -v solc; then + if [ -z "$(solc --version | grep "$SOLC_VERSION" || true)" ]; then + svm install "$SOLC_VERSION" + fi + svm use "$SOLC_VERSION" +fi + +solc --version diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 16d62793..ea878283 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,11 +1,10 @@ +name: CI + on: push: - branches: - - master + branches: [master] pull_request: -name: Tests - # Yeah I know it's bad practice to have API keys, this is a read-only API key # so that we do not get rate limited by Etherscan (and it's free to generate as # many as you want) @@ -13,215 +12,181 @@ env: ETHERSCAN_API_KEY_ETHEREUM: I5BXNZYP5GEDWFINGVEZKYIVU2695NPQZB ETHERSCAN_API_KEY_CELO: B13XSMUT6Q3Q4WZ5DNQR8RXDBA2KNTMT4M GOERLI_PRIVATE_KEY: "fa4a1a79e869a96fcb42727f75e3232d6865a82ea675bb95de967a7fe6a773b2" - GETH_BUILD: 1.10.26-e5eb32ac + GETH_BUILD: "1.11.2-73b01f40" + SOLC_VERSION: "0.8.19" + RUSTFLAGS: "-D warnings" jobs: tests: - name: ethereum tests - runs-on: ubuntu-latest + name: tests ${{ matrix.toolchain }}-${{ matrix.job.target }} + runs-on: ${{ matrix.job.os }} + strategy: + fail-fast: false + matrix: + job: + - os: ubuntu-latest + target: x86_64-unknown-linux-gnu + - os: macos-latest + target: x86_64-apple-darwin + - os: windows-latest + target: x86_64-pc-windows-msvc + - os: ubuntu-latest + target: wasm32-unkown-unkown + toolchain: ["stable", "nightly"] steps: - - name: Checkout sources - uses: actions/checkout@v3 + - uses: actions/checkout@v3 + - uses: dtolnay/rust-toolchain@master + with: + toolchain: ${{ matrix.toolchain }} + targets: ${{ matrix.job.target }} - name: Install Anvil uses: foundry-rs/foundry-toolchain@v1 with: version: nightly - - name: Install Solc - run: | - mkdir -p "$HOME/bin" - wget -q https://github.com/ethereum/solidity/releases/download/v0.8.10/solc-static-linux -O $HOME/bin/solc - chmod u+x "$HOME/bin/solc" - export PATH=$HOME/bin:$PATH - solc --version - - - 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 - geth version - - name: Install stable toolchain - uses: actions-rs/toolchain@v1 - with: - profile: minimal - toolchain: stable - override: true - components: rustfmt, clippy - - uses: Swatinem/rust-cache@v1 + - name: Install test binaries + shell: bash + run: ./.github/scripts/install_test_binaries.sh + - uses: Swatinem/rust-cache@v2 with: cache-on-failure: true - - name: cargo test + - name: test + shell: bash run: | - export PATH=$HOME/bin:$PATH - export ETHERSCAN_API_KEY=$ETHERSCAN_API_KEY_ETHEREUM - cargo test + export ETHERSCAN_API_KEY="$ETHERSCAN_API_KEY_ETHEREUM" + rustup run ${{ matrix.toolchain }}-${{ matrix.job.target }} cargo test --workspace feature-tests: - name: celo tests - runs-on: ubuntu-latest + name: feature tests ${{ matrix.toolchain }}-${{ matrix.job.target }} + runs-on: ${{ matrix.job.os }} + strategy: + fail-fast: false + matrix: + job: + - os: ubuntu-latest + target: x86_64-unknown-linux-gnu + - os: macos-latest + target: x86_64-apple-darwin + - os: windows-latest + target: x86_64-pc-windows-msvc + toolchain: ["stable", "nightly"] steps: - - name: Checkout sources - uses: actions/checkout@v3 - # TODO: can we combine these shared steps in github actions? + - uses: actions/checkout@v3 + - uses: dtolnay/rust-toolchain@master + with: + toolchain: ${{ matrix.toolchain }} + targets: ${{ matrix.job.target }} - name: Install Anvil uses: foundry-rs/foundry-toolchain@v1 with: version: nightly - - name: Install Solc - run: | - mkdir -p "$HOME/bin" - wget -q https://github.com/ethereum/solidity/releases/download/v0.8.10/solc-static-linux -O $HOME/bin/solc - chmod u+x "$HOME/bin/solc" - export PATH=$HOME/bin:$PATH - solc --version - - 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 - geth version - - - name: Install stable toolchain - uses: actions-rs/toolchain@v1 - with: - profile: minimal - toolchain: stable - override: true - components: rustfmt, clippy - - uses: Swatinem/rust-cache@v1 + - name: Install test binaries + shell: bash + run: ./.github/scripts/install_test_binaries.sh + - uses: Swatinem/rust-cache@v2 with: cache-on-failure: true - - name: cargo test (Celo) + - name: test + shell: bash run: | - export PATH=$HOME/bin:$PATH - export ETHERSCAN_API_KEY=$ETHERSCAN_API_KEY_CELO - cargo test --all-features + export ETHERSCAN_API_KEY="$ETHERSCAN_API_KEY_CELO" + rustup run ${{ matrix.toolchain }}-${{ matrix.job.target }} cargo test --workspace - lint: - name: lints + features: + name: features runs-on: ubuntu-latest steps: - - name: Checkout sources - uses: actions/checkout@v3 - - name: Install toolchain - uses: actions-rs/toolchain@v1 + - uses: actions/checkout@v3 + - uses: dtolnay/rust-toolchain@nightly + - uses: Swatinem/rust-cache@v2 + - uses: taiki-e/install-action@cargo-hack + - name: cargo hack + run: + cargo hack check --all --feature-powerset --depth 2 -Z avoid-dev-deps --keep-going + + clippy: + name: clippy + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: dtolnay/rust-toolchain@nightly with: - toolchain: nightly - profile: minimal - components: rustfmt, clippy - override: true - - uses: Swatinem/rust-cache@v1 - with: - cache-on-failure: true - - name: cargo fmt - run: cargo +nightly fmt --all -- --check - - name: cargo clippy - run: cargo +nightly clippy --all-features -- -D warnings + components: clippy + - uses: Swatinem/rust-cache@v2 + - name: clippy + run: cargo clippy --workspace --tests --all-features docs: name: docs runs-on: ubuntu-latest steps: - - name: Checkout sources - uses: actions/checkout@v3 - - name: Install toolchain - uses: actions-rs/toolchain@v1 + - uses: actions/checkout@v3 + - uses: dtolnay/rust-toolchain@master with: - toolchain: nightly - override: true - - uses: Swatinem/rust-cache@v1 + # TODO: Remove nightly override: rust-lang/rust#{108334,108378} + toolchain: nightly-2023-02-07 + components: rust-docs + - uses: Swatinem/rust-cache@v2 + - name: doc + run: cargo doc --lib --workspace --all-features + + fmt: + name: fmt + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: dtolnay/rust-toolchain@nightly with: - cache-on-failure: true - - name: cargo doc - run: cargo +nightly doc --lib --all-features - env: - RUSTFLAGS: --cfg docsrs - RUSTDOCFLAGS: --cfg docsrs -Dwarnings + components: rustfmt + - name: fmt --check + run: cargo fmt --all --check wasm: name: WASM runs-on: ubuntu-latest - steps: - - name: Checkout sources - uses: actions/checkout@v3 - - name: Install rust - uses: actions-rs/toolchain@v1 + - uses: actions/checkout@v3 + - uses: dtolnay/rust-toolchain@stable with: - toolchain: stable target: wasm32-unknown-unknown - profile: minimal - override: true - - name: Install Anvil uses: foundry-rs/foundry-toolchain@v1 with: version: nightly - - uses: Swatinem/rust-cache@v1 + - uses: Swatinem/rust-cache@v2 with: cache-on-failure: true - - name: Check - uses: actions-rs/cargo@v1 - with: - command: check - args: --target wasm32-unknown-unknown - - - name: Launch Anvil - run: - anvil --block-time 2 -m "stuff inherit faith park genre spread huge knee ecology - private marble supreme" & + run: rustup run wasm32-unknown-unknown cargo check --workspace + - name: Check all features + run: rustup run wasm32-unknown-unknown cargo check --workspace --all-features - name: Install wasm-pack run: curl https://rustwasm.github.io/wasm-pack/installer/init.sh -sSf | sh - - - name: Wasm-pack test firefox + - uses: actions/setup-node@v3 + with: + node-version: 16 + cache: yarn + - name: Run wasm example run: | cd examples/ethers-wasm + yarn + yarn anvil & wasm-pack test --headless --firefox - - - name: Wasm-pack test chrome - run: | - cd examples/ethers-wasm wasm-pack test --headless --chrome + kill %1 examples: name: Examples runs-on: ubuntu-latest steps: - - name: Checkout sources - uses: actions/checkout@v3 - - - name: Install geth (for state overrides example) - 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 - geth version - + - uses: actions/checkout@v3 - name: Install Anvil uses: foundry-rs/foundry-toolchain@v1 with: version: nightly - - - name: Install Solc - run: | - mkdir -p "$HOME/bin" - wget -q https://github.com/ethereum/solidity/releases/download/v0.8.10/solc-static-linux -O $HOME/bin/solc - chmod u+x "$HOME/bin/solc" - export PATH=$HOME/bin:$PATH - solc --version - + - name: Install test binaries + run: ./.github/scripts/install_test_binaries.sh - name: Install stable toolchain uses: actions-rs/toolchain@v1 with: @@ -229,60 +194,57 @@ jobs: toolchain: stable override: true components: rustfmt, clippy - - uses: Swatinem/rust-cache@v1 + - uses: Swatinem/rust-cache@v2 with: cache-on-failure: true - name: Build and run all examples - run: | - export PATH=$HOME/bin:$PATH - chmod +x ./scripts/examples.sh - ./scripts/examples.sh + run: ./scripts/examples.sh - windows-build: - runs-on: windows-latest - name: (${{ matrix.target }}, ${{ matrix.cfg_release_channel }}) - env: - CFG_RELEASE_CHANNEL: ${{ matrix.cfg_release_channel }} - strategy: - fail-fast: false - matrix: - target: - [ - i686-pc-windows-gnu, - i686-pc-windows-msvc, - x86_64-pc-windows-gnu, - x86_64-pc-windows-msvc, - ] - cfg_release_channel: [nightly] + # windows-build: + # runs-on: windows-latest + # name: (${{ matrix.target }}, ${{ matrix.cfg_release_channel }}) + # env: + # CFG_RELEASE_CHANNEL: ${{ matrix.cfg_release_channel }} + # strategy: + # fail-fast: false + # matrix: + # target: + # [ + # i686-pc-windows-gnu, + # i686-pc-windows-msvc, + # x86_64-pc-windows-gnu, + # x86_64-pc-windows-msvc, + # ] + # cfg_release_channel: [nightly] - steps: - - name: checkout - uses: actions/checkout@v3 + # steps: + # - name: checkout + # uses: actions/checkout@v3 - # Run build - - name: Update Rustup - run: | - # disable download progress bar - $ProgressPreference = "SilentlyContinue" - rustup update - rustup target add ${{ matrix.target }} - shell: powershell + # # Run build + # - name: Update Rustup + # run: | + # # disable download progress bar + # $ProgressPreference = "SilentlyContinue" + # rustup update + # rustup target add ${{ matrix.target }} + # shell: powershell - - name: Add mingw32 to path for i686-gnu - run: | - echo "C:\msys64\mingw32\bin" >> $GITHUB_PATH - if: matrix.target == 'i686-pc-windows-gnu' && matrix.channel == 'nightly' - shell: bash + # - name: Add mingw32 to path for i686-gnu + # run: | + # echo "C:\msys64\mingw32\bin" >> $GITHUB_PATH + # if: matrix.target == 'i686-pc-windows-gnu' && matrix.channel == 'nightly' + # shell: bash - - name: Add mingw64 to path for x86_64-gnu - run: echo "C:\msys64\mingw64\bin" >> $GITHUB_PATH - if: matrix.target == 'x86_64-pc-windows-gnu' && matrix.channel == 'nightly' - shell: bash + # - name: Add mingw64 to path for x86_64-gnu + # run: echo "C:\msys64\mingw64\bin" >> $GITHUB_PATH + # if: matrix.target == 'x86_64-pc-windows-gnu' && matrix.channel == 'nightly' + # shell: bash - - name: build - run: | - rustc -Vv - cargo -V - # we test without --all-features on Windows so that sha2-asm is not activated. - cargo check - shell: cmd + # - name: build + # run: | + # rustc -Vv + # cargo -V + # # we test without --all-features on Windows so that sha2-asm is not activated. + # cargo check + # shell: cmd