Simple guides introducing Fabrica with hands-on examples.
This document describes how to create a new release of Fabrica.
Ensure all changes for the release are merged to main:
git checkout main
git pull origin main
Create and push a semantic version tag:
# Format: v<major>.<minor>.<patch>
git tag -a v1.0.0 -m "Release v1.0.0"
git push origin v1.0.0
When you push a tag matching v*.*.*, GitHub Actions automatically:
ghcr.io/openchami/fabrica:vX.Y.Zghcr.io/openchami/fabrica:latestCheck the GitHub Actions workflow:
gh run list --workflow=release.yaml
gh run view <run-id>
Or visit: https://github.com/openchami/fabrica/actions
Download and test a binary:
# Linux AMD64
wget https://github.com/openchami/fabrica/releases/download/v1.0.0/fabrica_1.0.0_linux_x86_64.tar.gz
tar xzf fabrica_1.0.0_linux_x86_64.tar.gz
./fabrica version
# macOS ARM64
wget https://github.com/openchami/fabrica/releases/download/v1.0.0/fabrica_1.0.0_darwin_arm64.tar.gz
tar xzf fabrica_1.0.0_darwin_arm64.tar.gz
./fabrica version
# Pull and test
docker pull ghcr.io/openchami/fabrica:v1.0.0
docker run --rm ghcr.io/openchami/fabrica:v1.0.0 version
# Test multi-arch (should work on both AMD64 and ARM64)
docker pull ghcr.io/openchami/fabrica:latest
docker run --rm ghcr.io/openchami/fabrica:latest --help
The release process is configured in:
.goreleaser.yaml - GoReleaser configuration
.github/workflows/release.yaml - GitHub Actions workflow
Dockerfile - Multi-stage Docker build
| Platform | Architecture | Binary |
|---|---|---|
| Linux | AMD64 | fabrica_*_linux_x86_64.tar.gz |
| Linux | ARM64 | fabrica_*_linux_arm64.tar.gz |
| macOS | ARM64 | fabrica_*_darwin_arm64.tar.gz |
| Platform | Image |
|---|---|
| Linux AMD64 | ghcr.io/openchami/fabrica:*-amd64 |
| Linux ARM64 | ghcr.io/openchami/fabrica:*-arm64 |
| Multi-arch | ghcr.io/openchami/fabrica:* |
Fabrica follows Semantic Versioning:
If the GitHub Actions workflow fails:
git tag -d v1.0.0 && git push origin :refs/tags/v1.0.0Ensure the GITHUB_TOKEN has package write permissions:
Check the GoReleaser configuration:
# Test locally (creates snapshot, doesn't publish)
goreleaser release --snapshot --clean
To create a release manually without pushing a tag:
# Install GoReleaser
brew install goreleaser/tap/goreleaser
# Create snapshot (doesn't publish)
goreleaser release --snapshot --clean
# Publish release (requires GITHUB_TOKEN)
export GITHUB_TOKEN=your_token
goreleaser release --clean
After a successful release:
Before tagging a release, ensure the following readiness criteria are met:
go test -v -timeout 10m ./test/integrationfabrica generate with current CLI version (v0.4.0)Before publishing the GitHub release, manually verify release artifacts:
fabrica --version
fabrica init test-project
cd test-project && fabrica add resource Device && fabrica generate
Download macOS ARM64 binary and verify the same steps
cd test-project && go run ./cmd/server serve --port 8080 &
curl http://localhost:8080/health
docker pull ghcr.io/openchami/fabrica:v${VERSION}
docker run --rm ghcr.io/openchami/fabrica:v${VERSION} --version
# Test project generation in container
docker run --rm -v $(pwd):/work -w /work ghcr.io/openchami/fabrica:v${VERSION} \
init test-docker && cd test-docker && \
/app/fabrica add resource Service && \
/app/fabrica generate
docker manifest inspect ghcr.io/openchami/fabrica:v${VERSION}
Concurrent operations: Verify ETag conflict handling with simultaneous PATCH requests
--auth, --events, --reconcile compile and runExample READMEs are current (no stale CLI commands)