Files
ReleaseKit/docs/consumers/build.md

3.3 KiB

Build versioned application binaries

Use releasekit.Build when an application needs binaries for explicit Go operating-system and architecture pairs:

import (
	"context"
	"fmt"

	releasekit "gitea.maximumdirect.net/eric/ReleaseKit"
)

func build(ctx context.Context) error {
	result, err := releasekit.Build(ctx, releasekit.BuildRequest{
		RepositoryDir: "/work/project",
		Version:       "v1.2.3",
		Spec: releasekit.BuildSpec{
			MainPackage: "./cmd/project",
			BinaryName:  "project",
			Targets: []releasekit.Target{
				{OS: "linux", Arch: "amd64"},
				{OS: "linux", Arch: "arm64"},
				{OS: "darwin", Arch: "arm64"},
			},
		},
		OutputDir: "dist",
	})
	if err != nil {
		return err // result retains completed artifacts when a later step fails.
	}
	for _, artifact := range result.Artifacts {
		fmt.Println(artifact.Filename, artifact.SHA256)
	}
	return nil
}

Build records the repository's current HEAD, injects the selected stable version into buildinfo.Version, and returns the compiler identity, normalized targets, artifact paths, filenames, and SHA-256 digests. Names follow <binary>-<version>-<goos>-<goarch>; Windows targets add .exe. A repeated target pair is built once, at its first position. Local builds may use modified source. SourceVerified is true only after a complete build observes clean source and the same HEAD before and after compilation; binary delivery requires that fact. This observation is not a source snapshot or attestation guarantee.

The default output directory is <repository>/dist; a relative OutputDir is resolved from the repository. Existing files with a selected artifact name are preserved and cause an error. Other files in the output directory are left in place. A failed later build or native version check returns the binaries already generated in BuildResult.Artifacts.

Builds use the prepared local Go toolchain, readonly module mode, disabled module network access, CGO_ENABLED=0, -trimpath, and -buildvcs=false. Each selected target is compiled explicitly. ReleaseKit then runs the version command on a native binary and requires <binary> <version> followed by a newline. If no selected target matches the Go host, it builds a temporary native binary for this check and removes it afterward. Cross-compilation does not promise that a binary runs on another platform.

An empty target list records the source commit and returns without invoking Go, creating the output directory, or running a version check. It does not require a main package or binary name. This supports source-only operations without silently adding a binary check.

The build command reads the same build specification from the profile and writes a private receipt alongside its artifacts. check and publish run selected builds after their one validation callback using temporary output outside the worktree; those candidate checks do not write a receipt or leave build files in the repository.

For delivery from a tagged checkout, deliver builds selected tagged-source targets into temporary storage by default. Use --assets DIR to deliver a separate build output; ReleaseKit requires its receipt and verifies the source, build settings, and artifact hashes before the first Gitea write. See the delivery consumer guide for page-only delivery and retry states.