Stamp the tag or short commit in a plain docker build (closes #166)
check / check (push) Successful in 5m29s

.dockerignore now lets .git into the build context, without
.git/config, which can hold a remote URL with a credential. ARG VERSION
has no default: given none, the build stage takes the version from
git describe --tags --always, and fails if the context carries .git
and no version comes out. pixad now logs its name, version and
architecture as its first log line, through the existing
Logger.Identify, which nothing called.

Model: opus-5-5
This commit is contained in:
2026-10-02 02:41:23 +00:00
parent 3a2eb1f4d2
commit ba5102092f
4 changed files with 31 additions and 9 deletions
+2 -1
View File
@@ -1,4 +1,5 @@
.git # .git is sent so the build can stamp the version, without its config.
.git/config
.gitignore .gitignore
.DS_Store .DS_Store
.env* .env*
+18 -7
View File
@@ -43,13 +43,24 @@ COPY . .
RUN make test RUN make test
# VERSION is declared here, not earlier: a new value reruns only the # VERSION is declared here, not earlier: a new value reruns only the
# build, not script/bootstrap or the tests. CGO stays enabled for # build, not script/bootstrap or the tests. Given none, the version is
# govips; -trimpath keeps build paths out of the binary, and -s -w # `git describe --tags --always` of the .git in the build context (git
# leave out the symbol table and debug information. # comes from script/bootstrap): the tag on a tagged commit, tag-N-gHASH
ARG VERSION=dev # after one, the short commit when no tag is reachable. A context that
RUN CGO_ENABLED=1 GOTOOLCHAIN=auto go build -trimpath \ # carries .git and still yields no version fails the build; one without
-ldflags "-s -w -X main.Version=${VERSION}" \ # .git, as from a source tarball, stamps an empty version. CGO stays
-o /pixad ./cmd/pixad # enabled for govips; -trimpath keeps build paths out of the binary, and
# -s -w leave out the symbol table and debug information.
ARG VERSION
RUN version="${VERSION:-$(git describe --tags --always)}"; \
if [ -e .git ] && { [ -z "$version" ] || [ "$version" = dev ] || \
[ "$version" = unknown ]; }; then \
echo "the build context carries .git but yields no version" >&2; \
exit 1; \
fi; \
CGO_ENABLED=1 GOTOOLCHAIN=auto go build -trimpath \
-ldflags "-s -w -X main.Version=${version}" \
-o /pixad ./cmd/pixad
# Runtime stage # Runtime stage
# alpine:3.21, 2026-02-25 # alpine:3.21, 2026-02-25
+7
View File
@@ -29,6 +29,13 @@ P2: security: referer blacklist
# Completed Steps # Completed Steps
- 2026-10-02 a plain `docker build .` stamps the tag or short commit, not
`dev` (closes #166): `.dockerignore` lets `.git` into the build context,
without `.git/config`; with no `VERSION` build argument the `Dockerfile`
takes the version from `git describe --tags --always`, and fails the build if
the context carries `.git` and no version comes out; `ARG VERSION` has no
default; pixad logs its version, with its name and architecture, as its first
log line at startup.
- 2026-09-29 the container makes `/var/lib/pixa` usable by itself (closes - 2026-09-29 the container makes `/var/lib/pixa` usable by itself (closes
#159): `deploy/docker-entrypoint.sh` creates the directory if it is missing, #159): `deploy/docker-entrypoint.sh` creates the directory if it is missing,
gives the directory and everything in it to `pixad` when the directory or one gives the directory and everything in it to `pixad` when the directory or one
+4 -1
View File
@@ -56,6 +56,9 @@ func run(_ *cobra.Command, _ []string) {
middleware.New, middleware.New,
healthcheck.New, healthcheck.New,
), ),
fx.Invoke(func(*server.Server) {}), fx.Invoke(
func(log *logger.Logger) { log.Identify() },
func(*server.Server) {},
),
).Run() ).Run()
} }