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