From e52d848d05835c46f8a1881411b29e5c3a29bab4 Mon Sep 17 00:00:00 2001 From: Steven Masley Date: Tue, 12 Dec 2023 15:53:26 -0600 Subject: [PATCH] chore: validate queries using sqlc-vet in github actions (#11163) --- .github/workflows/ci.yaml | 31 +++++++++++++++++++++++++++++++ Makefile | 5 +++++ coderd/database/sqlc.yaml | 6 ++++++ 3 files changed, 42 insertions(+) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index dee7fbabdb..ff2b54e45d 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -36,6 +36,7 @@ jobs: ts: ${{ steps.filter.outputs.ts }} k8s: ${{ steps.filter.outputs.k8s }} ci: ${{ steps.filter.outputs.ci }} + db: ${{ steps.filter.outputs.db }} offlinedocs-only: ${{ steps.filter.outputs.offlinedocs_count == steps.filter.outputs.all_count }} offlinedocs: ${{ steps.filter.outputs.offlinedocs }} steps: @@ -57,6 +58,12 @@ jobs: - "examples/web-server/**" - "examples/monitoring/**" - "examples/lima/**" + db: + - "**.sql" + - "coderd/database/queries/**" + - "coderd/database/migrations" + - "coderd/database/sqlc.yaml" + - "coderd/database/dump.sql" go: - "**.sql" - "**.go" @@ -618,6 +625,7 @@ jobs: - test-js - test-e2e - offlinedocs + - sqlc-vet # Allow this job to run even if the needed jobs fail, are skipped or # cancelled. if: always() @@ -908,3 +916,26 @@ jobs: echo "::endgroup::" done + + # sqlc-vet runs a postgres docker container, runs Coder migrations, and then + # runs sqlc-vet to ensure all queries are valid. This catches any mistakes + # in migrations or sqlc queries that makes a query unable to be prepared. + sqlc-vet: + runs-on: ${{ github.repository_owner == 'coder' && 'buildjet-8vcpu-ubuntu-2204' || 'ubuntu-latest' }} + needs: changes + if: needs.changes.outputs.db == 'true' || github.ref == 'refs/heads/main' + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 1 + # We need golang to run the migration main.go + - name: Setup Go + uses: ./.github/actions/setup-go + + - name: Setup sqlc + uses: ./.github/actions/setup-sqlc + + - name: Setup and run sqlc vet + run: | + make sqlc-vet diff --git a/Makefile b/Makefile index 1a94d3a33b..3ef85ea1be 100644 --- a/Makefile +++ b/Makefile @@ -708,6 +708,11 @@ test: gotestsum --format standard-quiet -- -v -short -count=1 ./... .PHONY: test +sqlc-vet: test-postgres-docker + echo "--- sqlc vet" + SQLC_DATABASE_URL="postgresql://postgres:postgres@localhost:5432/$(shell go run scripts/migrate-ci/main.go)" \ + sqlc vet -f coderd/database/sqlc.yaml && echo "Passed sqlc vet" + # When updating -timeout for this test, keep in sync with # test-go-postgres (.github/workflows/coder.yaml). # Do add coverage flags so that test caching works. diff --git a/coderd/database/sqlc.yaml b/coderd/database/sqlc.yaml index 956485311e..2ed67c3ac1 100644 --- a/coderd/database/sqlc.yaml +++ b/coderd/database/sqlc.yaml @@ -82,6 +82,12 @@ sql: - schema: "./dump.sql" queries: "./queries" engine: "postgresql" + # This only works if you are running a local postgres database with the + # schema loaded and migrations run. Run `make sqlc-vet` to run the linter. + database: + uri: "${SQLC_DATABASE_URL}" + rules: + - sqlc/db-prepare gen: go: package: "database"