From c2d7fe3fd7d01ffb399ae29e85b33dcb0695ae74 Mon Sep 17 00:00:00 2001 From: Michael Bradley Date: Tue, 10 May 2022 15:41:44 -0500 Subject: [PATCH] [ci] generate coverage data and upload to Codecov (#93) --- .github/workflows/ci.yml | 22 ++-- .github/workflows/codecov.yml | 224 ++++++++++++++++++++++++++++++++++ .gitignore | 3 + Makefile | 23 +++- README.md | 7 ++ codecov.yml | 22 ++++ 6 files changed, 285 insertions(+), 16 deletions(-) create mode 100644 .github/workflows/codecov.yml create mode 100644 README.md create mode 100644 codecov.yml diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 209629b8..432fed99 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,4 +1,4 @@ -name: nim-dagger CI +name: CI on: push: branches: @@ -12,7 +12,7 @@ jobs: fail-fast: false max-parallel: 20 matrix: - branch: [v1.2.18, v1.6.4] + branch: [v1.2.18, v1.6.6] target: # Unit tests - os: linux @@ -37,10 +37,10 @@ jobs: name: '${{ matrix.target.os }}-${{ matrix.target.cpu }}-${{ matrix.branch }}' runs-on: ${{ matrix.builder }} steps: - - name: Checkout nim-dagger + - name: Checkout nim-codex uses: actions/checkout@v2 with: - path: nim-dagger + path: nim-codex submodules: true - name: Derive environment variables @@ -175,7 +175,7 @@ jobs: id: nim-cache uses: actions/cache@v2 with: - path: nim-dagger/NimBinaries + path: nim-codex/NimBinaries key: 'nim-${{ matrix.branch }}-${{ matrix.target.os }}-${{ matrix.target.cpu }}-${{ steps.versions.outputs.nimbus_build_system }}' - name: Install NodeJS @@ -183,25 +183,25 @@ jobs: with: node-version: '14' - - name: Build Nim and Dagger dependencies + - name: Build Nim and Codex dependencies shell: bash - working-directory: nim-dagger + working-directory: nim-codex run: | if [[ "${{ runner.os }}" == "macOS" ]]; then ulimit -n 1024 fi make -j$ncpu ARCH_OVERRIDE=$PLATFORM CI_CACHE=NimBinaries NIM_COMMIT="${{ matrix.branch }}" QUICK_AND_DIRTY_COMPILER=1 update - - name: Start Ethereum Node with Dagger contracts + - name: Start Ethereum Node with Codex contracts shell: bash - working-directory: nim-dagger/vendor/dagger-contracts + working-directory: nim-codex/vendor/dagger-contracts run: | npm install npm start & - - name: Run nim-dagger tests + - name: Run nim-codex tests shell: bash - working-directory: nim-dagger + working-directory: nim-codex run: | ./env.sh nim --version echo diff --git a/.github/workflows/codecov.yml b/.github/workflows/codecov.yml new file mode 100644 index 00000000..c530c659 --- /dev/null +++ b/.github/workflows/codecov.yml @@ -0,0 +1,224 @@ +name: Coverage +on: + push: + branches: + - main + pull_request: + workflow_dispatch: + +jobs: + build: + strategy: + fail-fast: false + max-parallel: 20 + matrix: + branch: [v1.6.6] + target: + # Unit tests + - os: linux + cpu: amd64 + TEST_KIND: unit-tests + # - os: macos + # cpu: amd64 + # 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-codex + uses: actions/checkout@v2 + with: + path: nim-codex + submodules: true + + - name: Derive environment variables + shell: bash + run: | + if [[ '${{ matrix.target.cpu }}' == 'amd64' ]]; then + ARCH=64 + PLATFORM=x64 + else + ARCH=32 + PLATFORM=x86 + fi + echo "ARCH=$ARCH" >> $GITHUB_ENV + echo "PLATFORM=$PLATFORM" >> $GITHUB_ENV + 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 + echo "ncpu=$ncpu" >> $GITHUB_ENV + echo "ext=$ext" >> $GITHUB_ENV + + - name: Install coverage dependencies (Linux) + if: runner.os == 'Linux' + run: | + sudo apt-get update + sudo apt-get install -y lcov + + - name: Install build dependencies (Linux i386) + if: runner.os == 'Linux' && matrix.target.cpu == 'i386' + run: | + sudo dpkg --add-architecture i386 + sudo apt-get update -qq + sudo DEBIAN_FRONTEND='noninteractive' apt-get 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 + NIMFLAGS="-d:LeopardCmakeFlags='-DCMAKE_BUILD_TYPE=Release -DCMAKE_C_FLAGS=-m32 -DCMAKE_CXX_FLAGS=-m32'" + quote () { + local quoted=${1//\'/\'\\\'\'}; + printf "'%s'" "$quoted" + } + echo "NIMFLAGS=$(quote "${NIMFLAGS}")" >> $GITHUB_ENV + + - name: Install build dependencies (macOS) + if: runner.os == 'macOS' + run: | + brew install libomp + echo "$(brew --prefix)/opt/llvm/bin" >> $GITHUB_PATH + echo "LDFLAGS=-L$(brew --prefix)/opt/libomp/lib -L$(brew --prefix)/opt/llvm/lib -Wl,-rpath,$(brew --prefix)/opt/llvm/lib" >> $GITHUB_ENV + NIMFLAGS="-d:LeopardCmakeFlags='-DCMAKE_BUILD_TYPE=Release -DCMAKE_C_COMPILER=$(brew --prefix)/opt/llvm/bin/clang -DCMAKE_CXX_COMPILER=$(brew --prefix)/opt/llvm/bin/clang++' -d:LeopardExtraCompilerlags='-fopenmp' -d:LeopardExtraLinkerFlags='-fopenmp -L$(brew --prefix)/opt/libomp/lib'" + quote () { + local quoted=${1//\'/\'\\\'\'}; + printf "'%s'" "$quoted" + } + echo "NIMFLAGS=$(quote "${NIMFLAGS}")" >> $GITHUB_ENV + + - name: Restore MinGW-W64 (Windows) from cache + if: runner.os == 'Windows' + id: windows-mingw-cache + uses: actions/cache@v2 + with: + path: external/mingw-${{ matrix.target.cpu }} + key: 'mingw-${{ matrix.target.cpu }}' + + - name: Restore Nim DLLs dependencies (Windows) from cache + if: runner.os == 'Windows' + id: windows-dlls-cache + uses: actions/cache@v2 + with: + path: external/dlls-${{ matrix.target.cpu }} + key: 'dlls-${{ matrix.target.cpu }}' + + - name: Install MinGW64 dependency (Windows) + if: > + steps.windows-mingw-cache.outputs.cache-hit != 'true' && + runner.os == 'Windows' + shell: bash + run: | + mkdir -p external + curl -L "https://nim-lang.org/download/mingw$ARCH.7z" -o "external/mingw-${{ matrix.target.cpu }}.7z" + 7z x -y "external/mingw-${{ matrix.target.cpu }}.7z" -oexternal/ + mv external/mingw$ARCH external/mingw-${{ matrix.target.cpu }} + + - name: Install DLLs dependencies (Windows) + if: > + steps.windows-dlls-cache.outputs.cache-hit != 'true' && + runner.os == 'Windows' + shell: bash + run: | + mkdir -p external + curl -L "https://nim-lang.org/download/windeps.zip" -o external/windeps.zip + 7z x -y external/windeps.zip -oexternal/dlls-${{ matrix.target.cpu }} + + - name: Path to cached dependencies (Windows) + if: > + runner.os == 'Windows' + shell: bash + run: | + echo "${{ github.workspace }}/external/mingw-${{ matrix.target.cpu }}/bin" >> $GITHUB_PATH + echo "${{ github.workspace }}/external/dlls-${{ matrix.target.cpu }}" >> $GITHUB_PATH + + - name: Setup environment + shell: bash + run: echo '${{ github.workspace }}/nim/bin' >> $GITHUB_PATH + + - name: Get latest nimbus-build-system commit hash + id: versions + shell: bash + run: | + getHash() { + git ls-remote "https://github.com/$1" "${2:-HEAD}" | cut -f 1 + } + nbsHash=$(getHash status-im/nimbus-build-system) + echo "::set-output name=nimbus_build_system::$nbsHash" + + - name: Restore prebuilt Nim binaries from cache + id: nim-cache + uses: actions/cache@v2 + with: + path: nim-codex/NimBinaries + key: 'nim-${{ matrix.branch }}-${{ matrix.target.os }}-${{ matrix.target.cpu }}-${{ steps.versions.outputs.nimbus_build_system }}' + + - name: Install NodeJS + uses: actions/setup-node@v2 + with: + node-version: '14' + + - name: Build Nim and Codex dependencies + shell: bash + working-directory: nim-codex + run: | + if [[ "${{ runner.os }}" == "macOS" ]]; then + ulimit -n 1024 + fi + make -j$ncpu ARCH_OVERRIDE=$PLATFORM CI_CACHE=NimBinaries NIM_COMMIT="${{ matrix.branch }}" QUICK_AND_DIRTY_COMPILER=1 update + + - name: Start Ethereum Node with Codex contracts + shell: bash + working-directory: nim-codex/vendor/dagger-contracts + run: | + npm install + npm start & + + - name: Run nim-codex tests and generate coverage data + shell: bash + working-directory: nim-codex + run: | + ./env.sh nim --version + echo + make NIM_COMMIT="${{ matrix.branch }}" coverage + + - name: Upload coverage to Codecov + uses: codecov/codecov-action@v2 + with: + directory: ./nim-codex/coverage/ + fail_ci_if_error: true + files: ./nim-codex/coverage/coverage.f.info + flags: unittests + name: codecov-umbrella + verbose: true diff --git a/.gitignore b/.gitignore index 1db48b94..c9bad6d9 100644 --- a/.gitignore +++ b/.gitignore @@ -9,6 +9,9 @@ nimcache/ # Executables shall be put in an ignored build/ directory build/ +# Coverage data shall be put in an ignored coverage/ directory +coverage/ + # Nimble packages /vendor/.nimble diff --git a/Makefile b/Makefile index 4fedae7b..b6bdb8c7 100644 --- a/Makefile +++ b/Makefile @@ -21,11 +21,12 @@ LINK_PCRE := 0 .PHONY: \ all \ - deps \ - update \ - test \ clean \ - libbacktrace + coverage \ + deps \ + libbacktrace \ + test \ + update ifeq ($(NIM_PARAMS),) # "variables.mk" was not included, so we update the submodules. @@ -82,7 +83,7 @@ test: | build deps # Builds and runs all tests testAll: | build deps - echo -e $(BUILD_MSG) "build/$@" && \ + echo -e $(BUILD_MSG) "build/testDagger" "build/testContracts" && \ $(ENV_SCRIPT) nim testAll $(NIM_PARAMS) dagger.nims # symlink @@ -93,6 +94,18 @@ dagger.nims: libbacktrace: + $(MAKE) -C vendor/nim-libbacktrace --no-print-directory BUILD_CXX_LIB=0 +coverage: + $(MAKE) NIMFLAGS="--lineDir:on --passC:-fprofile-arcs --passC:-ftest-coverage --passL:-fprofile-arcs --passL:-ftest-coverage" testAll + cd nimcache/release/testDagger && rm -f *.c + cd nimcache/release/testContracts && rm -f *.c + mkdir -p coverage + lcov --capture --directory nimcache/release/testDagger --directory nimcache/release/testContracts --output-file coverage/coverage.info + shopt -s globstar && ls $$(pwd)/dagger/{*,**/*}.nim + shopt -s globstar && lcov --extract coverage/coverage.info $$(pwd)/dagger/{*,**/*}.nim --output-file coverage/coverage.f.info + echo -e $(BUILD_MSG) "coverage/report/index.html" + genhtml coverage/coverage.f.info --output-directory coverage/report + if which open >/dev/null; then (echo -e "\e[92mOpening\e[39m HTML coverage report in browser..." && open coverage/report/index.html) || true; fi + # usual cleaning clean: | clean-common rm -rf build diff --git a/README.md b/README.md new file mode 100644 index 00000000..c4bba2d8 --- /dev/null +++ b/README.md @@ -0,0 +1,7 @@ +# nim-codex + +[![License: Apache](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://opensource.org/licenses/Apache-2.0) +[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](https://opensource.org/licenses/MIT) +[![Stability: experimental](https://img.shields.io/badge/stability-experimental-orange.svg)](#stability) +[![CI](https://github.com/status-im/nim-codex/actions/workflows/ci.yml/badge.svg?branch=main)](https://github.com/status-im/nim-codex/actions?query=workflow%3ACI+branch%3Amain) +[![Codecov](https://codecov.io/gh/status-im/nim-codex/branch/main/graph/badge.svg?token=XFmCyPSNzW)](https://codecov.io/gh/status-im/nim-codex) diff --git a/codecov.yml b/codecov.yml new file mode 100644 index 00000000..429a94c8 --- /dev/null +++ b/codecov.yml @@ -0,0 +1,22 @@ +coverage: + status: + project: + default: + # advanced settings + + # Prevents PR from being blocked with a reduction in coverage. + # Note, if we want to re-enable this, a `threshold` value can be used + # allow coverage to drop by x% while still posting a success status. + # `informational`: https://docs.codecov.com/docs/commit-status#informational + # `threshold`: https://docs.codecov.com/docs/commit-status#threshold + informational: true + patch: + default: + # advanced settings + + # Prevents PR from being blocked with a reduction in coverage. + # Note, if we want to re-enable this, a `threshold` value can be used + # allow coverage to drop by x% while still posting a success status. + # `informational`: https://docs.codecov.com/docs/commit-status#informational + # `threshold`: https://docs.codecov.com/docs/commit-status#threshold + informational: true