ci: publish official aiofmp MCP server image to GHCR + tidy repo boundaries - #12
Merged
Conversation
…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
force-pushed
the
feat/aiofmp-mcp-ghcr-image
branch
from
August 5, 2026 21:01
f1b825e to
28a7006
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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
Dockerfile,docker-compose.yaml,.dockerignorewere untracked; they're now part of the repo.
Dockerfile— adds OCI labels (org.opencontainers.image.source,description,licenses,version) so the GHCR package links back to this repo; aVERSIONbuild-arg (CI stamps the release version, local builds default to
dev); and a TCPHEALTHCHECKon the MCP port (FastMCP 406s a plain GET, so a socket connect is the right liveness signal).
Release workflow (
.github/workflows/docker-publish.yml)ghcr.io/<owner>/aiofmp-mcp-server, tagged{version, latest}, with GHA layer caching +provenance/SBOM attestations.
workflow_runafter the Release workflow completes onmain.semantic-release creates the
vX.Y.Ztag usingGITHUB_TOKEN, and GitHub does not re-firepush: tagsworkflows 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(optionalversioninput, e.g. to backfill) and on directv*tag pushes.GITHUB_TOKEN+packages: write— no PAT required.Repo boundaries
deploy/trail-mcp-full.yamlanddeploy/Dockerfile.trail-mcpwere committed here but belong with the trail project. They'reuntracked (
git rm --cached) anddeploy/is gitignored. The files remain on disk for the livek3s deployment; they'll be relocated to the trail workspace separately.
Operational notes
settings once. The
image.sourcelabel auto-links it to this repo.workflow_runtrigger also fires on non-version-bumpingmainpushes (any successful Releaserun), 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 imagepublishes on the next Release run (or immediately via
workflow_dispatch).🤖 Generated with Claude Code