Skip to content

ci: publish official aiofmp MCP server image to GHCR + tidy repo boundaries - #12

Merged
codemug merged 1 commit into
mainfrom
feat/aiofmp-mcp-ghcr-image
Aug 5, 2026
Merged

ci: publish official aiofmp MCP server image to GHCR + tidy repo boundaries#12
codemug merged 1 commit into
mainfrom
feat/aiofmp-mcp-ghcr-image

Conversation

@codemug

@codemug codemug commented Aug 5, 2026

Copy link
Copy Markdown
Owner

Publish an official aiofmp MCP server image to GHCR + tidy repo boundaries

Makes the aiofmp MCP server available as an official, versioned container image on the GitHub
Container Registry, and corrects a repo-hygiene issue where trail's deployment artifacts were tracked
here while aiofmp's own container files were not.

Container image

  • Track aiofmp's own container artifactsDockerfile, docker-compose.yaml, .dockerignore
    were untracked; they're now part of the repo.
  • Publish-ready Dockerfile — adds OCI labels (org.opencontainers.image.source,
    description, licenses, version) so the GHCR package links back to this repo; a VERSION
    build-arg (CI stamps the release version, local builds default to dev); and a TCP HEALTHCHECK
    on the MCP port (FastMCP 406s a plain GET, so a socket connect is the right liveness signal).
  • Verified: local multi-stage build succeeds, labels stamp correctly, entrypoint/healthcheck intact.

Release workflow (.github/workflows/docker-publish.yml)

  • Builds multi-arch (linux/amd64 + linux/arm64) via Buildx/QEMU and pushes to
    ghcr.io/<owner>/aiofmp-mcp-server, tagged {version, latest}, with GHA layer caching +
    provenance/SBOM attestations.
  • Trigger: primarily workflow_run after the Release workflow completes on main.
    semantic-release creates the vX.Y.Z tag using GITHUB_TOKEN, and GitHub does not re-fire
    push: tags workflows for token-pushed tags — so keying off the Release run is what makes
    "publish with every release" actually fire. Also runs on manual workflow_dispatch (optional
    version input, e.g. to backfill) and on direct v* tag pushes.
  • Auth is GITHUB_TOKEN + packages: write — no PAT required.

Repo boundaries

  • Stop tracking trail's deployment manifestsdeploy/trail-mcp-full.yaml and
    deploy/Dockerfile.trail-mcp were committed here but belong with the trail project. They're
    untracked (git rm --cached) and deploy/ is gitignored. The files remain on disk for the live
    k3s deployment; they'll be relocated to the trail workspace separately.

Operational notes

  • First push creates the GHCR package private under the owner; flip it to public in the package
    settings once. The image.source label auto-links it to this repo.
  • The workflow_run trigger also fires on non-version-bumping main pushes (any successful Release
    run), harmlessly republishing the current version and moving latest.

Commit type

ci: — no library change, so semantic-release won't cut a version from this alone. The image
publishes on the next Release run (or immediately via workflow_dispatch).

🤖 Generated with Claude Code

…eploy artifacts

- Track aiofmp's own container artifacts (Dockerfile, docker-compose.yaml,
  .dockerignore) — these were untracked while trail's were committed here.
- Make the Dockerfile publish-ready: OCI labels (source/description/licenses/
  version), a VERSION build-arg (CI stamps the release version), and a TCP
  HEALTHCHECK on the MCP port.
- docker-compose.yaml runs the published image by default
  (ghcr.io/codemug/aiofmp-mcp-server:${AIOFMP_IMAGE_TAG:-latest}), keeping
  build: for local changes; the cache bind-mount is portable
  (${AIOFMP_CACHE_DIR:-./.cache}) rather than a hardcoded host path.
- Add .github/workflows/docker-publish.yml: multi-arch (amd64+arm64) buildx
  push to ghcr.io/<owner>/aiofmp-mcp-server, tagged {version, latest}. Primary
  trigger is the Release workflow completing on main (semantic-release's
  GITHUB_TOKEN-pushed tags don't re-trigger 'push: tags'), plus manual
  workflow_dispatch and direct v* tag pushes.
- Stop tracking trail's k3s deploy manifests (deploy/trail-mcp-full.yaml,
  deploy/Dockerfile.trail-mcp); they belong with the trail project. Kept on
  disk for the live deployment; deploy/ is now gitignored.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@codemug
codemug force-pushed the feat/aiofmp-mcp-ghcr-image branch from f1b825e to 28a7006 Compare August 5, 2026 21:01
@codemug
codemug merged commit 1eb3b06 into main Aug 5, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant