on:
  - pull_request
permissions:
  contents: read
name: CI
jobs:
  build:
    strategy:
      matrix:
        go-version: [oldstable, stable]
        os: [ubuntu-latest, macos-latest, windows-latest]
    runs-on: ${{ matrix.os }}
    steps:
      - uses: actions/setup-go@7a3fe6cf4cb3a834922a1244abfce67bcef6a0c5 # v6
        with:
          go-version: ${{ matrix.go-version }}
      - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
      - run: go build ./...
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/setup-go@7a3fe6cf4cb3a834922a1244abfce67bcef6a0c5 # v6
        with:
          check-latest: true
      - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
      - run: go test ./...
  node_test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
      - uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6
        with:
          node-version: 24
      - uses: actions/setup-go@7a3fe6cf4cb3a834922a1244abfce67bcef6a0c5 # v6
        with:
          check-latest: true
      - run: >
          cd examples/internal/browser &&
          npm install gulp-cli &&
          npm install &&
          ./node_modules/.bin/gulp
  generate:
    container:
      image: ghcr.io/grpc-ecosystem/grpc-gateway/build-env:latest
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
        # Required with newer versions of Git
        # https://github.com/actions/checkout/issues/766
      - run: git config --global --add safe.directory "$GITHUB_WORKSPACE"
      - run: make install
      - run: make clean
      - run: make generate
      - run: go mod tidy
      - run: git diff --exit-code
  bazel:
    container:
      image: ghcr.io/grpc-ecosystem/grpc-gateway/build-env:latest
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
      - uses: actions/cache@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 # v5
        with:
          path: /home/vscode/.cache/_grpc_gateway_bazel
          key: v1-bazel-cache-${{ hashFiles('repositories.bzl') }}
          restore-keys: v1-bazel-cache-
        # Required with newer versions of Git
        # https://github.com/actions/checkout/issues/766
      - run: git config --global --add safe.directory "$GITHUB_WORKSPACE"
      - name: Configure bazel
        run:
          | # put .bazelrc in $HOME so that it's read before project's .bazelrc
          cat > /home/vscode/.bazelrc << EOF
          startup --output_base=/home/vscode/.cache/_grpc_gateway_bazel
          build --@io_bazel_rules_go//go/config:race
          # Workaround https://github.com/bazelbuild/bazel/issues/3645
          # See https://docs.bazel.build/versions/0.23.0/command-line-reference.html
          build --local_ram_resources=7168 # Github runners have 7G of memory
          build --local_cpu_resources=2    # Github runners have 2 vCPU
          EOF
      - name: Check that Bazel BUILD files are up-to-date
        run: bazel run //:gazelle && git diff --exit-code
      - name: Check that repositories.bzl is up-to-date
        run: |
          bazel run //:gazelle -- update-repos -from_file=go.mod -to_macro=repositories.bzl%go_repositories &&
          git diff --exit-code
      - name: Check formatting of Bazel BUILD files
        run: bazel run //:buildifier && git diff --exit-code
      - name: Run tests with Bazel
        run: bazel test //...
  gorelease:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
      - uses: actions/setup-go@7a3fe6cf4cb3a834922a1244abfce67bcef6a0c5 # v6
        with:
          go-version: 1.26
          check-latest: true
      - run: go run golang.org/x/exp/cmd/gorelease@latest -base=v2.27.8
  proto_lint:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
      - uses: actions/setup-go@7a3fe6cf4cb3a834922a1244abfce67bcef6a0c5 # v6
        with:
          check-latest: true
      - run: make install
      - run: PATH=$PATH:~/go/bin buf build
      - run: PATH=$PATH:~/go/bin buf lint
      - run: PATH=$PATH:~/go/bin buf format -w && git diff --exit-code
      - run: PATH=$PATH:~/go/bin buf breaking --path protoc-gen-openapiv2/ --against 'https://github.com/grpc-ecosystem/grpc-gateway.git#branch=main'
  lint:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
      - uses: actions/setup-go@7a3fe6cf4cb3a834922a1244abfce67bcef6a0c5 # v6
        with:
          go-version: 1.26
          check-latest: true
      - uses: dominikh/staticcheck-action@024238d2898c874f26d723e7d0ff4308c35589a2 # v1.4.0
        with:
          install-go: false
  fuzz:
    runs-on: ubuntu-latest
    steps:
      - name: Build Fuzzers
        id: build
        uses: google/oss-fuzz/infra/cifuzz/actions/build_fuzzers@master
        with:
          oss-fuzz-project-name: "grpc-gateway"
          dry-run: false
          language: go
      - name: Run Fuzzers
        uses: google/oss-fuzz/infra/cifuzz/actions/run_fuzzers@master
        with:
          oss-fuzz-project-name: "grpc-gateway"
          fuzz-seconds: 600
          dry-run: false
          language: go
      - name: Upload Crash
        uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6
        if: failure() && steps.build.outcome == 'success'
        with:
          name: artifacts
          path: ./out/artifacts
