Commit Graph

43 Commits

Author SHA1 Message Date
shcizo db84a2f6ba fix(api): plumb request tag into discovery so swarm mode deploys the requested version
req.Tag was only echoed in the HTTP response, never used to match jobs.
Compose mode didn't care (ComposeExecutor re-pulls the compose file's own
pinned tag), but SwarmExecutor sets the service image directly from
Job.Image, which was built from the untagged req.Image alone -- so a
Swarm deploy silently rewrote the service to :latest instead of the
requested tag. Build the full image:tag reference once in the handler
and pass it into FindJobs; NormaliseImage/ImagesMatch already strip
tags before matching, so this doesn't change which jobs match in either
mode.
2026-07-04 20:41:59 +02:00
shcizo 9881812eca docs: document MODE=swarm support and its opt-in label / manager-node requirements 2026-07-04 20:32:22 +02:00
shcizo ac3912367f merge: bring in CLAUDE.md and CI workflow from main 2026-07-04 20:31:25 +02:00
shcizo 9a3a200873 feat: wire MODE config to select compose or swarm discovery/executor 2026-07-04 20:28:28 +02:00
shcizo f92f8ac6b1 feat(api): surface ServiceID in update results for swarm jobs 2026-07-04 20:22:30 +02:00
shcizo 34865c9fd0 feat(updater): add SwarmExecutor to run docker service update via the Docker API
Adds the Swarm-mode counterpart to ComposeExecutor: updates a Swarm
service's image directly through the Docker SDK (ServiceInspectWithRaw +
ServiceUpdate with QueryRegistry=true so floating tags resolve to a fresh
digest), gated by the same Refused guard used in Compose mode. Satisfies
the existing Executor interface unchanged, so Queue needs no changes.
2026-07-04 20:19:00 +02:00
shcizo a8524e5ff4 feat(discovery): add SwarmDiscovery to find opted-in Swarm services by image
Verified the Docker SDK v28.5.2+incompatible ServiceList signature via go doc
before implementing: the options type is swarm.ServiceListOptions, not
types.ServiceListOptions as the brief assumed. Everything else (Service.ID,
Service.Spec via embedded Annotations for Name/Labels, TaskTemplate.ContainerSpec.Image)
matched the brief exactly.

Reuses discovery.ImagesMatch and discovery.HasOptIn rather than duplicating
matching/opt-in logic. Opt-in label is read from the service spec's own
labels since Swarm services have no local compose file to anchor a
STACKS_ROOT path check against (unlike Compose mode).
2026-07-04 20:12:44 +02:00
shcizo 9cf484e164 feat(discovery): add Image and ServiceID fields to Job for swarm support 2026-07-04 20:09:39 +02:00
shcizo 1002bb7b96 feat(config): add MODE env var to select compose or swarm operation 2026-07-04 20:06:50 +02:00
shcizo 8f999c69bd docs: add docker swarm support implementation plan 2026-07-04 20:05:02 +02:00
shcizo df54bbaacf docs: add CLAUDE.md with project context for Claude Code
Captures design intent, gotchas, and references that aren't obvious
from code alone — single-worker queue rationale, defense-in-depth
security model, the not-yet-wired selfupdate package, and pointers
to the design spec and implementation plan in docs/superpowers/.
2026-05-22 14:27:28 +02:00
shcizo 476945722b Merge pull request 'ci: docker build + push workflow on v* tags' (#2) from feat/ci-docker-build into main
Docker Build / docker (push) Successful in 51s
v0.1.0
2026-05-22 14:09:02 +02:00
shcizo 2494e71969 ci: docker build + push on v* tags 2026-05-22 14:02:45 +02:00
shcizo 46ef00c742 Merge pull request 'Initial implementation: package-updater v1' (#1) from feat/initial-implementation into main 2026-05-22 13:59:37 +02:00
shcizo e43868bf41 build: bump Dockerfile to golang:1.26-alpine to match go.mod 2026-05-22 13:56:23 +02:00
shcizo 9a8b171198 feat: docker-compose.local.yml for local build/smoke-test 2026-05-22 13:53:49 +02:00
shcizo 3abd1bf9af feat(metrics): wire instrumentation through queue, handlers, middleware 2026-05-22 13:17:09 +02:00
shcizo ef9c0f1313 chore: gitignore stray ./server binary from go build 2026-05-22 13:05:43 +02:00
shcizo b866f6d47c feat(cmd): wire config, discovery, queue, http server, metrics 2026-05-22 13:04:44 +02:00
shcizo 952189eb09 feat(metrics): Prometheus collectors and /metrics handler 2026-05-22 12:59:53 +02:00
shcizo 2be2fdf325 docs: real README with quick start, endpoints, observability 2026-05-22 12:09:37 +02:00
shcizo 33a8b8689f feat(action): reusable Gitea composite action for /update 2026-05-22 12:08:12 +02:00
shcizo 804b69b67c docs: docker-compose.example.yml for end-user deploy 2026-05-22 12:07:47 +02:00
shcizo 00bada890b build: multi-stage Dockerfile with build info ldflags 2026-05-22 12:07:36 +02:00
shcizo e88f105490 feat(selfupdate): defer self-replacement until response flushed 2026-05-22 12:06:07 +02:00
shcizo 857f504d36 feat(api): /update, /healthz, /version handlers 2026-05-22 12:03:56 +02:00
shcizo df2dc30cea feat(api): auth, request_id, and request-logging middleware 2026-05-22 11:59:34 +02:00
shcizo c9b1af42e5 feat(updater): FIFO queue with single worker and per-job results 2026-05-22 11:57:09 +02:00
shcizo a275f208c4 feat(updater): ComposeExecutor shells out to docker compose 2026-05-22 11:54:03 +02:00
shcizo 058b9d8c07 feat(updater): Executor interface 2026-05-22 11:53:42 +02:00
shcizo db784ad303 feat(discovery): orchestrate match, opt-in filter, dedup, path-check 2026-05-22 11:51:07 +02:00
shcizo 897093ed1c feat(discovery): STACKS_ROOT path safety check 2026-05-22 11:45:56 +02:00
shcizo 13ccb79ef5 feat(discovery): parse Compose-managed labels 2026-05-22 11:44:10 +02:00
shcizo cff6c1baff feat(discovery): tag-agnostic image name normalisation 2026-05-22 11:41:33 +02:00
shcizo e665b6cd7e feat(logging): structured JSON logger with request_id context 2026-05-22 11:38:07 +02:00
shcizo 883f3cfecf chore: tidy go.sum for testify transitive deps 2026-05-22 11:35:33 +02:00
shcizo 9832b2b190 docs: complete se.enocsson to se.shcizo rename in spec 2026-05-22 11:35:33 +02:00
shcizo 4f2a19c663 chore: gitignore Serena MCP workspace 2026-05-22 11:35:33 +02:00
shcizo 2b7f7d863a feat(config): load and validate env-var config 2026-05-22 11:24:29 +02:00
shcizo 1ca9f5296a chore: scaffold Go project layout 2026-05-22 11:16:23 +02:00
shcizo ef14465314 docs: remove dead strconv import from main.go in plan 2026-05-22 11:13:40 +02:00
shcizo 3e600aeb88 docs: add package-updater implementation plan
19-task TDD plan covering project scaffolding, config, structured
logging, discovery (image matching, Compose label parsing, path safety,
orchestration), executor abstraction, FIFO queue + single worker, HTTP
middleware (auth, request_id, request logging), handlers (/update,
/healthz, /version), Prometheus metrics, self-update deferred
execution, wire-up in main, Dockerfile, example compose, Gitea
composite action, and README.
2026-05-22 11:10:51 +02:00
shcizo 96d94efd6a docs: add package-updater design spec
Initial design spec for package-updater service:
- Go HTTP service triggered by Gitea Actions webhook
- Discovers Compose-managed containers via Docker labels
- Two-gate security: bearer token + opt-in label
- Stateless, single-worker, no rollback in v1
- Loki structured logs + Prometheus metrics
- Reusable composite Gitea action

Decisions reached via brainstorming session 2026-05-22.
2026-05-22 10:57:52 +02:00