diff --git a/.gitea/workflows/test-go.yml b/.gitea/workflows/test-go.yml index 0eae539f..b3eb990f 100644 --- a/.gitea/workflows/test-go.yml +++ b/.gitea/workflows/test-go.yml @@ -27,6 +27,7 @@ on: - 'go.mod' - 'go.sum' - 'sqlc.yaml' + - 'Makefile' - 'internal/**' - 'cmd/**' - '.golangci.yml' @@ -53,6 +54,9 @@ jobs: go version golangci-lint --version + - name: Generated code matches queries (sqlc) + run: make verify-generate + - name: go vet run: go vet ./... diff --git a/Makefile b/Makefile index fa1e2e04..69fca217 100644 --- a/Makefile +++ b/Makefile @@ -1,10 +1,30 @@ -.PHONY: generate test test-short test-integration lint build +.PHONY: generate generate-go verify-generate test test-short test-integration lint build +# renovate: datasource=docker depName=sqlc/sqlc SQLC_VERSION := 1.31.1 +# Local codegen. Containerised so a dev needs no sqlc install. generate: docker run --rm -v "$(CURDIR):/src" -w /src sqlc/sqlc:$(SQLC_VERSION) generate +# Same codegen, run as a Go tool instead of a container. This is the CI path: +# the ci-go image already has Go, so it avoids docker-in-docker. Pinned to the +# SAME version as `generate` above so both routes emit identical output. +generate-go: + go run github.com/sqlc-dev/sqlc/cmd/sqlc@v$(SQLC_VERSION) generate + +# Fail if the committed generated code no longer matches the .sql sources. +# +# Nothing verified this before, so internal/db/dbq could silently drift from +# internal/db/queries — a hand-edit, a half-applied regen, or a schema change +# without a regen would all pass CI while the typed layer lied about the SQL. +# +# The diff is printed BEFORE the exit-code check on purpose: when this fails, +# the log then contains sqlc's exact expected output, which is what you commit. +verify-generate: generate-go + git --no-pager diff -- internal/db/dbq + git diff --quiet -- internal/db/dbq + test: go test -race ./...