avoid some trivial memory allocations (#2587) #4467
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Nimbus | |
# Copyright (c) 2020-2024 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) | |
# * MIT license ([LICENSE-MIT](LICENSE-MIT) or | |
# http://opensource.org/licenses/MIT) | |
# at your option. This file may not be copied, modified, or distributed except | |
# according to those terms. | |
name: Nimbus CI | |
on: | |
push: | |
paths-ignore: | |
- 'doc/**' | |
- 'docs/**' | |
- '**/*.md' | |
- 'hive_integration/**' | |
- 'fluffy/**' | |
- '.github/workflows/fluffy*.yml' | |
- 'nimbus_verified_proxy/**' | |
- '.github/workflows/nimbus_verified_proxy.yml' | |
# Disable `pull_request`. Experimenting with using only `push` for PRs. | |
#pull_request: | |
# paths-ignore: ['doc/**', 'docs/**', '**/*.md', 'hive_integration/**'] | |
workflow_dispatch: | |
jobs: | |
build: | |
strategy: | |
fail-fast: false | |
max-parallel: 20 | |
matrix: | |
target: | |
- os: linux | |
cpu: amd64 | |
evmc: evmc | |
- os: macos | |
cpu: amd64 | |
evmc: evmc | |
- os: windows | |
cpu: amd64 | |
evmc: evmc | |
- os: linux | |
cpu: amd64 | |
evmc: nimvm | |
- os: windows | |
cpu: amd64 | |
evmc: nimvm | |
- os: macos | |
cpu: amd64 | |
evmc: nimvm | |
include: | |
- target: | |
os: linux | |
builder: ubuntu-20.04 | |
- target: | |
os: macos | |
builder: macos-12 | |
- target: | |
os: windows | |
builder: windows-latest | |
defaults: | |
run: | |
shell: bash | |
name: '${{ matrix.target.os }}-${{ matrix.target.cpu }}-${{ matrix.target.evmc }}' | |
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 | |
GOARCH=amd64 | |
USE_MIRACL=0 | |
else | |
PLATFORM=x86 | |
GOARCH=386 | |
USE_MIRACL=1 | |
fi | |
echo "PLATFORM=${PLATFORM}" >> $GITHUB_ENV | |
echo "GOARCH=${GOARCH}" >> $GITHUB_ENV | |
echo "USE_MIRACL=${USE_MIRACL}" >> $GITHUB_ENV | |
ncpu='' | |
case '${{ runner.os }}' in | |
'Linux') | |
ncpu=$(nproc) | |
echo "Number of cores: ${ncpu}" | |
echo "$(grep MemTotal /proc/meminfo)" | |
echo -e "Partition sizes:\n$(df -k -h .)" | |
;; | |
'macOS') | |
ncpu=$(sysctl -n hw.ncpu) | |
hwmemsize=$(sysctl -n hw.memsize) | |
ramsize=$(expr $hwmemsize / $((1024**3))) | |
echo "Number of cores: ${ncpu}" | |
echo "Physical memory: ${ramsize} GB" | |
echo -e "Partition sizes:\n$(df -k -h .)" | |
;; | |
'Windows') | |
ncpu=${NUMBER_OF_PROCESSORS} | |
CD=${PWD:1:1} | |
echo "Number of cores: ${NUMBER_OF_PROCESSORS}" | |
echo "Physical memory: $(wmic ComputerSystem get TotalPhysicalMemory)" | |
echo -e "Partition sizes:\n$(wmic logicaldisk get name,size,freespace | grep -e "${CD^}" -e "FreeSpace")" | |
;; | |
esac | |
[[ -z "$ncpu" || $ncpu -le 0 ]] && ncpu=1 | |
echo "ncpu=${ncpu}" >> $GITHUB_ENV | |
if [[ '${{ matrix.target.evmc }}' == 'evmc' ]]; then | |
echo "ENABLE_EVMC=1" >> $GITHUB_ENV | |
else | |
echo "ENABLE_EVMC=0" >> $GITHUB_ENV | |
fi | |
- name: Install build dependencies (Macos) | |
# Some home brew modules were reported missing | |
if: runner.os == 'Macos' | |
run: | | |
HOMEBREW_NO_INSTALL_CLEANUP=1 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 }} | |
# according to docu, idle caches are kept for up to 7 days | |
# so change dlls# to force new cache contents (for some number #) | |
key: dlls1-${{ matrix.target.cpu }} | |
- 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-i686.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 from cache | |
id: nim-cache | |
uses: actions/cache@v4 | |
with: | |
path: NimBinCache | |
key: 'nim-${{ matrix.target.os }}-${{ matrix.target.cpu }}-${{ steps.versions.outputs.nimbus_build_system }}-${{ matrix.target.evmc }}' | |
- name: Build Nim and Nimbus-eth1 dependencies | |
run: | | |
make -j${ncpu} ARCH_OVERRIDE=${PLATFORM} CI_CACHE=NimBinCache update-from-ci | |
- name: Run nimbus-eth1 tests (Windows) | |
if: runner.os == 'Windows' | |
run: | | |
gcc --version | |
DEFAULT_MAKE_FLAGS="-j${ncpu} ENABLE_EVMC=${ENABLE_EVMC} ENABLE_VMLOWMEM=${ENABLE_VMLOWMEM}" | |
mingw32-make ${DEFAULT_MAKE_FLAGS} all test_import | |
build/nimbus.exe --help | |
# give us more space | |
# find . -type d -name ".git" -exec rm -rf {} + | |
find . -type d -name "nimcache" -exec rm -rf {} + | |
mingw32-make ${DEFAULT_MAKE_FLAGS} test | |
if [[ '${{ matrix.target.cpu }}' == 'amd64' ]]; then | |
mingw32-make ${DEFAULT_MAKE_FLAGS} | |
fi | |
- name: Run nimbus-eth1 tests (Linux) | |
if: runner.os == 'Linux' | |
run: | | |
export LD_LIBRARY_PATH="${LD_LIBRARY_PATH}:/usr/local/lib" | |
DEFAULT_MAKE_FLAGS="-j${ncpu} USE_MIRACL=${USE_MIRACL} ENABLE_EVMC=${ENABLE_EVMC}" | |
env CC=gcc make ${DEFAULT_MAKE_FLAGS} all test_import | |
build/nimbus --help | |
# CC, GOARCH, and CGO_ENABLED are needed to select correct compiler 32/64 bit | |
# pushd vendor/nimbus-eth2 | |
# env NIMBUSEL_BINARY=../../build/nimbus NIMBUSEL_GENESIS=scripts/nimbusel_genesis.json \ | |
# ./scripts/launch_local_testnet.sh --nodes=3 --stop-at-epoch=7 \ | |
# --disable-htop --reuse-binaries --run-nimbus-el --dl-eth2 --verbose --kill-old-processes | |
# popd | |
env CC=gcc GOARCH=${GOARCH} CXX=g++ CGO_ENABLED=1 make ${DEFAULT_MAKE_FLAGS} test | |
- name: Run nimbus-eth1 tests (Macos) | |
if: runner.os == 'Macos' | |
run: | | |
export ZERO_AR_DATE=1 # avoid timestamps in binaries | |
DEFAULT_MAKE_FLAGS="-j${ncpu} ENABLE_EVMC=${ENABLE_EVMC}" | |
make ${DEFAULT_MAKE_FLAGS} all test_import | |
build/nimbus --help | |
# "-static" option will not work for osx unless static system libraries are provided | |
# pushd vendor/nimbus-eth2 | |
# env NIMBUSEL_BINARY=../../build/nimbus NIMBUSEL_GENESIS=scripts/nimbusel_genesis.json \ | |
# ./scripts/launch_local_testnet.sh --nodes=3 --stop-at-epoch=7 \ | |
# --disable-htop --reuse-binaries --run-nimbus-el --dl-eth2 --verbose --kill-old-processes | |
# popd | |
make ${DEFAULT_MAKE_FLAGS} test | |
lint: | |
name: "Lint" | |
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 copyright year | |
if: ${{ !cancelled() }} && github.event_name == 'pull_request' | |
run: | | |
bash scripts/check_copyright_year.sh |