From f0439000cbed0ffdccad0521748bcf1738af4a0c Mon Sep 17 00:00:00 2001 From: Elijah Duffy Date: Tue, 27 Oct 2026 23:07:22 -0700 Subject: [PATCH] feat(migrate): configure embedded Goose providers (#14) Add embedded SQL and provider-local Go migrations with slog logging and Postgres session locking, returning Goose's Provider directly. Cover timestamp and sequential versions, failure recovery, and concurrent startup with SQLite and Postgres tests. Reuse page's Postgres CI service. Document authoring conventions and the Go template compatibility gate. Closes #7 Refs #9 --- .gitea/workflows/ci.yml | 38 +- README.md | 5 + go.mod | 20 + go.sum | 135 ++++-- migrate/README.md | 97 ++++ migrate/migrate.go | 65 +++ migrate/migrate_test.go | 457 ++++++++++++++++++ migrate/testdata/failure/00007_events.sql | 6 + .../failure/20261026093000_second.sql | 5 + .../failure/20261027114500_broken.sql | 6 + migrate/testdata/migrations/00007_events.sql | 6 + .../migrations/20261026093000_second.sql | 5 + .../migrations/20261027114500_third.sql | 5 + migrate/testdata/numeric/00007_events.sql | 6 + migrate/testdata/numeric/00010_event.sql | 5 + 15 files changed, 805 insertions(+), 56 deletions(-) create mode 100644 migrate/README.md create mode 100644 migrate/migrate.go create mode 100644 migrate/migrate_test.go create mode 100644 migrate/testdata/failure/00007_events.sql create mode 100644 migrate/testdata/failure/20261026093000_second.sql create mode 100644 migrate/testdata/failure/20261027114500_broken.sql create mode 100644 migrate/testdata/migrations/00007_events.sql create mode 100644 migrate/testdata/migrations/20261026093000_second.sql create mode 100644 migrate/testdata/migrations/20261027114500_third.sql create mode 100644 migrate/testdata/numeric/00007_events.sql create mode 100644 migrate/testdata/numeric/00010_event.sql diff --git a/.gitea/workflows/ci.yml b/.gitea/workflows/ci.yml index 265a02c..5910f78 100644 --- a/.gitea/workflows/ci.yml +++ b/.gitea/workflows/ci.yml @@ -15,6 +15,17 @@ on: jobs: check: runs-on: ubuntu-latest + services: + postgres: + image: postgres:17-alpine + env: + POSTGRES_PASSWORD: page-test + POSTGRES_DB: page_test + options: >- + --health-cmd "pg_isready -U postgres -d page_test" + --health-interval 5s + --health-timeout 5s + --health-retries 12 steps: - uses: actions/checkout@v7.0.1 with: @@ -26,6 +37,11 @@ jobs: run: test -z "$(gofmt -l .)" - run: go vet ./... - run: go test -race ./... + env: + CI: "true" + MIGRATE_POSTGRES_DSN: postgres://postgres:page-test@postgres:5432/page_test?sslmode=disable + PAGE_POSTGRES_DSN: postgres://postgres:page-test@postgres:5432/page_test?sslmode=disable + PAGE_REQUIRE_POSTGRES: "1" - name: Require issue URLs in TODO comments run: | find . -type d \( -name .git -o -name node_modules -o -name vendor -o -name generated -o -name gen -o -name target -o -name dist -o -name build -o -name .svelte-kit -o -name .next \) -prune -o -type f \( -name '*.go' -o -name '*.ts' -o -name '*.tsx' -o -name '*.js' -o -name '*.svelte' -o -name '*.rs' -o -name '*.sql' -o -name '*.sh' -o -name '*.proto' -o -name '*.graphql' -o -name '*.yml' -o -name '*.yaml' -o -name '*.toml' \) -exec awk 'match($0, "((^|[^:])[/][/]|[/][*]|(^|[[:space:]])(#|--)|^[[:space:]]*([*]|