encapi's schema was a cumulative IF NOT EXISTS blob re-executed inline on every
start: it grows forever, records nothing, and cannot express a change that is
not a fresh CREATE. golib owns that mechanism now, so encapi keeps the SQL and
drops the runner.
- Move the DDL verbatim into migrations/0001_init.sql, embedded via
migrations.FS. It stays IF NOT EXISTS-guarded, so the first start against the
live database re-runs it as a no-op and only lands the schema_migrations row.
- Build the pool with pg.NewMigrated under the advisory lock named
encapi-migrations, and delete the inline migrate(). database.New now takes a
context and a logger; main.go hands it the signal context so a start blocked
on the migration lock still dies on SIGTERM.
- Render the DSN with pg.DSN. The env var contract is untouched — the fields are
still resolved by internal/config, because encapi defaults DBUSER and DBNAME
to "encapi" where pg.DSNFromEnv treats both as required.
- Guard the set: embedded files must match migrations/, every CREATE must be
idempotent, the derived lock key is pinned, and a container test proves the
adoption path over a database that predates schema_migrations.
- Plumb GOPRIVATE=git.unkin.net for the first cross-repo Go dependency:
exported by the Makefile, set in the Dockerfile and the woodpecker Go steps,
documented in the README.
The upstream woodpeckerci/plugin-docker-buildx image does not trust the
internal CA, so pushes/pulls against artifactapi.k8s.syd1.au.unkin.net
fail. Swap both the docker.yaml push step (docker-encapi) and the
build.yaml PR dry-run step to the custom CA-baked image published at
artifactapi.k8s.syd1.au.unkin.net/docker-internal/plugin-docker-buildx:latest.
Hard switch of the docker push target from the Gitea registry to the
artifactapi local docker registry (docker-internal); the Gitea VM and its
registry are being retired. Drops the droneci/DRONECI_PASSWORD creds since
artifactapi accepts unauthenticated in-cluster pushes. Also updates the README image path.
Claude-Session: https://claude.ai/code/session_015ur3i7D2azsMAWTSVABApv
The dnephin go-vet hook runs 'go vet' at the repo root, which has no Go files
(all live under cmd/, internal/, pkg/), failing with 'no Go files'. Replace it
with a local 'go vet ./...' hook, mirroring artifactapi.
The initial commit's .gitignore had unanchored 'encapi' and 'encapi-cli'
patterns intended for built binaries; they also matched the cmd/encapi and
cmd/encapi-cli source directories, so those were silently never committed. The
tag build then failed with 'stat /build/cmd/encapi: directory not found'.
- anchor the binary ignores to the repo root (/encapi, /encapi-cli)
- add the cmd/encapi (server) and cmd/encapi-cli (CLI) main packages