cli/pkg/release/publishers/publisher.go
Snider d25a86feca feat(release): add LinuxKit and Docker publishers
LinuxKit publisher:
- Build images via linuxkit CLI (iso, qcow2, vmdk, raw)
- Multi-platform support (linux/amd64, linux/arm64)
- Upload artifacts to GitHub release

Docker publisher:
- Multi-arch builds via docker buildx
- Push to registry (default: ghcr.io)
- Tag templates with {{.Version}} expansion
- Build args support

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-28 18:42:04 +00:00

68 lines
2 KiB
Go

// Package publishers provides release publishing implementations.
package publishers
import (
"context"
"github.com/host-uk/core/pkg/build"
)
// Release represents a release to be published.
type Release struct {
// Version is the semantic version string (e.g., "v1.2.3").
Version string
// Artifacts are the built release artifacts.
Artifacts []build.Artifact
// Changelog is the generated markdown changelog.
Changelog string
// ProjectDir is the root directory of the project.
ProjectDir string
}
// PublisherConfig holds configuration for a publisher.
type PublisherConfig struct {
// Type is the publisher type (e.g., "github", "linuxkit", "docker").
Type string
// Prerelease marks the release as a prerelease.
Prerelease bool
// Draft creates the release as a draft.
Draft bool
// Extended holds publisher-specific configuration.
Extended any
}
// ReleaseConfig holds release configuration needed by publishers.
type ReleaseConfig interface {
GetRepository() string
GetProjectName() string
}
// Publisher defines the interface for release publishers.
type Publisher interface {
// Name returns the publisher's identifier.
Name() string
// Publish publishes the release to the target.
// If dryRun is true, it prints what would be done without executing.
Publish(ctx context.Context, release *Release, pubCfg PublisherConfig, relCfg ReleaseConfig, dryRun bool) error
}
// NewRelease creates a Release from the release package's Release type.
// This is a helper to convert between packages.
func NewRelease(version string, artifacts []build.Artifact, changelog, projectDir string) *Release {
return &Release{
Version: version,
Artifacts: artifacts,
Changelog: changelog,
ProjectDir: projectDir,
}
}
// NewPublisherConfig creates a PublisherConfig.
func NewPublisherConfig(pubType string, prerelease, draft bool, extended any) PublisherConfig {
return PublisherConfig{
Type: pubType,
Prerelease: prerelease,
Draft: draft,
Extended: extended,
}
}