Preserve build errors and available failure evidence
This commit is contained in:
30
build.go
30
build.go
@@ -2,12 +2,14 @@ package releasekit
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"io"
|
||||
|
||||
"gitea.maximumdirect.net/eric/ReleaseKit/internal/artifact"
|
||||
internalbuild "gitea.maximumdirect.net/eric/ReleaseKit/internal/build"
|
||||
"gitea.maximumdirect.net/eric/ReleaseKit/internal/git"
|
||||
"gitea.maximumdirect.net/eric/ReleaseKit/internal/releaseidentity"
|
||||
"gitea.maximumdirect.net/eric/ReleaseKit/internal/versioncontract"
|
||||
)
|
||||
|
||||
// Target identifies one explicit Go operating-system and architecture pair.
|
||||
@@ -71,22 +73,36 @@ type BuildResult struct {
|
||||
// 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) {
|
||||
public := BuildResult{Version: request.Version}
|
||||
spec := *internalBuildSpec(&request.Spec)
|
||||
result := internalbuild.Result{Version: request.Version}
|
||||
failure := func(err error) (BuildResult, error) {
|
||||
result.Settings = artifact.NormalizeSettings(spec.MainPackage, spec.BinaryName, spec.Targets)
|
||||
return publicBuildResult(result), err
|
||||
}
|
||||
if !versioncontract.ValidStableVersion(request.Version) {
|
||||
return failure(fmt.Errorf("%w: %q", ErrInvalidVersion, request.Version))
|
||||
}
|
||||
repositoryDir, err := git.RepositoryRoot(ctx, request.RepositoryDir)
|
||||
if err != nil {
|
||||
return public, err
|
||||
return failure(err)
|
||||
}
|
||||
result.RepositoryDir = repositoryDir
|
||||
identity, err := releaseidentity.FromWorkingTree(ctx, repositoryDir, request.ModuleDir, request.Version)
|
||||
result.ModuleDir, result.ModulePath, result.Tag = identity.ModuleDir, identity.ModulePath, identity.Tag
|
||||
if err != nil {
|
||||
return public, err
|
||||
return failure(err)
|
||||
}
|
||||
result, err := internalbuild.BuildResolved(ctx, internalbuild.Request{
|
||||
result, err = internalbuild.BuildResolved(ctx, internalbuild.Request{
|
||||
Identity: identity,
|
||||
Spec: *internalBuildSpec(&request.Spec),
|
||||
Spec: spec,
|
||||
OutputDir: request.OutputDir,
|
||||
Output: request.Output,
|
||||
})
|
||||
public = BuildResult{
|
||||
return publicBuildResult(result), err
|
||||
}
|
||||
|
||||
func publicBuildResult(result internalbuild.Result) BuildResult {
|
||||
public := BuildResult{
|
||||
RepositoryDir: result.RepositoryDir,
|
||||
ModuleDir: result.ModuleDir,
|
||||
ModulePath: result.ModulePath,
|
||||
@@ -112,7 +128,7 @@ func Build(ctx context.Context, request BuildRequest) (BuildResult, error) {
|
||||
SHA256: artifact.SHA256,
|
||||
})
|
||||
}
|
||||
return public, err
|
||||
return public
|
||||
}
|
||||
|
||||
func internalBuildSpec(spec *BuildSpec) *internalbuild.Spec {
|
||||
|
||||
Reference in New Issue
Block a user