This repository ships releases via a single "Release Orchestrator" GitHub Actions workflow. It treats the root VERSION file as the single source of truth, auto-updates related files, builds the MCP bundle (mcp-zenml.mcpb), creates a tag and GitHub Release, and triggers downstream publishers, including publishing to the official Anthropic MCP Registry.
- Prerequisites
- A GitHub PAT stored as repository secret
GH_RELEASE_PATwith permissions to:- push to
main - create tags and releases
- trigger other workflows (use as the checkout token)
- push to
- A GitHub PAT stored as repository secret
- Run the orchestrator
- Go to GitHub → Actions → "Release Orchestrator"
- Click "Run workflow"
- Inputs (all optional unless noted):
version(string): If provided, sets the exact version (SemVer). If omitted, the workflow reads from theVERSIONfile.prerelease(boolean): Mark the GitHub Release as a prerelease. Default: false.dry_run(boolean): Perform all steps except committing/pushing and tagging. Default: false.
- Click "Run workflow"
Note: This workflow runs only when manually triggered via 'Run workflow'.
- Single source of truth:
VERSION- If
versioninput is provided, the workflow setsVERSIONto that value (with validation). - Otherwise, it reads the version from the
VERSIONfile.
- If
- Version propagation
- Runs
python scripts/bump_version.py [--version X.Y.Z]to validate SemVer and update:manifest.json.versionserver.json.versionserver.json.packages[0].version
- Runs
- Manifest regeneration
- Runs
python scripts/generate_manifest_fields.pyto analyzeserver/zenml_server.pyand regenerate thetoolsandpromptsarrays inmanifest.json.
- Runs
- Bundle build
- Runs
bash scripts/build_mcpb.shto install dependencies deterministically and pack the MCP bundle:- Produces
mcp-zenml.mcpbat the repo root.
- Produces
- Runs
- Commit, push, and tag (skipped if
dry_run: true)- Commits
VERSION,manifest.json,server.json, andmcp-zenml.mcpbwith message:chore(release): vX.Y.Z
- Pushes to
main. - Creates an annotated tag
vX.Y.Zand pushes it.
- Commits
- GitHub Release
- Always runs
softprops/action-gh-release@v2to attachmcp-zenml.mcpb. - Uses the resolved version (input or
VERSION) fortag_nameandrelease_name. - Sets
prereleasefrom the input andgenerate_release_notes: true. - If the tag already exists, the step is tolerant and won't fail the workflow.
- Always runs
docker-publish.yml(on push to main)- Builds and pushes the latest development Docker image(s) for the server.
- Publishes
zenmldocker/mcp-zenml:latest(and any other branch-based tags configured).
release-docker.yml(on tagv*)- Builds and pushes versioned Docker images:
zenmldocker/mcp-zenml:vX.Y.Z
- Uploads/attaches
mcp-zenml.mcpbto the corresponding GitHub Release. - Publishes to the Anthropic MCP Registry using the
mcp-publisherCLI with GitHub OIDC (no static secrets). The registry entry is updated from the tagged commit'smanifest.jsonandserver.json.
- Builds and pushes versioned Docker images:
If something goes wrong:
- Orchestrator dry-run
- Re-run the orchestrator with
dry_run: trueto preview version propagation, manifest regeneration, and bundle build without pushing or tagging.
- Re-run the orchestrator with
- Re-run downstream workflows
- Manually dispatch
docker-publish.ymlonmainif images didn't publish. - Re-run
release-docker.ymlon thevX.Y.Ztag to rebuild images and reattach assets.
- Manually dispatch
- Build locally as a fallback
- From repo root:
bash scripts/build_mcpb.sh
- Then attach the bundle to the GitHub Release:
- Using GitHub UI or
ghCLI:gh release upload vX.Y.Z mcp-zenml.mcpb --clobber
- Using GitHub UI or
- From repo root:
- GitHub Release (per tag)
- Asset:
mcp-zenml.mcpb - Tag:
vX.Y.Z
- Asset:
- Docker Images
zenmldocker/mcp-zenml:latest(main)zenmldocker/mcp-zenml:vX.Y.Z(tag)
- Anthropic MCP Registry
- Registry entry updated on every tagged release (derived from
manifest.json/server.json)
- Registry entry updated on every tagged release (derived from
- Versioning: Strict SemVer is enforced by
scripts/bump_version.py. - Reproducibility:
scripts/build_mcpb.shinstalls dependencies intoserver/libfor deterministic packaging. - Security: Use
GH_RELEASE_PATfor the checkout token to ensure push/tag operations and triggering downstream workflows work correctly.