From 11d79fddc324e2e82277e5e617891b6ecc474428 Mon Sep 17 00:00:00 2001 From: Feng Ruohang Date: Tue, 4 Aug 2026 14:30:50 +0800 Subject: [PATCH] ci: gate build, vet, tests, lint, generation, race, and crosscompile Make the repository's actual quality contract visible in CI. Check formatting, build and vet the tree, run cmd and internal tests, enforce pinned lint and generated-file cleanliness, exercise S3 Select under the race detector, and cross-compile every supported target. Keep each concern in a separate job so failures identify the missing guarantee instead of hiding behind a single aggregate test result. Co-authored-by: ChatGPT Co-authored-by: Claude --- .github/workflows/go.yml | 149 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 149 insertions(+) create mode 100644 .github/workflows/go.yml diff --git a/.github/workflows/go.yml b/.github/workflows/go.yml new file mode 100644 index 000000000..bcb13b952 --- /dev/null +++ b/.github/workflows/go.yml @@ -0,0 +1,149 @@ +name: Go CI + +on: + pull_request: + branches: + - master + push: + branches: + - master + workflow_dispatch: + +# Cancel superseded runs for the same PR; never cancel master push runs. +# Keyed on PR number (not head_ref) so fork PRs sharing a branch name +# do not collide. +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.run_id }} + cancel-in-progress: true + +permissions: + contents: read + +jobs: + verify: + name: Format, Build, Vet + runs-on: ubuntu-latest + timeout-minutes: 20 + steps: + - uses: actions/checkout@v4 + + - uses: actions/setup-go@v5 + with: + go-version-file: go.mod + cache: true + + - name: Check gofmt + run: | + unformatted=$(gofmt -l main.go cmd internal) + if [ -n "${unformatted}" ]; then + echo "The following files are not gofmt-formatted:" + echo "${unformatted}" + gofmt -d ${unformatted} + exit 1 + fi + + - name: Build + env: + CGO_ENABLED: 0 + run: go build ./... + + - name: Vet + run: go vet ./... + + quality: + name: Lint, Generated Files + runs-on: ubuntu-latest + timeout-minutes: 25 + steps: + - uses: actions/checkout@v4 + + - uses: actions/setup-go@v5 + with: + go-version-file: go.mod + cache: true + + - name: Lint + run: make lint + + - name: Check generated files + run: make check-gen + + race-s3select: + name: Race, S3 Select + runs-on: ubuntu-latest + timeout-minutes: 15 + steps: + - uses: actions/checkout@v4 + + - uses: actions/setup-go@v5 + with: + go-version-file: go.mod + cache: true + + - name: Run S3 Select tests under race detector + run: go test -race ./internal/s3select/... -count=1 + + crosscompile: + name: Cross Compile + runs-on: ubuntu-latest + timeout-minutes: 20 + steps: + - uses: actions/checkout@v4 + + - uses: actions/setup-go@v5 + with: + go-version-file: go.mod + cache: true + + - name: Build supported targets + run: make crosscompile + + test-internal: + name: Test internal/ + runs-on: ubuntu-latest + timeout-minutes: 25 + steps: + - uses: actions/checkout@v4 + + - uses: actions/setup-go@v5 + with: + go-version-file: go.mod + cache: true + + # internal/http listener tests bind [::1]; runners disable IPv6 by default. + - name: Enable IPv6 + run: | + sudo sysctl net.ipv6.conf.all.disable_ipv6=0 + sudo sysctl net.ipv6.conf.default.disable_ipv6=0 + + - name: Run internal tests + env: + CGO_ENABLED: 0 + MINIO_API_REQUESTS_MAX: "10000" + run: go test ./internal/... -count=1 + + test-cmd: + name: Test cmd/ + runs-on: ubuntu-latest + timeout-minutes: 35 + steps: + - uses: actions/checkout@v4 + + - uses: actions/setup-go@v5 + with: + go-version-file: go.mod + cache: true + + # Some server tests bind IPv6 listeners; runners disable IPv6 by default. + - name: Enable IPv6 + run: | + sudo sysctl net.ipv6.conf.all.disable_ipv6=0 + sudo sysctl net.ipv6.conf.default.disable_ipv6=0 + + - name: Run cmd tests + env: + CGO_ENABLED: 0 + MINIO_API_REQUESTS_MAX: "10000" + # cmd/ is one large package; raise go test's default 10m per-package + # timeout so slower runners fail on the job timeout, not a panic. + run: go test ./cmd/ -count=1 -timeout 30m