Files
hajimehoshi-ebiten/.github/workflows/test.yml
T
dualfroz 8198c5c4b3 .github/workflows: run go test -race for all packages (#3848)
Concurrency tests in the root package, text/v2, vector, internal/thread,
internal/hook, internal/gamepaddb, exp/textinput and exp/vmhost only
catch a data race under the race detector. Run go test -race on ./...
with -p=1, like the plain Linux step, in one Linux cell with the newest
Go, as the races are not platform specific and every Go version in the
matrix compiles the same code.

Closes #3569
2026-10-03 22:21:53 +09:00

366 lines
13 KiB
YAML

name: Test
on: [push, pull_request]
concurrency:
# A push event has no head_ref and falls back to a unique run ID, so pushes are never cancelled.
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
cancel-in-progress: true
jobs:
test:
strategy:
matrix:
os: [ubuntu-latest, macos-latest, windows-latest]
go: ['1.25.x', '1.26.x', '1.27.x']
name: Test with Go ${{ matrix.go }} on ${{ matrix.os }}
runs-on: ${{ matrix.os }}
env:
DISPLAY: ':99.0'
defaults:
run:
shell: bash
steps:
- name: Git
run: |
# See actions/checkout#135
git config --global core.autocrlf false
git config --global core.eol lf
- name: Checkout
uses: actions/checkout@v7
- name: Setup Go
uses: actions/setup-go@v6
with:
go-version: ${{ matrix.go }}
- name: Install dependencies
if: runner.os == 'Linux'
run: |
sudo apt-get update
sudo apt-get install libgl1 libgl1-mesa-dri libx11-6 libxcursor1 libxext6 libxi6 libxinerama1 libxrandr2 libxrender1
- name: Xvfb
if: runner.os == 'Linux'
run: |
Xvfb :99 -screen 0 1024x768x24 > /dev/null 2>&1 &
- name: gofmt
# gofmt's results can differ between Go versions, but not between OSes.
if: runner.os == 'Linux' && matrix.go == '1.27.x'
run: |
files=$(gofmt -l .)
if [ -n "$files" ]; then
echo "$files"
exit 1
fi
- name: go vet (Linux)
if: runner.os == 'Linux'
run: |
go list ./... ./skills/run-ebitengine-app-headless/_driver | grep -v -x -F -f .github/workflows/govetblock_linbsd.txt | xargs go vet
- name: go vet (macOS)
if: runner.os == 'macOS'
run: |
go list ./... ./skills/run-ebitengine-app-headless/_driver | grep -v -x -F -f .github/workflows/govetblock_darwin.txt | xargs go vet
- name: go vet (Windows)
if: runner.os == 'Windows'
run: |
go list ./... ./skills/run-ebitengine-app-headless/_driver | grep -v -x -F -f .github/workflows/govetblock_windows.txt | xargs go vet
- name: go vet (vettool)
run: |
go install ./internal/vettools
go vet -vettool=$(which vettools)${{ runner.os == 'Windows' && '.exe' || '' }} -v ./... ./skills/run-ebitengine-app-headless/_driver
- name: go build
run: |
go build -v ./... ./skills/run-ebitengine-app-headless/_driver
# Compile without optimization to check potential stack overflow.
# The option '-gcflags=all=-N -l' is often used at Visual Studio Code.
# See also https://go.googlesource.com/vscode-go/+/HEAD/docs/debugging.md#launch and the issue #2120.
go build "-gcflags=all=-N -l" -v ./...
- name: go build (cross-compile from Windows)
if: runner.os == 'Windows'
run: |
# Check that cross-compilation works from a non-Linux host.
env GOOS=darwin GOARCH=arm64 go build -v ./...
env GOOS=linux GOARCH=amd64 go build -v ./...
- name: go build (cross-compile from macOS)
if: runner.os == 'macOS'
run: |
# Check that cross-compilation works from a non-Linux host.
env GOOS=linux GOARCH=amd64 go build -v ./...
env GOOS=windows GOARCH=amd64 go build -v ./...
- name: go build (macOS)
if: runner.os == 'macOS'
run: |
env GOOS=darwin GOARCH=amd64 go build -o flappy_amd64 -v ./examples/flappy
env GOOS=darwin GOARCH=arm64 go build -o flappy_arm64 -v ./examples/flappy
lipo -create flappy_amd64 flappy_arm64 -output flappy
file flappy
rm flappy
- name: go mod vendor
run: |
mkdir /tmp/vendoring
cd /tmp/vendoring
go mod init foo
# TODO: Is there a way to create a complete list of Ebitengine sub-packages?
echo 'package main' > main.go
echo 'import (' >> main.go
echo ' _ "github.com/hajimehoshi/ebiten/v2"' >> main.go
echo ' _ "github.com/hajimehoshi/ebiten/v2/audio"' >> main.go
echo ')' >> main.go
echo 'func main() {}' >> main.go
go mod edit -replace github.com/hajimehoshi/ebiten/v2=$GITHUB_WORKSPACE
go mod tidy
go mod vendor
go build -v .
- name: go test (Linux)
if: runner.os == 'Linux'
run: |
go test -shuffle=on -v -p=1 ./...
- name: go test -race (Linux)
if: runner.os == 'Linux' && matrix.go == '1.27.x'
run: |
go test -race -shuffle=on -v -p=1 ./...
- name: go test (Linux 386)
if: runner.os == 'Linux'
run: |
sudo dpkg --add-architecture i386
sudo apt-get update
sudo apt-get install libgl1:i386 libgl1-mesa-dri:i386 libx11-6:i386 libxcursor1:i386 libxext6:i386 libxi6:i386 libxinerama1:i386 libxrandr2:i386 libxrender1:i386
env GOARCH=386 go test -shuffle=on -v -p=1 ./...
- name: go test (Linux OpenGL ES)
if: runner.os == 'Linux'
run: |
sudo apt-get install libegl1 libgles2
env EBITENGINE_GRAPHICS_LIBRARY=opengl go test -shuffle=on -v -p=1 ./...
- name: go test (Windows)
if: runner.os == 'Windows'
run: |
go test -shuffle=on -v ./...
env EBITENGINE_DIRECTX=version=12 go test -shuffle=on -v ./...
- name: go test (Windows 386)
if: runner.os == 'Windows'
run: |
env GOARCH=386 go test -shuffle=on -v ./...
env GOARCH=386 EBITENGINE_DIRECTX=version=12 go test -shuffle=on -v ./...
gbm:
strategy:
matrix:
go: ['1.25.x', '1.26.x', '1.27.x']
name: Test GBM with Go ${{ matrix.go }}
runs-on: ubuntu-latest
defaults:
run:
shell: bash
steps:
- name: Checkout
uses: actions/checkout@v7
- name: Setup Go
uses: actions/setup-go@v6
with:
go-version: ${{ matrix.go }}
- name: Install dependencies
run: |
sudo apt-get update
sudo apt-get install libdrm2 libegl1 libegl-mesa0 libgbm1 libgl1-mesa-dri libgles2 linux-modules-extra-$(uname -r)
- name: Load vkms
run: |
# vkms is a virtual KMS device with a connected output. Mesa renders for it with its software driver.
sudo modprobe vkms
sudo udevadm settle
sudo chmod a+rw /dev/dri/card*
- name: go test (GBM)
run: |
# With neither DISPLAY nor WAYLAND_DISPLAY set, Ebitengine presents through GBM and KMS.
# Only one process can be the DRM master at a time, so packages must run one by one.
go test -shuffle=on -v -p=1 ./...
cross-build:
strategy:
matrix:
go: ['1.25.x', '1.26.x', '1.27.x']
name: Cross build with Go ${{ matrix.go }}
runs-on: ubuntu-latest
defaults:
run:
shell: bash
steps:
- name: Checkout
uses: actions/checkout@v7
- name: Setup Go
uses: actions/setup-go@v6
with:
go-version: ${{ matrix.go }}
- name: go build
run: |
env GOOS=darwin GOARCH=amd64 go build -v ./...
env GOOS=darwin GOARCH=arm64 go build -v ./...
env GOOS=freebsd GOARCH=amd64 go build "-gcflags=github.com/ebitengine/purego/internal/fakecgo=-std" -v ./...
env GOOS=freebsd GOARCH=arm64 go build "-gcflags=github.com/ebitengine/purego/internal/fakecgo=-std" -v ./...
env GOOS=js GOARCH=wasm go build -v ./...
env GOOS=linux GOARCH=386 go build -v ./...
env GOOS=linux GOARCH=amd64 go build -v ./...
env GOOS=linux GOARCH=arm go build -v ./...
env GOOS=linux GOARCH=arm64 go build -v ./...
env GOOS=netbsd GOARCH=amd64 go build -v ./...
env GOOS=netbsd GOARCH=arm64 go build -v ./...
env GOOS=windows GOARCH=386 go build -v ./...
env GOOS=windows GOARCH=amd64 go build -v ./...
env GOOS=windows GOARCH=arm64 go build -v ./...
cgo:
strategy:
matrix:
os: [ubuntu-latest, macos-latest, windows-latest]
go: ['1.25.x', '1.26.x', '1.27.x']
name: Test Cgo with Go ${{ matrix.go }} on ${{ matrix.os }}
runs-on: ${{ matrix.os }}
defaults:
run:
shell: bash
steps:
- name: Git
run: |
# See actions/checkout#135
git config --global core.autocrlf false
git config --global core.eol lf
- name: Checkout
uses: actions/checkout@v7
- name: Setup Go
uses: actions/setup-go@v6
with:
go-version: ${{ matrix.go }}
- name: Setup JDK
uses: actions/setup-java@v5
with:
java-version: '11'
distribution: 'adopt'
- name: Install dependencies
if: runner.os == 'Linux'
run: |
sudo apt-get update
sudo apt-get install libegl-dev
- name: Prepare ebitenmobile test
run: |
cd /tmp
git clone --depth=1 https://github.com/hajimehoshi/go-inovation
cd go-inovation
go mod edit -replace=github.com/hajimehoshi/ebiten/v2=$GITHUB_WORKSPACE
go mod tidy
- name: go build (NintendoSDK)
if: runner.os == 'Linux'
run: |
go build -tags=nintendosdk -v ./...
- name: go build (PlayStation 5)
if: runner.os == 'Linux'
run: |
go build -tags=playstation5 -v ./...
- name: go test internal/glfw (xlibcheck)
if: runner.os == 'Linux'
run: |
sudo dpkg --add-architecture i386
sudo apt-get update
sudo apt-get install gcc-multilib
sudo apt-get install libxcursor-dev libxi-dev libxinerama-dev libxrandr-dev libxrender-dev
sudo apt-get install libxcursor-dev:i386 libxi-dev:i386 libxinerama-dev:i386 libxrandr-dev:i386 libxrender-dev:i386
go test -shuffle=on -v -tags=ebitenginexlibcheck ./internal/glfw/
env CGO_ENABLED=1 GOARCH=386 go test -shuffle=on -v -tags=ebitenginexlibcheck ./internal/glfw/
- name: Install ebitenmobile
run: |
go install ./cmd/ebitenmobile
- name: ebitenmobile bind (Android)
run: |
cd /tmp/go-inovation
ebitenmobile bind -target android -androidapi 23 -javapkg com.hajimehoshi.goinovation -o inovation.aar -v github.com/hajimehoshi/go-inovation/mobile
- name: ebitenmobile bind (iOS)
if: runner.os == 'macOS'
run: |
cd /tmp/go-inovation
ebitenmobile bind -target ios -o Inovation.xcframework -v github.com/hajimehoshi/go-inovation/mobile
wasm:
strategy:
matrix:
go: ['1.25.x', '1.26.x', '1.27.x']
name: Test WebAssembly with Go ${{ matrix.go }}
runs-on: ubuntu-latest
defaults:
run:
shell: bash
steps:
- name: Git
run: |
# See actions/checkout#135
git config --global core.autocrlf false
git config --global core.eol lf
- name: Checkout
uses: actions/checkout@v7
- name: Setup Go
uses: actions/setup-go@v6
with:
go-version: ${{ matrix.go }}
- name: Install Chrome
uses: browser-actions/setup-chrome@latest
- name: Install wasmbrowsertest
run: |
wasmbrowsertest_version=eec8f6b3828fd793968ed35171566ab20de7b4cc
go install github.com/agnivade/wasmbrowsertest@${wasmbrowsertest_version}
mv $(go env GOPATH)/bin/wasmbrowsertest${{ runner.os == 'Windows' && '.exe' || '' }} $(go env GOPATH)/bin/go_js_wasm_exec${{ runner.os == 'Windows' && '.exe' || '' }}
go install github.com/agnivade/wasmbrowsertest/cmd/cleanenv@${wasmbrowsertest_version}
- name: go test (Wasm)
run: |
# Disable AppArmor for Ubuntu 23.10+.
# https://chromium.googlesource.com/chromium/src/+/main/docs/security/apparmor-userns-restrictions.md
echo 0 | sudo tee /proc/sys/kernel/apparmor_restrict_unprivileged_userns
# Wasm tests don't work on macOS with the headless mode enabled, but the headless mode cannot be disabled in GitHub Actions (#2972).
# Wasm tests time out on Windows (#3076).
max_attempts=3
for i in $(seq 1 $max_attempts); do
env GOOS=js GOARCH=wasm cleanenv -remove-prefix GITHUB_ -remove-prefix JAVA_ -remove-prefix PSModulePath -remove-prefix STATS_ -remove-prefix RUNNER_ -- go test -shuffle=on -v ./... -test.paniconexit0=false && break
if [ $i -eq $max_attempts ]; then
echo "All $max_attempts attempts failed."
exit 1
fi
echo "Attempt $i failed. Retrying in 10 seconds..."
sleep 10
done