Nimbus client workflow #2
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) 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 |