[CI drift] lesson-video-processor is deployed but has NO build workflow → orphaned image #418

Closed
opened 2026-07-05 20:25:38 +00:00 by spikerj · 1 comment
Owner

Verified finding (inverse-sweep after the metrics deploy gap, infra PR #11)

SpikerSoft.EventHandlers.LessonVideoProcessor ships a production image that nothing rebuilds:

  • Infra stack spikersoft-lesson-video-processor/docker-stack.yml deploys git.spikersoft.com/spikerj/spikersoft-lesson-video-processor:latest.
  • No .gitea/workflows/*.yml in spikersoft-backend builds or pushes that image — an exact-string search of every workflow's content for spikersoft-lesson-video-processor returned zero hits (contrast: 26 other service Dockerfiles are each wired to a build workflow).
  • The project is a real deployable worker (SpikerSoft.EventHandlers.LessonVideoProcessor/Program.cs + Dockerfile).

Consequence

Any code change to the lesson-video processor never reaches production — the running :latest is whatever was last pushed manually, and silently goes stale. This is the mirror image of the Art Studio Metrics gap (which had a workflow but no stack — fixed in infra PR #11); here there's a stack + service but no workflow.

Fix (needs a human — I'm blocked from authoring it)

Add a build → push → deploy workflow modeled on a sibling event-handler (e.g. spikersoft-keycloak-events.yml or the new spikersoft-artstudio-metrics.yml):

  • docker build -f ./SpikerSoft.EventHandlers.LessonVideoProcessor/Dockerfile -t git.spikersoft.com/spikerj/spikersoft-lesson-video-processor:latest .
  • push, multi-arch manifest if needed, then cd /mnt/infrastructure/spikersoft-lesson-video-processor && docker stack deploy -c docker-stack.yml spikersoft-lesson-video-processor.

Note: Claude Code's auto-mode blocks committing CI-workflow files (.gitea/workflows/), so I filed this rather than opening the PR — a maintainer needs to add the workflow.


Secondary observations from the same sweep (lower confidence — verify, not confirmed defects)

  • SpikerSoft.EventHandlers.Decompile — has Program.cs + Dockerfile but no workflow and no infra stack. The Decompile feature is live in the API (SpikerSoft.Api/Domain/Decompile/DecompileController.cs), so this worker is either (a) intentionally inline-handled by the API and the worker is WIP/unused, or (b) a partially-wired worker that was never built/deployed. Worth confirming which.
  • SpikerSoft.AI.MCPServer — has a Dockerfile but no workflow/stack. Likely intentional (MCP servers are run locally by a client, not swarm-deployed) — noting for completeness, not flagging as a gap.

Severity: Medium (silent production staleness on a live service). Related: infra PR #11, #403.

## Verified finding (inverse-sweep after the metrics deploy gap, infra PR #11) `SpikerSoft.EventHandlers.LessonVideoProcessor` ships a production image that **nothing rebuilds**: - Infra stack `spikersoft-lesson-video-processor/docker-stack.yml` deploys `git.spikersoft.com/spikerj/spikersoft-lesson-video-processor:latest`. - **No `.gitea/workflows/*.yml` in spikersoft-backend builds or pushes that image** — an exact-string search of every workflow's content for `spikersoft-lesson-video-processor` returned **zero** hits (contrast: 26 other service Dockerfiles are each wired to a build workflow). - The project is a real deployable worker (`SpikerSoft.EventHandlers.LessonVideoProcessor/Program.cs` + `Dockerfile`). ### Consequence Any code change to the lesson-video processor **never reaches production** — the running `:latest` is whatever was last pushed manually, and silently goes stale. This is the mirror image of the Art Studio Metrics gap (which had a workflow but no stack — fixed in infra PR #11); here there's a stack + service but no workflow. ### Fix (needs a human — I'm blocked from authoring it) Add a build → push → deploy workflow modeled on a sibling event-handler (e.g. `spikersoft-keycloak-events.yml` or the new `spikersoft-artstudio-metrics.yml`): - `docker build -f ./SpikerSoft.EventHandlers.LessonVideoProcessor/Dockerfile -t git.spikersoft.com/spikerj/spikersoft-lesson-video-processor:latest .` - push, multi-arch manifest if needed, then `cd /mnt/infrastructure/spikersoft-lesson-video-processor && docker stack deploy -c docker-stack.yml spikersoft-lesson-video-processor`. **Note:** Claude Code's auto-mode blocks committing CI-workflow files (`.gitea/workflows/`), so I filed this rather than opening the PR — a maintainer needs to add the workflow. --- ### Secondary observations from the same sweep (lower confidence — verify, not confirmed defects) - **`SpikerSoft.EventHandlers.Decompile`** — has `Program.cs` + `Dockerfile` but **no workflow and no infra stack**. The Decompile *feature* is live in the API (`SpikerSoft.Api/Domain/Decompile/DecompileController.cs`), so this worker is either (a) intentionally inline-handled by the API and the worker is WIP/unused, or (b) a partially-wired worker that was never built/deployed. Worth confirming which. - **`SpikerSoft.AI.MCPServer`** — has a `Dockerfile` but no workflow/stack. **Likely intentional** (MCP servers are run locally by a client, not swarm-deployed) — noting for completeness, not flagging as a gap. **Severity:** Medium (silent production staleness on a live service). **Related:** infra PR #11, #403.
Author
Owner

Resolved in spikersoft-backend PR #208 (merged to master): added .gitea/workflows/spikersoft-lesson-video-processor.yml — the standard multi-arch build → manifest → SSH stack-deploy → Discord pipeline, modeled 1:1 on spikersoft-keycloak-events.yml, path filters matching the project's ProjectReference graph. The image is no longer orphaned. One follow-up op: trigger Actions → Lesson Video Processor → Run workflow once to rebuild the currently-stale prod :latest (the merge itself touched no filtered path). Closing.

Resolved in spikersoft-backend PR #208 (merged to master): added .gitea/workflows/spikersoft-lesson-video-processor.yml — the standard multi-arch build → manifest → SSH stack-deploy → Discord pipeline, modeled 1:1 on spikersoft-keycloak-events.yml, path filters matching the project's ProjectReference graph. The image is no longer orphaned. One follow-up op: trigger Actions → Lesson Video Processor → Run workflow once to rebuild the currently-stale prod :latest (the merge itself touched no filtered path). Closing.
Sign in to join this conversation.