Build selected targets with version injection
This commit is contained in:
97
build.go
Normal file
97
build.go
Normal file
@@ -0,0 +1,97 @@
|
||||
package releasekit
|
||||
|
||||
import (
|
||||
"context"
|
||||
"io"
|
||||
|
||||
internalbuild "gitea.maximumdirect.net/eric/ReleaseKit/internal/build"
|
||||
)
|
||||
|
||||
// Target identifies one explicit Go operating-system and architecture pair.
|
||||
type Target struct {
|
||||
OS string // Go operating system name, such as "linux".
|
||||
Arch string // Go architecture name, such as "amd64".
|
||||
}
|
||||
|
||||
// BuildSpec selects the application package, output name, and target pairs.
|
||||
type BuildSpec struct {
|
||||
MainPackage string // Go package path to build, such as "./cmd/app".
|
||||
BinaryName string // filename component used in output artifacts.
|
||||
Targets []Target // selected target pairs; duplicates are removed in order.
|
||||
}
|
||||
|
||||
// BuildRequest contains the source and output settings for Build.
|
||||
type BuildRequest struct {
|
||||
RepositoryDir string // source repository whose current HEAD is recorded.
|
||||
Version string // stable vMAJOR.MINOR.PATCH value injected at link time.
|
||||
Spec BuildSpec // application package, artifact name, and targets.
|
||||
OutputDir string // output location; empty selects <repository>/dist.
|
||||
Output io.Writer // optional build progress destination.
|
||||
}
|
||||
|
||||
// BuildArtifact identifies one generated binary and its SHA-256 digest.
|
||||
type BuildArtifact struct {
|
||||
Path string // absolute path to the generated binary.
|
||||
Filename string // generated filename.
|
||||
Target Target // Go target used for this artifact.
|
||||
SHA256 string // lowercase hexadecimal digest of the complete file.
|
||||
}
|
||||
|
||||
// BuildResult describes the source and artifacts reached by Build.
|
||||
type BuildResult struct {
|
||||
RepositoryDir string // absolute source repository path.
|
||||
CandidateCommit string // Git HEAD observed when the build started.
|
||||
Version string // requested injected version.
|
||||
MainPackage string // Go package path built.
|
||||
BinaryName string // artifact name prefix.
|
||||
OutputDir string // resolved output directory.
|
||||
Targets []Target // normalized target pairs.
|
||||
Artifacts []BuildArtifact // completed output files, including partial success.
|
||||
Compiler string // output of the selected local Go toolchain's version command.
|
||||
}
|
||||
|
||||
// Build compiles the selected targets with Version injected through buildinfo.
|
||||
// It uses the prepared local Go environment, preserves existing output files,
|
||||
// and verifies the version command on the native host before succeeding. An
|
||||
// empty target set records source identity without running the Go toolchain.
|
||||
// Errors return partial build facts in the result.
|
||||
func Build(ctx context.Context, request BuildRequest) (BuildResult, error) {
|
||||
targets := make([]internalbuild.Target, 0, len(request.Spec.Targets))
|
||||
for _, target := range request.Spec.Targets {
|
||||
targets = append(targets, internalbuild.Target{OS: target.OS, Arch: target.Arch})
|
||||
}
|
||||
result, err := internalbuild.Build(ctx, internalbuild.Request{
|
||||
RepositoryDir: request.RepositoryDir,
|
||||
Version: request.Version,
|
||||
Spec: internalbuild.Spec{
|
||||
MainPackage: request.Spec.MainPackage,
|
||||
BinaryName: request.Spec.BinaryName,
|
||||
Targets: targets,
|
||||
},
|
||||
OutputDir: request.OutputDir,
|
||||
Output: request.Output,
|
||||
})
|
||||
public := BuildResult{
|
||||
RepositoryDir: result.RepositoryDir,
|
||||
CandidateCommit: result.CandidateCommit,
|
||||
Version: result.Version,
|
||||
MainPackage: result.MainPackage,
|
||||
BinaryName: result.BinaryName,
|
||||
OutputDir: result.OutputDir,
|
||||
Compiler: result.Compiler,
|
||||
Targets: make([]Target, 0, len(result.Targets)),
|
||||
Artifacts: make([]BuildArtifact, 0, len(result.Artifacts)),
|
||||
}
|
||||
for _, target := range result.Targets {
|
||||
public.Targets = append(public.Targets, Target{OS: target.OS, Arch: target.Arch})
|
||||
}
|
||||
for _, artifact := range result.Artifacts {
|
||||
public.Artifacts = append(public.Artifacts, BuildArtifact{
|
||||
Path: artifact.Path,
|
||||
Filename: artifact.Filename,
|
||||
Target: Target{OS: artifact.Target.OS, Arch: artifact.Target.Arch},
|
||||
SHA256: artifact.SHA256,
|
||||
})
|
||||
}
|
||||
return public, err
|
||||
}
|
||||
Reference in New Issue
Block a user