diff --git a/.github/workflows/generator.yaml b/.github/workflows/generator.yaml
index df0fd1cfb..da8a27237 100644
--- a/.github/workflows/generator.yaml
+++ b/.github/workflows/generator.yaml
@@ -23,59 +23,3 @@ jobs:
       run: go version
     - run: go mod tidy
     - run: go test ./...
-
-  lint:
-    runs-on: ubuntu-24.04
-    strategy:
-      matrix:
-        go-version: [ '1.23' ]
-    defaults:
-      run:
-        working-directory: generator
-    steps:
-    - uses: actions/checkout@v4
-    - name: Setup Go ${{ matrix.go-version }}
-      uses: actions/setup-go@v5
-      with:
-        go-version: ${{ matrix.go-version }}
-        cache-dependency-path: |
-          generator/go.sum
-    - name: Display Go version
-      run: go version
-    - run: go mod tidy
-    - run: go fmt ./...
-    - run: go vet ./...
-    - run: |
-        # unparam does not seem to have releases. Using `latest` sounds risky.
-        go get mvdan.cc/unparam@57a3b4290ba3724102fdbbe72314f2b782d4bef5
-        go run mvdan.cc/unparam ./...
-    - name: Run `staticcheck`
-      uses: dominikh/staticcheck-action@v1.3.0
-      with:
-          install-go: false
-          cache-key: ${{ matrix.go-version }}
-          working-directory: generator
-    - name: Detect Changes
-      run: git diff --exit-code
-
-  vuln:
-    runs-on: ubuntu-24.04
-    strategy:
-      matrix:
-        go-version: [ '1.23' ]
-    defaults:
-      run:
-        working-directory: generator
-    steps:
-    - uses: actions/checkout@v4
-    - name: Setup Go ${{ matrix.go-version }}
-      uses: actions/setup-go@v5
-      with:
-        go-version: ${{ matrix.go-version }}
-        cache-dependency-path: |
-          generator/go.sum
-    - name: Display Go version
-      run: go version
-    - run: |
-        go get golang.org/x/vuln/cmd/govulncheck@v1.1.3
-        go run golang.org/x/vuln/cmd/govulncheck ./...
diff --git a/generator/all_test.go b/generator/all_test.go
new file mode 100644
index 000000000..3874b82fe
--- /dev/null
+++ b/generator/all_test.go
@@ -0,0 +1,65 @@
+// Copyright 2022 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package main
+
+import (
+	"errors"
+	"os/exec"
+	"testing"
+
+	"mvdan.cc/unparam/check"
+)
+
+func TestStaticCheck(t *testing.T) {
+	rungo(t, "run", "honnef.co/go/tools/cmd/staticcheck@v0.5.1", "./...")
+}
+
+func TestUnparam(t *testing.T) {
+	warns, err := check.UnusedParams(false, false, false, "./...")
+	if err != nil {
+		t.Fatalf("check.UnusedParams: %v", err)
+	}
+	for _, warn := range warns {
+		t.Error(warn)
+	}
+}
+
+func TestVet(t *testing.T) {
+	rungo(t, "vet", "-all", "./...")
+}
+
+func TestGoModTidy(t *testing.T) {
+	rungo(t, "mod", "tidy")
+}
+
+func TestGoFmt(t *testing.T) {
+	rungo(t, "fmt")
+}
+
+func TestGovulncheck(t *testing.T) {
+	rungo(t, "run", "golang.org/x/vuln/cmd/govulncheck@v1.1.3", "./...")
+}
+
+func rungo(t *testing.T, args ...string) {
+	t.Helper()
+
+	cmd := exec.Command("go", args...)
+	if output, err := cmd.CombinedOutput(); err != nil {
+		if ee := (*exec.ExitError)(nil); errors.As(err, &ee) && len(ee.Stderr) > 0 {
+			t.Fatalf("%v: %v\n%s", cmd, err, ee.Stderr)
+		}
+		t.Fatalf("%v: %v\n%s", cmd, err, output)
+	}
+}
diff --git a/generator/go.mod b/generator/go.mod
index efb3cb985..d1e598791 100644
--- a/generator/go.mod
+++ b/generator/go.mod
@@ -2,4 +2,13 @@ module github.com/googleapis/google-cloud-rust/generator
 
 go 1.23.2
 
-require github.com/iancoleman/strcase v0.3.0
+require (
+	github.com/iancoleman/strcase v0.3.0
+	mvdan.cc/unparam v0.0.0-20240917084806-57a3b4290ba3
+)
+
+require (
+	golang.org/x/mod v0.21.0 // indirect
+	golang.org/x/sync v0.8.0 // indirect
+	golang.org/x/tools v0.25.0 // indirect
+)
diff --git a/generator/go.sum b/generator/go.sum
index 6261b6ac7..4af9b48c9 100644
--- a/generator/go.sum
+++ b/generator/go.sum
@@ -1,2 +1,10 @@
 github.com/iancoleman/strcase v0.3.0 h1:nTXanmYxhfFAMjZL34Ov6gkzEsSJZ5DbhxWjvSASxEI=
 github.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=
+golang.org/x/mod v0.21.0 h1:vvrHzRwRfVKSiLrG+d4FMl/Qi4ukBCE6kZlTUkDYRT0=
+golang.org/x/mod v0.21.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY=
+golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ=
+golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
+golang.org/x/tools v0.25.0 h1:oFU9pkj/iJgs+0DT+VMHrx+oBKs/LJMV+Uvg78sl+fE=
+golang.org/x/tools v0.25.0/go.mod h1:/vtpO8WL1N9cQC3FN5zPqb//fRXskFHbLKk4OW1Q7rg=
+mvdan.cc/unparam v0.0.0-20240917084806-57a3b4290ba3 h1:YkmTN1n5U60NM02j7TCSWRlW3fqNiuXe/eVXf0dLFN8=
+mvdan.cc/unparam v0.0.0-20240917084806-57a3b4290ba3/go.mod h1:z5yboO1sP1Q9pcfvS597TpfbNXQjphDlkCJHzt13ybc=