make build now builds with CGO_ENABLED=0, and the image builds through it. The binary's only cgo code was mattn/go-sqlite3, which gorm.io/driver/sqlite imports and webhooker never opens: every SQLite file is opened with modernc.org/sqlite and the connection handed to gorm. Without cgo, mattn's package compiles to a stub nothing calls. The Dockerfile builds the binary once. The static relink and its netgo, osusergo and sqlite_omit_load_extension tags are gone, and with them the Makefile's GO_LDFLAGS and GO_TAGS, which only the relink used. The test phase keeps cgo for -race. No README or Dockerfile sentence says the binary needs cgo any more. Model: opus-5-5
This commit was merged in pull request #550.
This commit is contained in:
@@ -1393,10 +1393,10 @@ It uses:
|
||||
management
|
||||
- **[go-chi](https://github.com/go-chi/chi)** for HTTP routing
|
||||
- **[GORM](https://gorm.io)** for database access with
|
||||
**[modernc.org/sqlite](https://pkg.go.dev/modernc.org/sqlite)** as the runtime
|
||||
SQLite driver. Note: `gorm.io/driver/sqlite` transitively depends on
|
||||
`mattn/go-sqlite3`, which requires CGO at build time (see [Docker](#docker)
|
||||
section)
|
||||
**[modernc.org/sqlite](https://pkg.go.dev/modernc.org/sqlite)**, which is pure
|
||||
Go, as the SQLite driver. `gorm.io/driver/sqlite` also imports
|
||||
`mattn/go-sqlite3`, whose stub for builds without cgo is linked into the
|
||||
binary but never used
|
||||
- **[slog](https://pkg.go.dev/log/slog)** (stdlib) for structured logging with
|
||||
TTY detection (text for dev, JSON for prod)
|
||||
- **[gorilla/sessions](https://github.com/gorilla/sessions)** for encrypted
|
||||
@@ -2135,9 +2135,7 @@ endpoint. That is the JSON key; the error text for a missing one reads
|
||||
`webhook_url is required`, which is the message, not the key.
|
||||
|
||||
The database uses the
|
||||
[modernc.org/sqlite](https://pkg.go.dev/modernc.org/sqlite) driver at runtime,
|
||||
though CGO is required at build time due to the transitive `mattn/go-sqlite3`
|
||||
dependency from `gorm.io/driver/sqlite`.
|
||||
[modernc.org/sqlite](https://pkg.go.dev/modernc.org/sqlite) driver.
|
||||
|
||||
#### Schema
|
||||
|
||||
@@ -3468,16 +3466,12 @@ fixed independently of the compiler's:
|
||||
a step's log, and then fails. `make test` builds this stage alone.
|
||||
6. **Builder stage** (`golang:1.26.1-bookworm`) — depends on the lint and test
|
||||
phases and the `css-check` and `markdown-check` stages passing (it copies a
|
||||
file from each), runs `make build` (which extracts Alpine.js from `3p/`
|
||||
first), and then rebuilds the binary with `CGO_ENABLED=1` and static linking
|
||||
so it runs on musl, with the build tags `netgo`, `osusergo` and
|
||||
`sqlite_omit_load_extension` so it needs none of glibc's shared libraries at
|
||||
run time. Both builds go through `make build`, the relink adding its
|
||||
`-extldflags` via `GO_LDFLAGS` and its tags via `GO_TAGS`, so neither can
|
||||
drop the `-X` that stamps the version. The version is the `VERSION` build arg
|
||||
if one is given, otherwise derived from the `.git` in the context, and the
|
||||
stage fails if a context with `.git` would stamp an empty version, `dev` or
|
||||
`unknown` (see [Version stamping](#version-stamping)).
|
||||
file from each), and runs `make build` (which extracts Alpine.js from `3p/`
|
||||
first). `make build` compiles with cgo off, so the binary is statically
|
||||
linked and runs on the Alpine runtime image. The version is the `VERSION`
|
||||
build arg if one is given, otherwise derived from the `.git` in the context,
|
||||
and the stage fails if a context with `.git` would stamp an empty version,
|
||||
`dev` or `unknown` (see [Version stamping](#version-stamping)).
|
||||
7. **Runtime stage** (`alpine:3.21`) — copies the static binary and
|
||||
`deploy/docker-entrypoint.sh`, creates the `/var/lib/webhooker` directory for
|
||||
all SQLite databases, exposes port 8080, and includes a health check against
|
||||
@@ -3489,11 +3483,6 @@ The lint and test phases invoke `gofmt`, `golangci-lint` and `go test` directly
|
||||
rather than `make fmt-check`, `make lint` and `make test`: those targets build
|
||||
docker stages, which would need a docker daemon inside this build.
|
||||
|
||||
The lint phase and the Go stages use Debian rather than Alpine because
|
||||
`gorm.io/driver/sqlite` pulls in `mattn/go-sqlite3`, which needs CGO and does
|
||||
not compile against musl. Only the final binary is statically linked, which is
|
||||
what lets it run on the Alpine runtime image.
|
||||
|
||||
`script/cibuild` is the CI gate: it runs `script/bootstrap`, then
|
||||
`script/check`, then builds the image, whose build runs the lint and test phases
|
||||
and the stylesheet and Markdown checks again. A build that succeeds is a repo
|
||||
|
||||
Reference in New Issue
Block a user