Skip to content

Remove duplication #151

Remove duplication

Remove duplication #151

Workflow file for this run

name: Go
on:
push:
branches:
- master
pull_request:
branches:
- master
schedule:
- cron: 00 4 * * *
jobs:
build:
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
arch:
- armv6
- armv7
- aarch64
- s390x
- 386
- x64
go:
- '1.5'
- '1.6'
- '1.7'
- '1.8'
- '1.9'
- '1.10'
- '1.11'
- '1.12'
- '1.13'
- '1.14'
- '1.15'
- '1.16'
- '1.17'
- '1.18'
- '1.19'
- '1.20'
- '1.21'
- '1.22'
exclude:
# Support for s390x was added in Go1.7. See https://go.dev/doc/go1.7#ports.
- arch: s390x
go: '1.5'
- arch: s390x
go: '1.6'
# Race detector binaries crash with:
#
# FATAL: ThreadSanitizer: unsupported VMA range
#
# See https://github.com/golang/go/issues/29948.
arm64_unsupported_vma_range:
- true
# Race detector binaries crash with:
#
# ==17==ERROR: ThreadSanitizer failed to allocate 0x7f0000 (8323072) bytes at address 9000001a0000 (errno: 12)
#
# See https://github.com/golang/go/issues/67881.
s390x_thread_sanitizer_failed_to_allocate:
- true
include:
# Race builds are pretty much busted on Go 1.4 and below on systems
# with newer C compilers. A number of fixes were backported to
# go1.4-bootstrap but not any released version. See
# https://github.com/golang/go/compare/go1.4.3...release-branch.go1.4.
#
# Race builds aren't supported on linux/386.
#
# Cross-compilation became possible in go1.5 with the removal of C
# code from the compiler. See https://go.dev/doc/go1.5#c.
#
# Race builds aren't supported in gccgo.
#
# Cross-compilation isn't supported in gccgo.
- arch: x64
go: '1.3'
x64_race_broken: true
- arch: x64
go: '1.4'
x64_race_broken: true
- arch: x64
go: gccgo-9
x64_race_broken: true
- arch: x64
go: gccgo-10
x64_race_broken: true
- arch: x64
go: gccgo-11
x64_race_broken: true
- arch: x64
go: gccgo-12
x64_race_broken: true
# NB: gccgo-13 and gccgo-14 are not available in the Ubuntu 22.04.
#
# TODO(https://github.com/actions/runner-images/issues/9848): Add gccgo-13 and gccgo-14
# when Ubuntu 24.04 is GA on GitHub Actions.
steps:
- uses: actions/checkout@v4
- name: Set up Go
if: ${{ !startsWith(matrix.go, 'gccgo-') }}
uses: actions/[email protected]
with:
go-version: ${{ matrix.go }}
- name: Set up gccgo
if: ${{ startsWith(matrix.go, 'gccgo-') }}
shell: bash
run: |
set -euxo pipefail
sudo apt update
sudo apt install -y ${{ matrix.go }}
echo ${{ matrix.go }} | sed 's/^gcc//' | xargs -I % ln -s /usr/bin/% /usr/local/bin/go
go version
- name: Configure environment
id: configure_environment
shell: bash
run: |
set -euxo pipefail
case ${{ matrix.arch }} in
armv6)
echo GOARCH=arm >> "$GITHUB_ENV"
echo GOARM=6 >> "$GITHUB_ENV"
;;
armv7)
echo GOARCH=arm >> "$GITHUB_ENV"
echo GOARM=7 >> "$GITHUB_ENV"
;;
aarch64)
echo GOARCH=arm64 >> "$GITHUB_ENV"
;;
s390x)
echo GOARCH=s390x >> "$GITHUB_ENV"
;;
386)
echo GOARCH=386 >> "$GITHUB_ENV"
;;
x64)
echo GOARCH=amd64 >> "$GITHUB_ENV"
;;
*)
echo "Unknown architecture: ${{ matrix.arch }}"
exit 1
;;
esac
version_ge() {
version=$1
printf "$version\n%s\n" ${{ matrix.go }} | sort -V | head -n1 | xargs test "$version" =
}
# Go binaries built with Go 1.8 and below are incompatible with QEMU user-level emulation.
# See https://github.com/golang/go/commit/2673f9e.
if version_ge 1.9; then
echo "QEMU_EMULATION_WORKS=1" >> "$GITHUB_OUTPUT"
fi
if version_ge 1.12; then
# Better inlining in Go 1.12. See https://go.dev/doc/go1.12#compiler.
echo "BETTER_INLINING_AVAILABLE=1" >> "$GITHUB_OUTPUT"
# Race detector support on linux/arm64 was added in go1.12. See
# https://go.dev/doc/go1.12.
echo "ARM64_RACE_SUPPORTED=1" >> "$GITHUB_OUTPUT"
fi
if version_ge 1.19; then
# Race detector support on linux/s390x was added in go1.19. See
# https://go.dev/doc/go1.19.
echo "S390X_RACE_SUPPORTED=1" >> "$GITHUB_OUTPUT"
fi
- name: 'Check that Get is inlined'
if: ${{ !startsWith(matrix.go, 'gccgo-') && steps.configure_environment.outputs.BETTER_INLINING_AVAILABLE }}
shell: bash
run: |
set -euxo pipefail
go build -gcflags='-m' 2>&1 | grep 'can inline Get$' > /dev/null
- run: go build -v ./...
- run: go test -c ./...
- run: go build -race -v ./...
if: ${{ matrix.arch == 'x64' && !matrix.x64_race_broken }}
- run: go test -c -race -v ./...
- name: 'BuildTestRace with ${{ matrix.go }} for ${{ matrix.arch }}'
if: ${{ matrix.arch == 'aarch64' && steps.configure_environment.outputs.ARM64_RACE_SUPPORTED || matrix.arch == 's390x' && steps.configure_environment.outputs.S390X_RACE_SUPPORTED }}
env:
CGO_ENABLED: 1
shell: bash
run: |
set -euxo pipefail
# Non-host *.syso files are missing from the Go toolchains provided
# by setup-go. See https://github.com/actions/setup-go/issues/181.
curl --location --output "$(go env GOROOT)"/src/runtime/race/race_linux_"$GOARCH".syso \
https://github.com/golang/go/raw/release-branch.go${{ matrix.go }}/src/runtime/race/race_linux_"$GOARCH".syso
sudo apt update
sudo apt install -y gcc-${{ matrix.arch }}-linux-gnu
CC=${{ matrix.arch }}-linux-gnu-gcc CC_FOR_TARGET=gcc-${{ matrix.arch }}-linux-gnu go test -c -race -o goid.race.test ./...
- name: 'DeleteTestRace with $${{ matrix.go }} for ${{ matrix.arch }}'
if: ${{ matrix.arch == 'aarch64' && steps.configure_environment.outputs.ARM64_RACE_SUPPORTED && matrix.arm64_unsupported_vma_range || matrix.arch == 's390x' && steps.configure_environment.outputs.S390X_RACE_SUPPORTED && matrix.s390x_thread_sanitizer_failed_to_allocate }}
run: rm goid.race.test
- name: 'Test and Bench with ${{ matrix.go }} on ${{ matrix.arch }}'
if: ${{ matrix.arch == '386' || matrix.arch == 'x64' }}
shell: bash
run: |
set -euxo pipefail
find . -name '*.test' -type f -executable -print0 | \
xargs -t -0 -I '{}' sh -c '{} -test.v && {} -test.bench=. -test.benchmem -test.v'
- name: 'Test and Bench with ${{ matrix.go }} on ${{ matrix.arch }}'
if: ${{ matrix.arch != '386' && matrix.arch != 'x64' && steps.configure_environment.outputs.QEMU_EMULATION_WORKS }}
uses: uraimo/run-on-arch-action@v2
with:
arch: ${{ matrix.arch }}
distro: bookworm
dockerRunArgs: --mount type=bind,source="$(pwd)",target=/checkout,readonly
shell: /bin/bash
run: |
set -euxo pipefail
find /checkout -name '*.test' -type f -executable -print0 | \
xargs -t -0 -I '{}' sh -c '{} -test.v && {} -test.bench=. -test.benchmem -test.v'