From 3bdffa15c3ea822e462901a181f6c31739ea05a5 Mon Sep 17 00:00:00 2001 From: pmmiranda Date: Tue, 18 Feb 2025 11:12:29 +0000 Subject: [PATCH] nimbus CI github workflow --- .github/workflows/ci.yml | 3 +- .github/workflows/kurtosis.yml | 4 +- .github/workflows/nimbus.yml | 249 +++++++++++++++++++++++++++++++++ 3 files changed, 254 insertions(+), 2 deletions(-) create mode 100644 .github/workflows/nimbus.yml diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4aaf23ce60..053ae06a51 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -8,7 +8,7 @@ # at your option. This file may not be copied, modified, or distributed except # according to those terms. -name: Nimbus CI +name: Nimbus execution client CI on: push: paths-ignore: @@ -17,6 +17,7 @@ on: - '**/*.md' - 'hive_integration/**' - 'fluffy/**' + - 'nimbus/**' - '.github/workflows/fluffy*.yml' - 'nimbus_verified_proxy/**' - '.github/workflows/nimbus_verified_proxy.yml' diff --git a/.github/workflows/kurtosis.yml b/.github/workflows/kurtosis.yml index 8f7974d4c5..4062a23a8f 100644 --- a/.github/workflows/kurtosis.yml +++ b/.github/workflows/kurtosis.yml @@ -1,5 +1,5 @@ # Nimbus -# Copyright (c) 2024 Status Research & Development GmbH +# Copyright (c) 2025 Status Research & Development GmbH # Licensed under either of # * Apache License, version 2.0, ([LICENSE-APACHE](LICENSE-APACHE) or # http://www.apache.org/licenses/LICENSE-2.0) @@ -20,6 +20,7 @@ on: - '**/*.md' - 'hive_integration/**' - 'fluffy/**' + - 'nimbus/**' - '.github/workflows/fluffy*.yml' - 'nimbus_verified_proxy/**' - '.github/workflows/nimbus_verified_proxy.yml' @@ -32,6 +33,7 @@ on: - '**/*.md' - 'hive_integration/**' - 'fluffy/**' + - 'nimbus/**' - '.github/workflows/fluffy*.yml' - 'nimbus_verified_proxy/**' - '.github/workflows/nimbus_verified_proxy.yml' diff --git a/.github/workflows/nimbus.yml b/.github/workflows/nimbus.yml new file mode 100644 index 0000000000..e1feec5ca3 --- /dev/null +++ b/.github/workflows/nimbus.yml @@ -0,0 +1,249 @@ +# Nimbus +# Copyright (c) 2025 Status Research & Development GmbH +# Licensed and distributed under either of +# * MIT license (license terms in the root directory or at https://opensource.org/licenses/MIT). +# * Apache v2 license (license terms in the root directory or at https://www.apache.org/licenses/LICENSE-2.0). +# at your option. This file may not be copied, modified, or distributed except according to those terms. + +name: Nimbus CI +on: + push: + paths: + # add eth1 and eth2 when nimbus is mature enough + - '.github/workflows/nimbus.yml' + - 'nimbus/**' + - '!nimbus/**.md' + - 'vendor/**' + - 'Makefile' + - 'nimbus.nimble' + + pull_request: + paths: + - '.github/workflows/nimbus.yml' + - 'nimbus/**' + - '!nimbus/**.md' + - 'vendor/**' + - 'Makefile' + - 'nimbus.nimble' + # add eth1 and eth2 when nimbus is mature enough +jobs: + build: + strategy: + fail-fast: false + max-parallel: 20 + matrix: + target: + - os: linux + cpu: amd64 + - os: macos + cpu: amd64 + - os: windows + cpu: amd64 + include: + - target: + os: linux + builder: ubuntu-22.04 + - target: + os: macos + builder: macos-13 + - target: + os: windows + builder: windows-latest + + defaults: + run: + shell: bash + + name: '${{ matrix.target.os }}-${{ matrix.target.cpu }}' + runs-on: ${{ matrix.builder }} + steps: + - name: Checkout nimbus-eth1 + uses: actions/checkout@v4 + + - name: Derive environment variables + run: | + if [[ '${{ matrix.target.cpu }}' == 'amd64' ]]; then + PLATFORM=x64 + else + PLATFORM=x86 + fi + echo "PLATFORM=${PLATFORM}" >> $GITHUB_ENV + + # libminiupnp / natpmp + if [[ '${{ runner.os }}' == 'Linux' && '${{ matrix.target.cpu }}' == 'i386' ]]; then + export CFLAGS="${CFLAGS} -m32 -mno-adx" + echo "CFLAGS=${CFLAGS}" >> $GITHUB_ENV + fi + + ncpu='' + case '${{ runner.os }}' in + 'Linux') + ncpu=$(nproc) + ;; + 'macOS') + ncpu=$(sysctl -n hw.ncpu) + ;; + 'Windows') + ncpu=${NUMBER_OF_PROCESSORS} + ;; + esac + [[ -z "$ncpu" || $ncpu -le 0 ]] && ncpu=1 + echo "ncpu=${ncpu}" >> $GITHUB_ENV + + - name: Install build dependencies (Linux i386) + if: runner.os == 'Linux' && matrix.target.cpu == 'i386' + run: | + sudo dpkg --add-architecture i386 + sudo apt-fast update -qq + sudo DEBIAN_FRONTEND='noninteractive' apt-fast install \ + --no-install-recommends -yq gcc-multilib g++-multilib + mkdir -p external/bin + cat << EOF > external/bin/gcc + #!/bin/bash + exec $(which gcc) -m32 -mno-adx "\$@" + EOF + cat << EOF > external/bin/g++ + #!/bin/bash + exec $(which g++) -m32 -mno-adx "\$@" + EOF + chmod 755 external/bin/gcc external/bin/g++ + echo "${{ github.workspace }}/external/bin" >> $GITHUB_PATH + + # Required for running the local testnet script + - name: Install build dependencies (MacOS) + if: runner.os == 'macOS' + run: | + brew install gnu-getopt + brew link --force gnu-getopt + + - name: Restore llvm-mingw (Windows) from cache + if: runner.os == 'Windows' + id: windows-mingw-cache + uses: actions/cache@v4 + with: + path: external/mingw-${{ matrix.target.cpu }} + key: 'mingw-llvm-17-${{ matrix.target.cpu }}' + + - name: Restore Nim DLLs dependencies (Windows) from cache + if: runner.os == 'Windows' + id: windows-dlls-cache + uses: actions/cache@v4 + with: + path: external/dlls-${{ matrix.target.cpu }} + key: 'dlls-${{ matrix.target.cpu }}-nimbus_client' + + - name: Install llvm-mingw dependency (Windows) + if: > + steps.windows-mingw-cache.outputs.cache-hit != 'true' && + runner.os == 'Windows' + run: | + mkdir -p external + MINGW_BASE="https://github.com/mstorsjo/llvm-mingw/releases/download/20230905" + if [[ '${{ matrix.target.cpu }}' == 'amd64' ]]; then + MINGW_URL="$MINGW_BASE/llvm-mingw-20230905-ucrt-x86_64.zip" + ARCH=64 + else + MINGW_URL="$MINGW_BASE/llvm-mingw-20230905-ucrt-x86_64.zip" + ARCH=32 + fi + curl -L "$MINGW_URL" -o "external/mingw-${{ matrix.target.cpu }}.zip" + 7z x -y "external/mingw-${{ matrix.target.cpu }}.zip" -oexternal/mingw-${{ matrix.target.cpu }}/ + mv external/mingw-${{ matrix.target.cpu }}/**/* ./external/mingw-${{ matrix.target.cpu }} + + - name: Install DLLs dependencies (Windows) + if: > + steps.windows-dlls-cache.outputs.cache-hit != 'true' && + runner.os == 'Windows' + run: | + DLLPATH=external/dlls-${{ matrix.target.cpu }} + mkdir -p external + curl -L "https://nim-lang.org/download/windeps.zip" -o external/windeps.zip + 7z x -y external/windeps.zip -o"$DLLPATH" + + - name: Path to cached dependencies (Windows) + if: > + runner.os == 'Windows' + run: | + echo '${{ github.workspace }}'"/external/mingw-${{ matrix.target.cpu }}/bin" >> $GITHUB_PATH + echo '${{ github.workspace }}'"/external/dlls-${{ matrix.target.cpu }}" >> $GITHUB_PATH + + - name: Get latest nimbus-build-system commit hash + id: versions + run: | + getHash() { + git ls-remote "https://github.com/$1" "${2:-HEAD}" | cut -f 1 + } + nbsHash=$(getHash status-im/nimbus-build-system) + echo "nimbus_build_system=$nbsHash" >> $GITHUB_OUTPUT + + - name: Restore prebuilt Nim binaries from cache + id: nim-cache + uses: actions/cache@v4 + with: + path: NimBinaries + key: 'nim-${{ matrix.target.os }}-${{ matrix.target.cpu }}-${{ steps.versions.outputs.nimbus_build_system }}-nimbus_client' + + - name: Build Nim and Nimbus-eth1 dependencies + run: | + # use CC to make sure Nim compiler and subsequent test + # using the same glibc version. + env CC=gcc make -j${ncpu} ARCH_OVERRIDE=${PLATFORM} CI_CACHE=NimBinaries update-from-ci + + # tests for all platforms are missing executable help option validation + - name: Run Nimbus tests (Windows) + if: runner.os == 'Windows' + run: | + gcc --version + DEFAULT_MAKE_FLAGS="-j1" + mingw32-make ${DEFAULT_MAKE_FLAGS} nimbus + # build/nimbus_client.exe --help + find . -type d -name ".git" -exec rm -rf {} + + rm -rf nimcache + mingw32-make ${DEFAULT_MAKE_FLAGS} all_tests_nimbus + rm -rf nimcache + + - name: Run Nimbus tests (Linux) + if: runner.os == 'Linux' + run: | + gcc --version + ./env.sh nim -v + ldd --version + export LD_LIBRARY_PATH="${LD_LIBRARY_PATH}:/usr/local/lib" + DEFAULT_MAKE_FLAGS="-j${ncpu}" + env CC=gcc make ${DEFAULT_MAKE_FLAGS} nimbus + # CC is needed to select correct compiler 32/64 bit + env CC=gcc CXX=g++ make ${DEFAULT_MAKE_FLAGS} all_tests_nimbus + + - name: Run Nimbus tests (Macos) + if: runner.os == 'Macos' + run: | + DEFAULT_MAKE_FLAGS="-j${ncpu}" + make ${DEFAULT_MAKE_FLAGS} nimbus + # "-static" option will not work for osx unless static system libraries are provided + make ${DEFAULT_MAKE_FLAGS} all_tests_nimbus + + lint: + name: "Lint nimbus" + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 2 # In PR, has extra merge commit: ^1 = PR, ^2 = base + + - name: Check nph formatting + # Pin nph to a specific version to avoid sudden style differences. + # Updating nph version should be accompanied with running the new + # version on the nimbus directory. + run: | + VERSION="v0.6.1" + ARCHIVE="nph-linux_x64.tar.gz" + curl -L "https://github.com/arnetheduck/nph/releases/download/${VERSION}/${ARCHIVE}" -o ${ARCHIVE} + tar -xzf ${ARCHIVE} + ./nph nimbus/ + git diff --exit-code + + - name: Check copyright year + if: ${{ !cancelled() }} && github.event_name == 'pull_request' + run: | + bash scripts/check_copyright_year.sh