diff --git a/.github/workflows/go-test-config.json b/.github/workflows/go-test-config.json new file mode 100644 index 0000000000..251fc89f02 --- /dev/null +++ b/.github/workflows/go-test-config.json @@ -0,0 +1,4 @@ +{ + "skip32bit": true, + "gotestflags": "-p 1" +} diff --git a/.github/workflows/go-test-template.yml b/.github/workflows/go-test-template.yml new file mode 100644 index 0000000000..d252b76e32 --- /dev/null +++ b/.github/workflows/go-test-template.yml @@ -0,0 +1,138 @@ +name: Go Test +on: + workflow_call: + inputs: + go-versions: + required: false + type: string + default: '["this", "next"]' + secrets: + CODECOV_TOKEN: + required: false + +defaults: + run: + shell: bash + +jobs: + unit: + strategy: + fail-fast: false + matrix: + os: ["ubuntu", "windows", "macos"] + go: ${{ fromJSON(inputs.go-versions) }} + env: + GOTESTFLAGS: -cover -coverprofile=module-coverage.txt -coverpkg=./... + GO386FLAGS: "" + GORACEFLAGS: "" + runs-on: ${{ fromJSON(vars[format('UCI_GO_TEST_RUNNER_{0}', matrix.os)] || format('"{0}-latest"', matrix.os)) }} + name: ${{ matrix.os }} (go ${{ matrix.go }}) + steps: + - name: Use msys2 on windows + if: matrix.os == 'windows' + # The executable for msys2 is also called bash.cmd + # https://github.com/actions/virtual-environments/blob/main/images/win/Windows2019-Readme.md#shells + # If we prepend its location to the PATH + # subsequent 'shell: bash' steps will use msys2 instead of gitbash + run: echo "C:/msys64/usr/bin" >> $GITHUB_PATH + - name: Check out the repository + uses: actions/checkout@v4 + with: + submodules: recursive + - name: Check out the latest stable version of Go + uses: actions/setup-go@v5 + with: + go-version: stable + # cache: false + - name: Read the Unified GitHub Workflows configuration + id: config + uses: ipdxco/unified-github-workflows/.github/actions/read-config@main + - name: Read the go.mod file + id: go-mod + uses: ipdxco/unified-github-workflows/.github/actions/read-go-mod@main + - name: Determine the Go version to use based on the go.mod file + id: go + env: + MATRIX_GO: ${{ matrix.go }} + GO_MOD_VERSION: ${{ fromJSON(steps.go-mod.outputs.json).Go }} + run: | + if [[ "$MATRIX_GO" == "this" ]]; then + echo "version=$GO_MOD_VERSION.x" >> $GITHUB_OUTPUT + elif [[ "$MATRIX_GO" == "next" ]]; then + MAJOR="${GO_MOD_VERSION%.[0-9]*}" + MINOR="${GO_MOD_VERSION#[0-9]*.}" + echo "version=$MAJOR.$(($MINOR+1)).x" >> $GITHUB_OUTPUT + elif [[ "$MATRIX_GO" == "prev" ]]; then + MAJOR="${GO_MOD_VERSION%.[0-9]*}" + MINOR="${GO_MOD_VERSION#[0-9]*.}" + echo "version=$MAJOR.$(($MINOR-1)).x" >> $GITHUB_OUTPUT + else + echo "version=$MATRIX_GO" >> $GITHUB_OUTPUT + fi + - name: Enable shuffle flag for go test command + if: toJSON(fromJSON(steps.config.outputs.json).shuffle) != 'false' + run: | + echo "GOTESTFLAGS=-shuffle=on $GOTESTFLAGS" >> $GITHUB_ENV + echo "GO386FLAGS=-shuffle=on $GO386FLAGS" >> $GITHUB_ENV + echo "GORACEFLAGS=-shuffle=on $GORACEFLAGS" >> $GITHUB_ENV + - name: Enable verbose flag for go test command + if: toJSON(fromJSON(steps.config.outputs.json).verbose) != 'false' + run: | + echo "GOTESTFLAGS=-v $GOTESTFLAGS" >> $GITHUB_ENV + echo "GO386FLAGS=-v $GO386FLAGS" >> $GITHUB_ENV + echo "GORACEFLAGS=-v $GORACEFLAGS" >> $GITHUB_ENV + - name: Set extra flags for go test command + if: fromJSON(steps.config.outputs.json).gotestflags) != '' + run: | + echo "GOTESTFLAGS=${{ fromJSON(steps.config.outputs.json).gotestflags}} $GOTESTFLAGS" >> $GITHUB_ENV + - name: Set up the Go version read from the go.mod file + uses: actions/setup-go@v5 + with: + go-version: ${{ steps.go.outputs.version }} + - name: Display the Go version and environment + run: | + go version + go env + - name: Run repo-specific setup + uses: libp2p/uci/.github/actions/go-test-setup + if: hashFiles('./.github/actions/go-test-setup') != '' + - name: Run tests + if: contains(fromJSON(steps.config.outputs.json).skipOSes, matrix.os) == false + uses: protocol/multiple-go-modules@v1.4 + env: + GOFLAGS: ${{ format('{0} {1}', env.GOTESTFLAGS, env.GOFLAGS) }} + with: + run: go test ./... + - name: Run tests (32 bit) + # can't run 32 bit tests on OSX. + if: matrix.os != 'macos' && + fromJSON(steps.config.outputs.json).skip32bit != true && + contains(fromJSON(steps.config.outputs.json).skipOSes, matrix.os) == false + uses: protocol/multiple-go-modules@v1.4 + env: + GOARCH: 386 + GOFLAGS: ${{ format('{0} {1}', env.GO386FLAGS, env.GOFLAGS) }} + with: + run: | + export "PATH=$PATH_386:$PATH" + go test ./... + - name: Run tests with race detector + # speed things up. Windows and OSX VMs are slow + if: matrix.os == 'ubuntu' && + fromJSON(steps.config.outputs.json).skipRace != true && + contains(fromJSON(steps.config.outputs.json).skipOSes, matrix.os) == false + uses: protocol/multiple-go-modules@v1.4 + env: + GOFLAGS: ${{ format('{0} {1}', env.GORACEFLAGS, env.GOFLAGS) }} + with: + run: go test -race ./... + - name: Collect coverage files + id: coverages + run: echo "files=$(find . -type f -name 'module-coverage.txt' | tr -s '\n' ',' | sed 's/,$//')" >> $GITHUB_OUTPUT + - name: Upload coverage to Codecov + uses: codecov/codecov-action@54bcd8715eee62d40e33596ef5e8f0f48dbbccab # v4.1.0 + with: + files: ${{ steps.coverages.outputs.files }} + env_vars: OS=${{ matrix.os }}, GO=${{ steps.go.outputs.version }} + token: ${{ secrets.CODECOV_TOKEN }} + fail_ci_if_error: false diff --git a/.github/workflows/go-test.yml b/.github/workflows/go-test.yml index e33480c0f8..9687369870 100644 --- a/.github/workflows/go-test.yml +++ b/.github/workflows/go-test.yml @@ -3,7 +3,7 @@ name: Go Test on: pull_request: push: - branches: ["master","release-v0[0-9][0-9]"] + branches: ["master", "release-v0[0-9][0-9]"] workflow_dispatch: permissions: @@ -15,7 +15,7 @@ concurrency: jobs: go-test: - uses: libp2p/uci/.github/workflows/go-test.yml@v1.0 + uses: ./.github/workflows/go-test.yml@v1.0 with: go-versions: '["1.21.x", "1.22.x"]' secrets: