TazLab K8s: Image Automation Detail

Level 3 (Detail) — All image automation pipelines with exact tag patterns and commit strategy.

Concept

Flux image automation watches container registries (Docker Hub / GHCR) for new tags matching a pattern, then automatically commits the updated image reference back to the tazlab-k8s repository. This closes the loop between CI/CD build and GitOps reconciliation.

Architecture

GitHub Action (push) → Docker Hub (tag) → Flux ImageRepository (poll 1m) → ImagePolicy (select latest) → ImageUpdateAutomation (commit to git) → Flux reconcile (deploy)

Each pipeline is defined in infrastructure/automation/<app>/automation.yaml as three Flux CRDs:

  1. ImageRepository: polls the registry every 1 minute
  2. ImagePolicy: selects the latest tag (numerical asc or semver — see pipeline inventory)
  3. ImageUpdateAutomation: commits the updated image reference to master

Pipeline Inventory

1. hugo-blog

ResourceNameDetails
ImageRepositoryhugo-blogtazzo/tazlab-blog, poll 1m
ImagePolicyhugo-blogTag: ^blog-(?P<value>[0-9]+)-.*$, numerical asc
ImageUpdateAutomationhugo-blogCommit: chore: self-update hugo-blog image [skip ci]
Update path./apps/base/hugo-blog
Update strategySetters

Upstream: blog-src repository → GitHub Action publish.yml → Docker Hub tazzo/tazlab-blog.

2. hugo-wiki

ResourceNameDetails
ImageRepositoryhugo-wikitazzo/tazlab-wiki, poll 1m
ImagePolicyhugo-wikiTag: ^wiki-(?P<value>[0-9]+)-.*$, numerical asc
ImageUpdateAutomationhugo-wikiCommit: chore: self-update hugo-wiki image [skip ci]
Update path./apps/base/hugo-wiki
Update strategySetters

Upstream: wiki.tazlab.net repository → GitHub Action publish.yml → Docker Hub tazzo/tazlab-wiki.

3. mnemosyne-mcp

ResourceNameDetails
ImageRepositorymnemosyne-mcptazzo/mnemosyne-mcp, poll 1m
ImagePolicymnemosyne-mcpTag: ^mcp-(?P<value>[0-9]+)-.*$, numerical asc
ImageUpdateAutomationmnemosyne-mcpCommit: chore: self-update mnemosyne-mcp image [skip ci]
Update path./apps/base/mnemosyne-mcp
Update strategySetters

Upstream: mnemosyne-mcp-server repository → GitHub Action publish.yml → Docker Hub tazzo/mnemosyne-mcp.

4. homepage

ResourceNameDetails
ImageRepositoryhomepageghcr.io/gethomepage/homepage, poll 1m
ImagePolicyhomepageSemver range >=2.1.2 (pinned floor after the 2026-08 outage)
ImageUpdateAutomationhomepageCommit: chore: self-update homepage image [skip ci]
Update path./infrastructure/instances/homepage
Update strategySetters

Upstream: upstream gethomepage/homepage releases (public GHCR image — no GitHub Action needed). The automation already bumped the live image from the manual pin v2.1.2 to v2.2.0 (infrastructure/instances/homepage/homepage.yaml:146).

Note the model variance: this pipeline is the only one using GHCR + semver; the other six use Docker Hub + numerical run numbers.

Homepage context: see Homepage Dashboard — the 2026-08 outage that motivated this pipeline.

5. teaching

ResourceNameDetails
ImageRepositoryteachingtazzo/tazlab-teaching, poll 1m
ImagePolicyteachingTag ^teaching-(?P<value>[0-9]+)-.*$, numerical asc
ImageUpdateAutomationteachingCommit chore: self-update teaching image [skip ci]
Update path./apps/base/teaching
Update strategySetters

6. ambrogio-site

ResourceNameDetails
ImageRepositoryambrogio-sitetazzo/tazlab-ambrogio-site, poll 1m
ImagePolicyambrogio-siteTag ^ambrogio-site-(?P<value>[0-9]+)-.*$, numerical asc
ImageUpdateAutomationambrogio-siteCommit chore: self-update ambrogio-site image [skip ci]
Update path./apps/base/ambrogio-site
Update strategySetters

7. halloween

ResourceNameDetails
ImageRepositoryhalloweentazzo/tazlab-halloween, poll 1m, public
ImagePolicyhalloweenTag ^halloween-(?P<value>[0-9]+)-.*$, numerical asc, extract: $value
ImageUpdateAutomationhalloweenCommit chore: self-update halloween image [skip ci]
Update path./apps/base/halloween
Update strategySetters

Upstream: halloween.tazlab.net → GitHub Action → Docker Hub tazzo/tazlab-halloween. The first deployment and the scanner/audio fix were delivered automatically: halloween-1-eec65ff… → halloween-2-c91765e…; the pod rolled with Recreate and an emptyDir reset (no PVC).

Tag Pattern Reference

AppPatternExtracted valueExample tag
hugo-blog^blog-(?P<value>[0-9]+)-.*$run_numberblog-45-a1b2c3d
hugo-wiki^wiki-(?P<value>[0-9]+)-.*$run_numberwiki-12-e4f5g6h
mnemosyne-mcp^mcp-(?P<value>[0-9]+)-.*$run_numbermcp-42-7ba6c96d
teaching^teaching-(?P<value>[0-9]+)-.*$run_numberteaching-28-3897107a
ambrogio-site^ambrogio-site-(?P<value>[0-9]+)-.*$run_numberambrogio-site-15-73a64e10
halloween^halloween-(?P<value>[0-9]+)-.*$run_numberhalloween-2-c91765e1
homepagesemver >=2.1.2semver releasev2.2.0

Homepage uses Flux semver ordering (policy.semver.range: '>=2.1.2'); the other six use numerical: order: asc — Flux selects the tag with the highest run number.

Markers in Deployment

Each Deployment manifest has an image line like:

image: tazzo/tazlab-blog:blog-45-a1b2c3d # {"$imagepolicy": "flux-system:hugo-blog"}

The comment after the # is the Flux setter marker. It tells ImageUpdateAutomation which exact line to update. The format is:

# {"$imagepolicy": "<namespace>:<policy-name>"}

Commit Behavior

  • Bot: fluxcdbot@tazlab.net
  • Branch: master (direct push)
  • Message: chore: self-update <app> image [skip ci]
  • Strategy: Setters (regex replacement of the image tag after the marker comment)

See Also