diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 000000000..e2466db57 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,207 @@ +name: nim-libp2p CI +on: [push, pull_request] + +jobs: + build: + strategy: + fail-fast: false + max-parallel: 20 + matrix: + branch: [v1.2.6] + target: + # Unit tests + - os: linux + cpu: amd64 + TEST_KIND: unit-tests + - os: linux + cpu: i386 + TEST_KIND: unit-tests + - os: macos + cpu: amd64 + TEST_KIND: unit-tests + - os: windows + cpu: i386 + TEST_KIND: unit-tests + - os: windows + cpu: amd64 + TEST_KIND: unit-tests + include: + - target: + os: linux + builder: ubuntu-18.04 + - target: + os: macos + builder: macos-10.15 + - target: + os: windows + builder: windows-2019 + name: '${{ matrix.target.os }}-${{ matrix.target.cpu }} (${{ matrix.branch }})' + runs-on: ${{ matrix.builder }} + steps: + - name: Checkout nim-libp2p + uses: actions/checkout@v2 + with: + path: nim-libp2p + submodules: true + - 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 \ + libssl-dev:i386 + mkdir -p external/bin + cat << EOF > external/bin/gcc + #!/bin/bash + exec $(which gcc) -m32 "\$@" + EOF + cat << EOF > external/bin/g++ + #!/bin/bash + exec $(which g++) -m32 "\$@" + EOF + chmod 755 external/bin/gcc external/bin/g++ + echo '${{ github.workspace }}/external/bin' >> $GITHUB_PATH + + - name: Install build dependencies (Windows) + if: runner.os == 'Windows' + shell: bash + run: | + mkdir external + if [[ '${{ matrix.target.cpu }}' == 'amd64' ]]; then + arch=64 + else + arch=32 + fi + curl -L "https://nim-lang.org/download/mingw$arch-6.3.0.7z" -o "external/mingw$arch.7z" + curl -L "https://nim-lang.org/download/windeps.zip" -o external/windeps.zip + 7z x "external/mingw$arch.7z" -oexternal/ + 7z x external/windeps.zip -oexternal/dlls + echo '${{ github.workspace }}'"/external/mingw$arch/bin" >> $GITHUB_PATH + echo '${{ github.workspace }}'"/external/dlls" >> $GITHUB_PATH + + - name: Setup environment + shell: bash + run: echo '${{ github.workspace }}/nim/bin' >> $GITHUB_PATH + + - name: Get latest Nim commit hash + id: versions + shell: bash + run: | + getHash() { + git ls-remote "https://github.com/$1" "${2:-HEAD}" | cut -f 1 + } + nimHash=$(getHash nim-lang/Nim '${{ matrix.branch }}') + csourcesHash=$(getHash nim-lang/csources) + echo "::set-output name=nim::$nimHash" + echo "::set-output name=csources::$csourcesHash" + + - name: Restore prebuilt Nim from cache + id: nim-cache + uses: actions/cache@v1 + with: + path: nim + key: "nim-${{ matrix.target.os }}-${{ matrix.target.cpu }}-${{ steps.versions.outputs.nim }}" + + - name: Restore prebuilt csources from cache + if: steps.nim-cache.outputs.cache-hit != 'true' + id: csources-cache + uses: actions/cache@v1 + with: + path: csources/bin + key: "csources-${{ matrix.target.os }}-${{ matrix.target.cpu }}-${{ steps.versions.outputs.csources }}" + + - name: Checkout Nim csources + if: > + steps.csources-cache.outputs.cache-hit != 'true' && + steps.nim-cache.outputs.cache-hit != 'true' + uses: actions/checkout@v2 + with: + repository: nim-lang/csources + path: csources + ref: ${{ steps.versions.outputs.csources }} + + - name: Checkout Nim + if: steps.nim-cache.outputs.cache-hit != 'true' + uses: actions/checkout@v2 + with: + repository: nim-lang/Nim + path: nim + ref: ${{ steps.versions.outputs.nim }} + + - name: Build Nim and associated tools + if: steps.nim-cache.outputs.cache-hit != 'true' + shell: bash + run: | + ncpu= + ext= + case '${{ runner.os }}' in + 'Linux') + ncpu=$(nproc) + ;; + 'macOS') + ncpu=$(sysctl -n hw.ncpu) + ;; + 'Windows') + ncpu=$NUMBER_OF_PROCESSORS + ext=.exe + ;; + esac + [[ -z "$ncpu" || $ncpu -le 0 ]] && ncpu=1 + if [[ ! -e csources/bin/nim$ext ]]; then + make -C csources -j $ncpu CC=gcc ucpu='${{ matrix.target.cpu }}' + else + echo 'Using prebuilt csources' + fi + cp -v csources/bin/nim$ext nim/bin + cd nim + nim c koch + ./koch boot -d:release + ./koch tools -d:release + # clean up to save cache space + rm koch + rm -rf nimcache + rm -rf dist + rm -rf .git + + # - name: Install library dependencies (Linux amd64) + # if: runner.os == 'Linux' && matrix.target.cpu == 'amd64' + # run: | + # sudo DEBIAN_FRONTEND='noninteractive' apt-fast install \ + # --no-install-recommends -yq libgmp-dev + # + # - name: Install library dependencies (Linux i386) + # if: runner.os == 'Linux' && matrix.target.cpu == 'i386' + # run: | + # sudo DEBIAN_FRONTEND='noninteractive' apt-fast install \ + # libgmp-dev:i386 + # + # - name: Install library dependencies (macOS) + # if: runner.os == 'macOS' + # run: brew install gmp + # + # - name: Install library dependencies (Windows) + # if: runner.os == 'Windows' + # shell: bash + # run: | + # choco install msys2 + # pacman -S mingw-w64-x86_64-gmp + + - name: Setup Go + uses: actions/setup-go@v2 + with: + go-version: '^1.15.5' + + - name: Install p2pd + shell: bash + run: | + cd nim-libp2p + V=1 bash scripts/build_p2pd.sh p2pdCache v0.3.0 + + - name: Run nim-libp2p tests + shell: bash + run: | + export UCPU="$cpu" + cd nim-libp2p + nimble install -y --depsOnly + nimble test diff --git a/.github/workflows/nbc.yml b/.github/workflows/nbc.yml index 7df067e61..61062e36f 100644 --- a/.github/workflows/nbc.yml +++ b/.github/workflows/nbc.yml @@ -44,5 +44,3 @@ jobs: path: nbc token: ${{ steps.generate-token.outputs.token }} title: nim-libp2p auto bump - - diff --git a/.travis_deactivated.yml b/.travis_deactivated.yml deleted file mode 100644 index 555ec2b13..000000000 --- a/.travis_deactivated.yml +++ /dev/null @@ -1,58 +0,0 @@ -language: go - -dist: bionic - -# https://docs.travis-ci.com/user/caching/ -cache: - directories: - - NimBinaries - - p2pdCache - -git: - # when multiple CI builds are queued, the tested commit needs to be in the last X commits cloned with "--depth X" - depth: 10 - -go: "1.14.x" - -matrix: - include: - # Due to Travis new pricing we want to dedicate the resources we have - # for ARM64 testing, hence Linux/Mac on AMD are commented out - # https://blog.travis-ci.com/2020-11-02-travis-ci-new-billing - - # - os: linux - # arch: amd64 - # env: - # - NPROC=2 - # before_install: - # - export GOPATH=$HOME/go - # - os: osx - # env: - # - NPROC=2 - # before_install: - # - export GOPATH=$HOME/go - - - os: linux - dist: bionic - arch: arm64 - env: - - NPROC=6 # Worth trying more than 2 parallel jobs: https://travis-ci.community/t/no-cache-support-on-arm64/5416/8 - # (also used to get a different cache key than the amd64 one) - before_install: - - export GOPATH=$HOME/go - -install: - # build nim from our own branch - this to avoid the day-to-day churn and - # regressions of the fast-paced Nim development while maintaining the - # flexibility to apply patches - - curl -O -L -s -S https://raw.githubusercontent.com/status-im/nimbus-build-system/master/scripts/build_nim.sh - - env MAKE="make -j${NPROC}" bash build_nim.sh Nim csources dist/nimble NimBinaries - - export PATH="$PWD/Nim/bin:$GOPATH/bin:$PATH" - - # install and build go-libp2p-daemon - - bash scripts/build_p2pd.sh p2pdCache v0.3.0 - -script: - - nimble install -y --depsOnly - - nimble test - - nimble examples_build diff --git a/azure-pipelines.yml b/azure-pipelines.yml deleted file mode 100644 index ab57df2bc..000000000 --- a/azure-pipelines.yml +++ /dev/null @@ -1,125 +0,0 @@ -strategy: - maxParallel: 10 - matrix: - # Nim requires enforcing ARCH="x86" and UCPU - # for 32-bit targets as it seems like Azure machines are 64-bit - # TEST_LANG env variable support TODO - Windows_32bit: - VM: 'windows-latest' - ARCH: x86 - PLATFORM: x86 - TEST_LANG: c - Windows_64bit: - VM: 'windows-latest' - PLATFORM: x64 - TEST_LANG: c - -pool: - vmImage: $(VM) - -variables: - V: 0 # Scripts verbosity, 1 for debugging build scripts - -steps: - - task: CacheBeta@1 - displayName: 'cache Nim binaries' - inputs: - key: NimBinaries | $(Agent.OS) | $(PLATFORM) | "$(Build.SourceBranchName)" | "v5" - path: NimBinaries - - - task: CacheBeta@1 - displayName: 'cache Go libp2p daemon' - inputs: - key: p2pdCache | $(Agent.OS) | $(PLATFORM) | "v3" - path: p2pdCache - - - task: CacheBeta@1 - displayName: 'cache MinGW-w64' - inputs: - key: mingwCache | 8_1_0 | $(PLATFORM) | "v2" - path: mingwCache - - - powershell: | - Set-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\FileSystem' -Name 'LongPathsEnabled' -Value 1 - displayName: 'long path support' - - - bash: | - set -e - - # custom MinGW-w64 versions for both 32-bit and 64-bit, since we need a 64-bit build of p2pd - echo "Installing MinGW-w64" - - install_mingw() { - mkdir -p mingwCache - cd mingwCache - if [[ ! -e "$MINGW_FILE" ]]; then - curl -OLsS "$MINGW_URL" - fi - 7z x -y -bd "$MINGW_FILE" >/dev/null - mkdir -p /c/custom - mv "$MINGW_DIR" /c/custom/ - cd .. - } - - # 32-bit - MINGW_FILE="i686-8.1.0-release-posix-dwarf-rt_v6-rev0.7z" - MINGW_URL="https://sourceforge.net/projects/mingw-w64/files/Toolchains%20targetting%20Win32/Personal%20Builds/mingw-builds/8.1.0/threads-posix/dwarf/${MINGW_FILE}" - MINGW_DIR="mingw32" - install_mingw - - # 64-bit - MINGW_FILE="x86_64-8.1.0-release-posix-seh-rt_v6-rev0.7z" - MINGW_URL="https://sourceforge.net/projects/mingw-w64/files/Toolchains%20targetting%20Win64/Personal%20Builds/mingw-builds/8.1.0/threads-posix/seh/${MINGW_FILE}" - MINGW_DIR="mingw64" - install_mingw - - if [[ $PLATFORM == "x86" ]]; then - MINGW_DIR="mingw32" - else - MINGW_DIR="mingw64" - fi - export PATH="/c/custom/${MINGW_DIR}/bin:${PATH}" - echo "PATH=${PATH}" - which gcc - gcc -v - - # detect number of cores - export ncpu="$NUMBER_OF_PROCESSORS" - [[ -z "$ncpu" || $ncpu -le 0 ]] && ncpu=2 - echo "Found ${ncpu} cores" - - if [[ $PLATFORM == "x86" ]]; then - choco --version - choco install --x86 openssl - export PATH="/c/Program Files (x86)/OpenSSL-Win32/bin:${PATH}" - echo "PATH=${PATH}" - fi - - # build nim from our own branch - this to avoid the day-to-day churn and - # regressions of the fast-paced Nim development while maintaining the - # flexibility to apply patches - curl -OLsS https://raw.githubusercontent.com/status-im/nimbus-build-system/master/scripts/build_nim.sh - env MAKE="mingw32-make -j${ncpu}" ARCH_OVERRIDE=$(PLATFORM) bash build_nim.sh Nim csources dist/nimble NimBinaries - - export PATH="${PWD}/Nim/bin:${PATH}" - echo "PATH=${PATH}" - - # install and build go-libp2p-daemon - go version - - export GOPATH="${PWD}/go" - export PATH="${GOPATH}/bin:${PATH}" - echo "PATH=${PATH}" - - # we can't seem to be able to build a 32-bit p2pd - env PATH="/c/custom/mingw64/bin:${PATH}" bash scripts/build_p2pd.sh p2pdCache v0.3.0 - - # install dependencies - nimble refresh - nimble install -y --depsOnly - - # run tests - nimble test_slim - nimble examples_build - displayName: 'build and test' - diff --git a/scripts/build_p2pd.sh b/scripts/build_p2pd.sh index 1f1765ec3..5e783bddd 100644 --- a/scripts/build_p2pd.sh +++ b/scripts/build_p2pd.sh @@ -38,7 +38,7 @@ else GIT_TIMESTAMP_ARG="--date=format-local:%s" # available since Git 2.7.0 fi -TARGET_DIR="${GOPATH%:*}/bin" # if multiple paths are specified, use the first one +TARGET_DIR="$(go env GOPATH)/bin" TARGET_BINARY="${TARGET_DIR}/p2pd${EXE_SUFFIX}" target_needs_rebuilding() {