Remove duplication #147
Workflow file for this run
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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. | |
# Race detector support on linux/arm64 was added in go1.12. See | |
# https://go.dev/doc/go1.12. | |
- arch: aarch64 | |
go: '1.5' | |
arm64_race_unsupported: true | |
- arch: aarch64 | |
go: '1.6' | |
arm64_race_unsupported: true | |
- arch: aarch64 | |
go: '1.7' | |
arm64_race_unsupported: true | |
- arch: aarch64 | |
go: '1.8' | |
arm64_race_unsupported: true | |
- arch: aarch64 | |
go: '1.9' | |
arm64_race_unsupported: true | |
- arch: aarch64 | |
go: '1.10' | |
arm64_race_unsupported: true | |
- arch: aarch64 | |
go: '1.11' | |
arm64_race_unsupported: true | |
# Race detector support on linux/s390x was added in go1.19. See | |
# https://go.dev/doc/go1.19. | |
- arch: s390x | |
go: '1.7' | |
s390x_race_unsupported: true | |
- arch: s390x | |
go: '1.8' | |
s390x_race_unsupported: true | |
- arch: s390x | |
go: '1.9' | |
s390x_race_unsupported: true | |
- arch: s390x | |
go: '1.10' | |
s390x_race_unsupported: true | |
- arch: s390x | |
go: '1.11' | |
s390x_race_unsupported: true | |
- arch: s390x | |
go: '1.12' | |
s390x_race_unsupported: true | |
- arch: s390x | |
go: '1.13' | |
s390x_race_unsupported: true | |
- arch: s390x | |
go: '1.14' | |
s390x_race_unsupported: true | |
- arch: s390x | |
go: '1.15' | |
s390x_race_unsupported: true | |
- arch: s390x | |
go: '1.16' | |
s390x_race_unsupported: true | |
- arch: s390x | |
go: '1.17' | |
s390x_race_unsupported: true | |
- arch: s390x | |
go: '1.18' | |
s390x_race_unsupported: true | |
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 | |
if printf "$version\n%s\n" ${{ matrix.go }} | sort -V | head -n1 | xargs test "$version" =; then | |
echo true | |
else | |
echo false | |
fi | |
} | |
# Go binaries built with Go 1.8 and below are incompatible with QEMU user-level emulation. | |
# See https://github.com/golang/go/commit/2673f9e. | |
echo "QEMU_EMULATION_WORKS=$(version_ge 1.9)" >> $GITHUB_OUTPUT | |
# Better inlining in Go 1.12. See https://go.dev/doc/go1.12#compiler. | |
echo "BETTER_INLINING_AVAILABLE=$(version_ge 1.12)" >> $GITHUB_OUTPUT | |
- run: go build -v ./... | |
- name: 'Check that Get is inlined' | |
if: steps.configure_environment.outputs.BETTER_INLINING_AVAILABLE == 'true' | |
shell: bash | |
run: | | |
set -euxo pipefail | |
go build -gcflags='-m' 2>&1 | grep 'can inline Get$' > /dev/null | |
- run: go build -race -v ./... | |
if: ${{ matrix.arch == 'x64' && !matrix.x64_race_broken }} | |
- run: go test -v ./... | |
if: ${{ matrix.arch == 'x64' || matrix.arch == '386'}} | |
- run: go test -race -v ./... | |
if: ${{ matrix.arch == 'x64' && !matrix.x64_race_broken }} | |
- run: go test -bench=. -benchmem -v ./... | |
if: ${{ matrix.arch == 'x64' || matrix.arch == '386'}} | |
- run: go test -bench=. -benchmem -race -v ./... | |
if: ${{ matrix.arch == 'x64' && !matrix.x64_race_broken }} | |
- run: go test -c ./... | |
if: ${{ matrix.arch != 'x64' && matrix.arch != '386'}} | |
- name: 'BuildTestRace with ${{ matrix.go }} for ${{ matrix.arch }}' | |
if: ${{ matrix.arch == 'aarch64' && !matrix.arm64_race_unsupported || matrix.arch == 's390x' && !matrix.s390x_race_unsupported }} | |
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' && !matrix.arm64_race_unsupported && matrix.arm64_unsupported_vma_range || matrix.arch == 's390x' && !matrix.s390x_race_unsupported && 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' && steps.configure_environment.outputs.QEMU_EMULATION_WORKS == 'true' }} | |
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' |