Skip to content

Merge branch 'main' into release-lts-1 #7904

Merge branch 'main' into release-lts-1

Merge branch 'main' into release-lts-1 #7904

Workflow file for this run

name: Build and Test
on:
push:
branches:
- dev
- stage
- main
- release**
pull_request:
jobs:
job_go_checks:
runs-on: ubuntu-latest
defaults:
run:
shell: bash
steps:
- name: Print github env vars
run: |
echo github.event_name: ${{ github.event_name }}
echo github.ref: ${{ github.ref }}
echo github.ref_name: ${{ github.ref_name }}
echo github.head_ref: ${{ github.head_ref }}
echo github.base_ref: ${{ github.base_ref }}
- name: Checkout code
uses: actions/checkout@v4
- name: Set up Go environment
uses: actions/setup-go@v5
with:
go-version: '1.23'
- name: Tidy go module
run: |
go mod tidy
if [[ $(git status --porcelain) ]]; then
git diff
echo
echo "go mod tidy made these changes, please run 'go mod tidy' and include those changes in a commit"
exit 1
fi
- name: Run gofumpt
# Run gofumpt first, as it's quick and issues are common.
run: diff -u <(echo -n) <(go run mvdan.cc/[email protected] -d .)
- name: Run go vet
run: go vet ./...
- name: Run go generate
run: |
go generate ./...
if [[ $(git status --porcelain) ]]; then
git diff
echo
echo "go generate made these changes, please run 'go generate ./...' and include those changes in a commit"
exit 1
fi
- name: Run staticcheck
run: |
go install honnef.co/go/tools/cmd/[email protected]
staticcheck -debug.version
staticcheck ./... 2> staticcheck-stderr
- name: Check staticcheck stderr (this step isn't needed because we are using actions/setup-go@v5 on GitHub hosted runner)
run: |
if cat staticcheck-stderr | grep "matched no packages" ; then
echo "staticcheck step did nothing, due to https://github.com/vocdoni/vocdoni-node/issues/444"
echo "Please re-run job."
# seize the opportunity to fix the underlying problem: a permissions error in ~/.cache
epoch=$(date +%s)
# if any file is reported by find, grep returns true and the mv is done
if [ -d ~/.cache ] && find ~/.cache -not -user `id --user` -print0 | grep -qz . ; then
echo "~/.cache had broken permissions, moving it away... (cache will be rebuilt with usage)"
mv -v ~/.cache ~/.cache-broken-by-root-$epoch
fi
exit 2
fi
job_go_test:
runs-on: ubuntu-latest
env:
LOG_PANIC_ON_INVALIDCHARS: true # check that log lines contains no invalid chars (evidence of format mismatch)
steps:
- uses: actions/checkout@v4
- uses: benjlevesque/[email protected] # sets env.SHA to the first 7 chars of github.sha
- uses: actions/setup-go@v5
with:
go-version: '1.23'
- run: mkdir -p "$PWD/gocoverage-unit/"
- name: Run Go test -race
id: go-test-race
# note that -race can easily make the crypto stuff 10x slower
# this is further limited to selected branches at the beginning of this file
if: runner.debug ||
github.event_name == 'push' &&
github.ref != 'refs/heads/dev'
env:
GORACE: atexit_sleep_ms=10 # the default of 1000 makes every Go package test sleep for 1s; see https://go.dev/issues/20364
run: go test ./...
-race -timeout=15m -vet=off
-cover -coverpkg=./... -covermode=atomic -args -test.gocoverdir="$PWD/gocoverage-unit/"
- name: Run Go test
if: steps.go-test-race.outcome == 'skipped'
# quicker, non-race test in case it's a PR or push to dev
run: go test ./...
-cover -coverpkg=./... -covermode=count -args -test.gocoverdir="$PWD/gocoverage-unit/"
- name: Store code coverage artifact (unit)
uses: actions/upload-artifact@v4
with:
name: gocoverage-unit@${{ env.SHA }}
path: gocoverage-unit/
job_compose_test:
runs-on: [self-hosted]
steps:
- uses: actions/checkout@v4
- uses: benjlevesque/[email protected] # sets env.SHA to the first 7 chars of github.sha
- name: Run compose script
env:
TESTSUITE_BUILD_TAG: ${{ github.sha }}
COMPOSE_PROJECT_NAME: testsuite_${{ github.run_id }} # unique name for docker compose (needed for concurrent job runs)
COMPOSE_DVOTE_PORT_MAPPING: "9090" # this binds gateway0 to a random available port on docker host (needed for concurrent job runs)
COMPOSE_HOST_PATH: ${{ github.workspace }}/dockerfiles/testsuite
LOG_PANIC_ON_INVALIDCHARS: true # check that log lines contains no invalid chars (evidence of format mismatch)
GOCOVERDIR: "./gocoverage-integration/" # collect code coverage when running binaries
CONCURRENT: 1 # run all the start_test.sh tests concurrently
BUILDARGS: "-race" # this makes the integration test only slightly slower (around +10%) unlike the abismal effect in unit test (10x)
run: |
cd dockerfiles/testsuite && ./start_test.sh
- name: Store code coverage artifact (integration)
uses: actions/upload-artifact@v4
with:
name: gocoverage-integration@${{ env.SHA }}
path: dockerfiles/testsuite/gocoverage-integration/
call-docker-release:
name: Docker
needs: [job_go_checks, job_go_test, job_compose_test]
# docker releases are triggered only on push to the selected branches at the beginning of this file
if: github.event_name == 'push' &&
github.ref != 'refs/heads/dev' # but pushes to dev trigger a release via a quicker workflow (deploy-dev.yml) which skips the tests
uses: vocdoni/vocdoni-node/.github/workflows/docker-release.yml@main
secrets: inherit
with:
image-tag: ${{ github.ref_name }}
job_gocoverage_textfmt:
name: Convert coverage (bin->txt)
continue-on-error: true # never mark the whole CI as failed because of this job
needs: [job_go_test, job_compose_test]
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: benjlevesque/[email protected] # sets env.SHA to the first 7 chars of github.sha
- uses: actions/download-artifact@v4
- uses: actions/setup-go@v5
with:
go-version: '1.23'
cache: false
- name: Convert gocoverage format
run: |
go tool covdata textfmt -i=gocoverage-unit@${{ env.SHA }}/ \
-o gocoverage-unit@${{ env.SHA }}.txt
go tool covdata textfmt -i=gocoverage-integration@${{ env.SHA }}/ \
-o gocoverage-integration@${{ env.SHA }}.txt
- name: Merge both files
run: |
go install github.com/wadey/gocovmerge@latest
# dirty hack since integration is mode atomic and unit mode count, which are perfectly mergeable
# but gocovmerge doesn't recognize this: "cannot merge profiles with different modes"
sed 's/mode: count/mode: atomic/' gocoverage-unit@${{ env.SHA }}.txt \
> gocoverage-unit@${{ env.SHA }}.tmp
gocovmerge gocoverage-unit@${{ env.SHA }}.tmp \
gocoverage-integration@${{ env.SHA }}.txt \
> gocoverage-merged@${{ env.SHA }}.txt
rm -f gocoverage-unit@${{ env.SHA }}.tmp
- name: Store code coverage artifact (all, textfmt)
if: ${{ always() }}
uses: actions/upload-artifact@v4
with:
name: gocoverage-all-textfmt@${{ env.SHA }}
path: gocoverage-*.txt
job_gocoverage_coveralls:
name: Publish coverage (Coveralls)
runs-on: ubuntu-latest
needs: [job_gocoverage_textfmt]
continue-on-error: true # never mark the whole CI as failed because of this job
steps:
- uses: actions/checkout@v4
- uses: benjlevesque/[email protected] # sets env.SHA to the first 7 chars of github.sha
- uses: actions/download-artifact@v4
with:
name: gocoverage-all-textfmt@${{ env.SHA }}
- uses: actions/setup-go@v5
with:
go-version: '1.23'
cache: false
- name: Send coverage to coveralls.io (unit)
if: ${{ always() }}
uses: shogo82148/actions-goveralls@v1
with:
path-to-profile: gocoverage-unit@${{ env.SHA }}.txt
flag-name: unit
parallel: true
- name: Send coverage to coveralls.io (integration)
if: ${{ always() }}
uses: shogo82148/actions-goveralls@v1
with:
path-to-profile: gocoverage-integration@${{ env.SHA }}.txt
flag-name: integration
parallel: true
- name: Tell coveralls.io we're done
if: ${{ always() }}
uses: shogo82148/actions-goveralls@v1
with:
parallel-finished: true