Files
ReleaseKit/docs/consumers/publish.md

4.5 KiB

Source tag publication

Use releasekit.Publish to validate a committed candidate and push its exact annotated source tag:

result, err := releasekit.Publish(ctx, releasekit.ReleaseRequest{
	RepositoryDir:   "/work/project",
	Product:         "Example",
	Version:         "v1.2.3",
	ExpectedPushURL: "ssh://git.example/owner/example.git",
	Validation: releasekit.ValidationSpec{
		Go: releasekit.GoValidationSpec{Race: true, FullVet: true},
	},
	AdditionalChecks: func(ctx context.Context, candidate releasekit.Candidate) error {
		return runProjectChecks(ctx, candidate.RepositoryDir)
	},
})
if err != nil {
	return err
}
fmt.Println(result.Version, result.CandidateCommit, result.TagObject)

Publication captures a clean candidate on main, validates its committed release note, and checks the selected remote before running candidate checks. Set ExpectedPushURL to require the effective push destination to match an exact string. Git URL rewrites are resolved first, and the push URL is compared when fetch and push URLs differ. A mismatch fails preflight before Go validation, callbacks, or tag creation; detect it with errors.Is(err, releasekit.ErrUnexpectedPushURL). Check ignores this publication-only field. It runs one go test -mod=readonly -count=1 ./... suite with the available compatible local Go toolchain. Set Validation.Go.Race to run that suite with -race. Set Validation.Go.FullVet to run go vet -mod=readonly ./... after successful tests, with test-time vet disabled for that suite. The zero values keep ordinary test-time vet behavior. It then calls AdditionalChecks once when supplied. The standard suite cannot be replaced; move product-specific behavior into AdditionalChecks and remove repeated standard-suite commands from custom checks. A failed suite or additional check prevents tag creation, and wrapped errors preserve their causes. If race prerequisites are unavailable, the selected suite fails as go-test instead of silently running without the race detector. Full-vet failures are reported as go-vet and stop publication before tag creation.

Set Validation.Go.CompileTargets to compile packages for each complete target pair after tests and vet. This uses CGO_ENABLED=0, produces no artifact, and does not execute target binaries. A failure is reported as package-compile with the selected target and prevents tag creation.

Set Validation.GoFormat to check committed regular Go source using the Go formatter built into ReleaseKit. It includes vendor and nested modules, ignores worktree changes and symlink blobs, and reports unformatted paths as go-format without changing files. The default is disabled. The check follows tests, selected vet, and package compilation, and a failure stops publication before product checks or tag creation.

Set Validation.ModuleDistribution.WorkspaceFiles to reject committed go.work and go.work.sum blobs, including nested paths and symlink entries. The rule reads the captured candidate regardless of GOWORK; uncommitted files are ignored, and Go workspace selection and vendor behavior are unchanged. Its zero value disables the check. Findings use workspace-files and stop publication before product checks or tag creation. Set Validation.ModuleDistribution.LocalReplacements independently to parse committed go.mod declarations across the candidate, including nested and vendor modules. Filesystem replace directives are reported with their source path, line, and target as local-replacements; versioned replacements are permitted. Committed module symlinks are resolved within the candidate, and parse or inspection errors retain their causes. This check is independent of GOWORK; its zero value disables it, and a failure stops publication before product checks or tag creation.

If Build selects targets, ReleaseKit verifies them after the standard suite and additional checks, before creating the tag. The operation then rechecks the candidate and remote guards, creates an annotated tag for the captured commit, and pushes only that tag object.

A successful result means Git confirmed the push or an exact authoritative tag query confirmed it after a push error. The local tag is retained after a failed push. PublicationState distinguishes a known failure, conflict, confirmed publication, and unresolved outcome. Resolve an unknown result against the captured endpoint before retrying; see the maintainer procedure for the recovery steps. The CLI contract documents command output and exit statuses.