This directory contains GitHub Actions workflows for building and publishing fmcd Docker images to Docker Hub.
- Purpose: Create release PRs and cut version tags after the release PR is merged
- Triggers:
- Push to
main - Manual workflow dispatch
- Push to
- Features:
- Opens or updates a release PR with version and changelog changes
- Creates
v*tags only after the release PR is merged - Uses git-only releases, so no crates.io publish is attempted
- Drives the tagged binary and multi-arch Docker release workflows
- Purpose: Build and publish single-architecture (amd64) images for development and testing
- Triggers:
- Push to main/master branches
- Pull requests (build only, no push)
- Manual workflow dispatch
- Note: Explicitly ignores version tags (v*)
- Features:
- Uses Nix to build OCI containers
- Automatic
main/branch and commit-SHA tagging for development images - Dry run for pull requests
- Fast builds for rapid development feedback
- Purpose: Build and publish production multi-architecture images (amd64 and arm64)
- Triggers:
- ONLY version tags (v*) - no other triggers
- Features:
- Cross-compilation using Nix with QEMU
- Multi-arch manifest creation
- Support for both x86_64 and aarch64
- Creates semantic version tags (latest, 1.2.3, 1.2, 1)
Before these workflows can run successfully, you need to configure the following secrets in your GitHub repository:
- DOCKER_HUB_USERNAME: Your Docker Hub username
- DOCKER_HUB_TOKEN: Docker Hub access token (not password)
- RELEASE_PLZ_TOKEN: GitHub PAT with
contentsandpull requestswrite access
The RELEASE_PLZ_TOKEN secret is required because tags created with the default GITHUB_TOKEN do not trigger the downstream push tag workflows that publish release binaries and Docker images.
You also need to enable GitHub Actions workflow permissions to create pull requests:
- Go to Settings → Actions → General
- Under "Workflow permissions", enable write access
- Enable "Allow GitHub Actions to create and approve pull requests"
- Log in to Docker Hub
- Go to Account Settings → Security
- Click "New Access Token"
- Give it a descriptive name (e.g., "GitHub Actions - fmcd")
- Copy the token and save it as a GitHub secret
- Go to your repository on GitHub
- Navigate to Settings → Secrets and variables → Actions
- Click "New repository secret"
- Add both secrets:
- Name:
DOCKER_HUB_USERNAME, Value: your Docker Hub username - Name:
DOCKER_HUB_TOKEN, Value: your Docker Hub access token
- Name:
main- Latest development image from the default branchmain-<sha>- Branch with commit SHApr-123- Pull request builds (not pushed)
latest- Latest stable release (from version tags)v1.2.3- Specific version tags1.2- Major.minor version1- Major version only
To build the OCI container locally using Nix:
# Build the OCI container
nix build .#oci
# Load into Docker
docker load < result
# Run the container
docker run --rm fmcd:latest- Merge feature and fix PRs into
main. release-plz.ymlopens or updates a release PR with the next version and changelog.- Merge the release PR when you want to cut a release.
release-plz.ymlcreates thevX.Y.Ztag.- The tag triggers:
release.ymlto build binaries and create the GitHub release.docker-multiarch.ymlto publish stable multi-arch Docker tags.
With this policy, latest always points to the latest stable tagged release, not the tip of main.
The multi-arch workflow builds for:
linux/amd64(x86_64)linux/arm64(aarch64)
These are combined into a single manifest, allowing Docker to automatically pull the correct image for the host architecture.