From 61e0c55e76d871a04af5c08c5eb3d828f51aafbd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?rich=CE=9Brd?= Date: Tue, 21 Nov 2023 19:56:58 -0400 Subject: [PATCH] chore(ci): build using github actions (#908) --- .github/.env | 1 + .github/docker-compose/ganache.yml | 6 + .github/docker-compose/postgres.yml | 7 + .github/workflows/build_mobile.yml | 116 +++++++++++++++ .github/workflows/ci.yml | 217 ++++++++++++++++++++++++++++ examples/c-bindings/Makefile | 2 +- 6 files changed, 348 insertions(+), 1 deletion(-) create mode 100644 .github/.env create mode 100644 .github/docker-compose/ganache.yml create mode 100644 .github/docker-compose/postgres.yml create mode 100644 .github/workflows/build_mobile.yml create mode 100644 .github/workflows/ci.yml diff --git a/.github/.env b/.github/.env new file mode 100644 index 00000000..8789b588 --- /dev/null +++ b/.github/.env @@ -0,0 +1 @@ +go_version=1.20 diff --git a/.github/docker-compose/ganache.yml b/.github/docker-compose/ganache.yml new file mode 100644 index 00000000..d14abb50 --- /dev/null +++ b/.github/docker-compose/ganache.yml @@ -0,0 +1,6 @@ +services: + ganache: + image: "trufflesuite/ganache:latest" + command: ["-m='swim relax risk shy chimney please usual search industry board music segment'"] + ports: + - "8545:8545" diff --git a/.github/docker-compose/postgres.yml b/.github/docker-compose/postgres.yml new file mode 100644 index 00000000..4726f022 --- /dev/null +++ b/.github/docker-compose/postgres.yml @@ -0,0 +1,7 @@ +services: + postgres: + environment: + - POSTGRES_HOST_AUTH_METHOD=trust + image: "postgres:9.6-alpine" + ports: + - "5432:5432" diff --git a/.github/workflows/build_mobile.yml b/.github/workflows/build_mobile.yml new file mode 100644 index 00000000..5b39d8c2 --- /dev/null +++ b/.github/workflows/build_mobile.yml @@ -0,0 +1,116 @@ +name: build_mobile + +on: + push: + tags: + - 'v*' # "e.g. v0.4" + + workflow_dispatch: + +jobs: + env: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + + - uses: xom9ikk/dotenv@v2 + with: + path: ".github/" + - run: | + echo "go_version=${{ env.GO_VERSION }}" >> $GITHUB_OUTPUT + + - run: | + VERSION=$(cat ./VERSION) + echo "waku_version=$VERSION" >> $GITHUB_OUTPUT + + + build-android: + needs: env + runs-on: ubuntu-latest + timeout-minutes: 60 + + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: Get submodules hash + id: submodules + run: | + echo "hash=$(git submodule status | awk '{print $1}' | sort | shasum -a 256 | sed 's/[ -]*//g')" >> $GITHUB_OUTPUT + + - name: Cache submodules + uses: actions/cache@v3 + with: + path: | + vendor/ + .git/modules + key: ${{ runner.os }}-vendor-modules-${{ needs.env.outputs.go_version }} + + - name: Install Go + uses: actions/setup-go@v4 + with: + go-version: ${{ needs.env.outputs.go_version }} + cache: false + + - name: Build + run: | + make install-gomobile + make mobile-android || make mobile-android + cd ./build/lib + tar -czvf gowaku-${{ needs.env.outputs.waku_version }}-android.tar.gz gowaku.aar gowaku-sources.jar + + - name: Upload asset + uses: actions/upload-artifact@v3 + with: + name: gowaku-${{ needs.env.outputs.waku_version }}-android.tar.gz + path: ./build/lib/gowaku-${{ needs.env.outputs.waku_version }}-android.tar.gz + if-no-files-found: error + + build-ios: + needs: env + runs-on: macos-latest + timeout-minutes: 60 + + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: Get submodules hash + id: submodules + run: | + echo "hash=$(git submodule status | awk '{print $1}' | sort | shasum -a 256 | sed 's/[ -]*//g')" >> $GITHUB_OUTPUT + + - name: Cache submodules + uses: actions/cache@v3 + with: + path: | + vendor/ + .git/modules + key: ${{ runner.os }}-vendor-modules-${{ steps.submodules.outputs.hash }} + + - name: Read VERSION file + id: waku_version + run: | + VERSION=$(cat ./VERSION) + echo "version=$VERSION" >> $GITHUB_OUTPUT + + - name: Install Go + uses: actions/setup-go@v4 + with: + go-version: ${{ needs.env.outputs.go_version }} + cache: false + + - name: Build + run: | + make install-gomobile + make mobile-ios + cd ./build/lib + tar -czvf gowaku-${{ needs.env.outputs.waku_version }}-ios.tar.gz Gowaku.xcframework + + - name: Upload asset + uses: actions/upload-artifact@v3 + with: + name: gowaku-${{ needs.env.outputs.waku_version }}-ios.tar.gz + path: ./build/lib/gowaku-${{ needs.env.outputs.waku_version }}-ios.tar.gz + if-no-files-found: error + diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 00000000..92aa0f54 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,217 @@ +name: ci + +on: + pull_request: + push: + branches: + - master + +env: + GO_VERSION: '1.20' + +concurrency: + group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} + cancel-in-progress: true + +jobs: + changes: # changes detection + runs-on: ubuntu-latest + permissions: + pull-requests: read + steps: + - uses: actions/checkout@v3 + name: Checkout code + id: checkout + + - uses: dorny/paths-filter@v2 + id: filter + with: + filters: | + common: + - '.github/workflows/**' + - 'Makefile' + - 'libs/**' + + v2: + - 'waku/**' + - 'cmd/**' + - 'library/**' + - 'tests/**' + + docker: + - 'docker/**' + + outputs: + common: ${{ steps.filter.outputs.common }} + v2: ${{ steps.filter.outputs.v2 }} + docker: ${{ steps.filter.outputs.docker }} + + golangci: + name: lint + needs: changes + if: ${{ needs.changes.outputs.v2 == 'true' || needs.changes.outputs.common == 'true' }} + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: Install Go + uses: actions/setup-go@v4 + with: + go-version: ${{ env.GO_VERSION }} + cache: false + + - name: Execute golangci-lint + uses: golangci/golangci-lint-action@v3 + with: + version: v1.55.2 + args: --deadline=5m + + build: + needs: changes + if: ${{ needs.changes.outputs.v2 == 'true' || needs.changes.outputs.common == 'true' }} + strategy: + matrix: + os: [ubuntu-latest, macos-latest] + runs-on: ${{ matrix.os }} + timeout-minutes: 60 + + name: build-${{ matrix.os }} + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: Get submodules hash + id: submodules + run: | + echo "hash=$(git submodule status | awk '{print $1}' | sort | shasum -a 256 | sed 's/[ -]*//g')" >> $GITHUB_OUTPUT + + - name: Cache submodules + uses: actions/cache@v3 + with: + path: | + vendor/ + .git/modules + key: ${{ runner.os }}-vendor-modules-${{ steps.submodules.outputs.hash }} + + - name: Install Go + uses: actions/setup-go@v4 + with: + go-version: ${{ env.GO_VERSION }} + cache: false + + - name: Build binary + run: make + + - name: Build library + run: make static-library dynamic-library + + - name: Build examples + run: make build-example + + build-linux: + needs: changes + if: ${{ needs.changes.outputs.v2 == 'true' || needs.changes.outputs.common == 'true' }} + runs-on: ubuntu-latest + timeout-minutes: 60 + + strategy: + matrix: + ext: [deb, rpm] + + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: Get submodules hash + id: submodules + run: | + echo "hash=$(git submodule status | awk '{print $1}' | sort | shasum -a 256 | sed 's/[ -]*//g')" >> $GITHUB_OUTPUT + + - name: Cache submodules + uses: actions/cache@v3 + with: + path: | + vendor/ + .git/modules + key: ${{ runner.os }}-vendor-modules-${{ steps.submodules.outputs.hash }} + + - name: Read VERSION file + id: waku_version + run: | + VERSION=$(cat ./VERSION) + echo "version=$VERSION" >> $GITHUB_OUTPUT + + - name: Install Go + uses: actions/setup-go@v4 + with: + go-version: ${{ env.GO_VERSION }} + cache: false + + - name: Build + id: build + run: | + make build + mkdir ./build/linux + cp ./build/waku ./build/linux/. + strip --strip-unneeded ./build/linux/waku + + - name: Package ${{ matrix.ext }} + uses: bpicode/github-action-fpm@master + with: + fpm_args: ./build/linux/waku=/usr/bin/waku + fpm_opts: '-p gowaku-${{ steps.waku_version.outputs.version }}-x86_64.${{ matrix.ext }} -n go-waku -t ${{ matrix.ext }} -s dir --license "MIT, Apache 2.0" --version ${{ steps.waku_version.outputs.version }} --architecture x86_64 --depends libc6 --description "Go implementation of Waku v2 protocols" --url "https://github.com/waku-org/go-waku" --maintainer "Richard Ramos "' + + - name: Upload ${{ matrix.ext }} + uses: actions/upload-artifact@v3 + with: + name: gowaku-${{ steps.waku_version.outputs.version }}-x86_64.${{ matrix.ext }} + path: ./gowaku-${{ steps.waku_version.outputs.version }}-x86_64.${{ matrix.ext }} + if-no-files-found: error + + test: + needs: changes + if: ${{ needs.changes.outputs.v2 == 'true' || needs.changes.outputs.common == 'true' }} + strategy: + matrix: + tests: [test-ci, test-with-race] + runs-on: ubuntu-latest + timeout-minutes: 60 + + name: ${{ matrix.tests }} + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: Get submodules hash + id: submodules + run: | + echo "hash=$(git submodule status | awk '{print $1}' | sort | shasum -a 256 | sed 's/[ -]*//g')" >> $GITHUB_OUTPUT + + - name: Cache submodules + uses: actions/cache@v3 + with: + path: | + vendor/ + .git/modules + key: ${{ runner.os }}-vendor-modules-${{ steps.submodules.outputs.hash }} + + - name: Install Go + uses: actions/setup-go@v4 + with: + go-version: ${{ env.GO_VERSION }} + cache: false + + - name: "Run tests" + run: make ${{ matrix.tests }} + + - name: "Run onchain-tests" + run: | + docker compose -f .github/docker-compose/ganache.yml up -d + make test-onchain${{ matrix.tests == 'test-with-race' && '-with-race' || '' }} + + - name: "Run tests with postgres" + run: | + docker compose -f .github/docker-compose/postgres.yml up -d + make test-postgres${{ matrix.tests == 'test-with-race' && '-with-race' || '' }} + diff --git a/examples/c-bindings/Makefile b/examples/c-bindings/Makefile index 886cca31..dd487aee 100644 --- a/examples/c-bindings/Makefile +++ b/examples/c-bindings/Makefile @@ -18,7 +18,7 @@ all: build ifeq ($(detected_OS),Linux) PLATFORM_FLAGS_TEST_C ?= -ldl else ifeq ($(detected_OS),Darwin) - PLATFORM_FLAGS_TEST_C ?= -Wl,-headerpad_max_install_names -framework CoreFoundation -framework Security + PLATFORM_FLAGS_TEST_C ?= -Wl,-headerpad_max_install_names -framework CoreFoundation -framework Security -lresolv ifeq ($(detected_arch),ARM) PLATFORM_FLAGS_TEST_C +=-lresolv -framework CoreServices endif