Skip to content

Commit

Permalink
Merge branch 'goreleaser:main' into main
Browse files Browse the repository at this point in the history
  • Loading branch information
gal-legit committed Nov 12, 2022
2 parents b5e56c1 + 778f099 commit 5965c86
Show file tree
Hide file tree
Showing 26 changed files with 1,527 additions and 46 deletions.
2 changes: 1 addition & 1 deletion Dockerfile
@@ -1,4 +1,4 @@
FROM golang:1.19.3-alpine@sha256:8558ae624304387d18694b9ea065cc9813dd4f7f9bd5073edb237541f2d0561b
FROM golang:1.19.3-alpine@sha256:dc4f4756a4fb91b6f496a958e11e00c0621130c8dfbb31ac0737b0229ad6ad9c

RUN apk add --no-cache bash \
curl \
Expand Down
16 changes: 16 additions & 0 deletions internal/artifact/artifact.go
Expand Up @@ -66,6 +66,14 @@ const (
ScoopManifest
// SBOM is a Software Bill of Materials file.
SBOM
// PublishableChocolatey is a chocolatey package yet to be published.
PublishableChocolatey
// Header is a C header file, generated for CGo library builds.
Header
// CArchive is a C static library, generated via a CGo build with buildmode=c-archive.
CArchive
// CShared is a C shared library, generated via a CGo build with buildmode=c-shared.
CShared
)

func (t Type) String() string {
Expand Down Expand Up @@ -106,6 +114,14 @@ func (t Type) String() string {
return "PKGBUILD"
case SrcInfo:
return "SRCINFO"
case PublishableChocolatey:
return "Chocolatey"
case Header:
return "C Header"
case CArchive:
return "C Archive Library"
case CShared:
return "C Shared Library"
default:
return "unknown"
}
Expand Down
72 changes: 63 additions & 9 deletions internal/builders/golang/build.go
Expand Up @@ -135,7 +135,7 @@ func (*Builder) Build(ctx *context.Context, build config.Build, options api.Opti
return err
}

artifact := &artifact.Artifact{
a := &artifact.Artifact{
Type: artifact.Binary,
Path: options.Path,
Name: options.Name,
Expand All @@ -151,6 +151,15 @@ func (*Builder) Build(ctx *context.Context, build config.Build, options api.Opti
},
}

if build.Buildmode == "c-archive" {
a.Type = artifact.CArchive
ctx.Artifacts.Add(getHeaderArtifactForLibrary(build, options))
}
if build.Buildmode == "c-shared" {
a.Type = artifact.CShared
ctx.Artifacts.Add(getHeaderArtifactForLibrary(build, options))
}

details, err := withOverrides(ctx, build, options)
if err != nil {
return err
Expand All @@ -167,7 +176,7 @@ func (*Builder) Build(ctx *context.Context, build config.Build, options api.Opti
"GOAMD64="+options.Goamd64,
)

cmd, err := buildGoBuildLine(ctx, build, details, options, artifact, env)
cmd, err := buildGoBuildLine(ctx, build, details, options, a, env)
if err != nil {
return err
}
Expand All @@ -177,7 +186,7 @@ func (*Builder) Build(ctx *context.Context, build config.Build, options api.Opti
}

if build.ModTimestamp != "" {
modTimestamp, err := tmpl.New(ctx).WithEnvS(env).WithArtifact(artifact, map[string]string{}).Apply(build.ModTimestamp)
modTimestamp, err := tmpl.New(ctx).WithEnvS(env).WithArtifact(a, map[string]string{}).Apply(build.ModTimestamp)
if err != nil {
return err
}
Expand All @@ -192,7 +201,7 @@ func (*Builder) Build(ctx *context.Context, build config.Build, options api.Opti
}
}

ctx.Artifacts.Add(artifact)
ctx.Artifacts.Add(a)
return nil
}

Expand All @@ -206,11 +215,12 @@ func withOverrides(ctx *context.Context, build config.Build, options api.Options

if optsTarget == overrideTarget {
dets := config.BuildDetails{
Ldflags: build.BuildDetails.Ldflags,
Tags: build.BuildDetails.Tags,
Flags: build.BuildDetails.Flags,
Asmflags: build.BuildDetails.Asmflags,
Gcflags: build.BuildDetails.Gcflags,
Buildmode: build.BuildDetails.Buildmode,
Ldflags: build.BuildDetails.Ldflags,
Tags: build.BuildDetails.Tags,
Flags: build.BuildDetails.Flags,
Asmflags: build.BuildDetails.Asmflags,
Gcflags: build.BuildDetails.Gcflags,
}
if err := mergo.Merge(&dets, o.BuildDetails, mergo.WithOverride); err != nil {
return build.BuildDetails, err
Expand All @@ -228,6 +238,9 @@ func withOverrides(ctx *context.Context, build config.Build, options api.Options
func buildGoBuildLine(ctx *context.Context, build config.Build, details config.BuildDetails, options api.Options, artifact *artifact.Artifact, env []string) ([]string, error) {
cmd := []string{build.GoBinary, build.Command}

// tags, ldflags, and buildmode, should only appear once, warning only to avoid a breaking change
validateUniqueFlags(details)

flags, err := processFlags(ctx, artifact, env, details.Flags, "")
if err != nil {
return cmd, err
Expand Down Expand Up @@ -266,10 +279,28 @@ func buildGoBuildLine(ctx *context.Context, build config.Build, details config.B
cmd = append(cmd, "-ldflags="+strings.Join(ldflags, " "))
}

if details.Buildmode != "" {
cmd = append(cmd, "-buildmode="+details.Buildmode)
}

cmd = append(cmd, "-o", options.Path, build.Main)
return cmd, nil
}

func validateUniqueFlags(details config.BuildDetails) {
for _, flag := range details.Flags {
if strings.HasPrefix(flag, "-tags") && len(details.Tags) > 0 {
log.WithField("flag", flag).WithField("tags", details.Tags).Warn("tags is defined twice")
}
if strings.HasPrefix(flag, "-ldflags") && len(details.Ldflags) > 0 {
log.WithField("flag", flag).WithField("ldflags", details.Ldflags).Warn("ldflags is defined twice")
}
if strings.HasPrefix(flag, "-buildmode") && details.Buildmode != "" {
log.WithField("flag", flag).WithField("buildmode", details.Buildmode).Warn("buildmode is defined twice")
}
}
}

func processFlags(ctx *context.Context, a *artifact.Artifact, env, flags []string, flagPrefix string) ([]string, error) {
processed := make([]string, 0, len(flags))
for _, rawFlag := range flags {
Expand Down Expand Up @@ -366,3 +397,26 @@ func hasMain(file *ast.File) bool {
}
return false
}

func getHeaderArtifactForLibrary(build config.Build, options api.Options) *artifact.Artifact {
fullPathWithoutExt := strings.TrimSuffix(options.Path, options.Ext)
basePath := filepath.Base(fullPathWithoutExt)
fullPath := fullPathWithoutExt + ".h"
headerName := basePath + ".h"

return &artifact.Artifact{
Type: artifact.Header,
Path: fullPath,
Name: headerName,
Goos: options.Goos,
Goarch: options.Goarch,
Goamd64: options.Goamd64,
Goarm: options.Goarm,
Gomips: options.Gomips,
Extra: map[string]interface{}{
artifact.ExtraBinary: headerName,
artifact.ExtraExt: ".h",
artifact.ExtraID: build.ID,
},
}
}
3 changes: 3 additions & 0 deletions internal/pipe/archive/archive.go
Expand Up @@ -91,6 +91,9 @@ func (Pipe) Run(ctx *context.Context) error {
filter := []artifact.Filter{artifact.Or(
artifact.ByType(artifact.Binary),
artifact.ByType(artifact.UniversalBinary),
artifact.ByType(artifact.Header),
artifact.ByType(artifact.CArchive),
artifact.ByType(artifact.CShared),
)}
if len(archive.Builds) > 0 {
filter = append(filter, artifact.ByIDs(archive.Builds...))
Expand Down
2 changes: 1 addition & 1 deletion internal/pipe/artifactory/artifactory.go
Expand Up @@ -79,7 +79,7 @@ func checkResponse(r *h.Response) error {
if err == nil && data != nil {
err := json.Unmarshal(data, errorResponse)
if err != nil {
return err
return fmt.Errorf("unexpected error: %w: %s", err, string(data))
}
}
return errorResponse
Expand Down
8 changes: 2 additions & 6 deletions internal/pipe/artifactory/artifactory_test.go
Expand Up @@ -461,11 +461,7 @@ func TestRunPipe_UnparsableErrorResponse(t *testing.T) {
requireHeader(t, r, "Authorization", "Basic ZGVwbG95dXNlcjpkZXBsb3l1c2VyLXNlY3JldA==")

w.WriteHeader(http.StatusUnauthorized)
fmt.Fprint(w, `...{
"errors" : [ {
...
} ]
}`)
fmt.Fprint(w, `<body><h1>error</h1></body>`)
})

ctx := context.New(config.Project{
Expand Down Expand Up @@ -495,7 +491,7 @@ func TestRunPipe_UnparsableErrorResponse(t *testing.T) {
})

require.NoError(t, Pipe{}.Default(ctx))
require.EqualError(t, Pipe{}.Publish(ctx), `artifactory: upload failed: invalid character '.' looking for beginning of value`)
require.EqualError(t, Pipe{}.Publish(ctx), `artifactory: upload failed: unexpected error: invalid character '<' looking for beginning of value: <body><h1>error</h1></body>`)
}

func TestRunPipe_FileNotFound(t *testing.T) {
Expand Down
34 changes: 23 additions & 11 deletions internal/pipe/build/build.go
Expand Up @@ -156,7 +156,7 @@ func doBuild(ctx *context.Context, build config.Build, opts builders.Options) er
}

func buildOptionsForTarget(ctx *context.Context, build config.Build, target string) (*builders.Options, error) {
ext := extFor(target, build.Flags)
ext := extFor(target, build.BuildDetails)
parts := strings.Split(target, "_")
if len(parts) < 2 {
return nil, fmt.Errorf("%s is not a valid build target", target)
Expand Down Expand Up @@ -211,20 +211,32 @@ func buildOptionsForTarget(ctx *context.Context, build config.Build, target stri
return &buildOpts, nil
}

func extFor(target string, flags config.FlagArray) string {
if strings.Contains(target, "windows") {
for _, s := range flags {
if s == "-buildmode=c-shared" {
return ".dll"
}
if s == "-buildmode=c-archive" {
return ".lib"
}
func extFor(target string, build config.BuildDetails) string {
// Configure the extensions for shared and static libraries - by default .so and .a respectively -
// with overrides for Windows (.dll for shared and .lib for static) and .dylib for macOS.
switch build.Buildmode {
case "c-shared":
if strings.Contains(target, "darwin") {
return ".dylib"
}
return ".exe"
if strings.Contains(target, "windows") {
return ".dll"
}
return ".so"
case "c-archive":
if strings.Contains(target, "windows") {
return ".lib"
}
return ".a"
}

if target == "js_wasm" {
return ".wasm"
}

if strings.Contains(target, "windows") {
return ".exe"
}

return ""
}
45 changes: 34 additions & 11 deletions internal/pipe/build/build_test.go
Expand Up @@ -426,24 +426,47 @@ func TestSkipBuild(t *testing.T) {
require.Len(t, ctx.Artifacts.List(), 0)
}

func TestExtDarwin(t *testing.T) {
require.Equal(t, "", extFor("darwin_amd64", config.BuildDetails{}))
require.Equal(t, "", extFor("darwin_arm64", config.BuildDetails{}))
require.Equal(t, "", extFor("darwin_amd64", config.BuildDetails{}))
require.Equal(t, ".dylib", extFor("darwin_amd64", config.BuildDetails{Buildmode: "c-shared"}))
require.Equal(t, ".dylib", extFor("darwin_arm64", config.BuildDetails{Buildmode: "c-shared"}))
require.Equal(t, ".a", extFor("darwin_amd64", config.BuildDetails{Buildmode: "c-archive"}))
require.Equal(t, ".a", extFor("darwin_arm64", config.BuildDetails{Buildmode: "c-archive"}))
}

func TestExtLinux(t *testing.T) {
require.Equal(t, "", extFor("linux_amd64", config.BuildDetails{}))
require.Equal(t, "", extFor("linux_386", config.BuildDetails{}))
require.Equal(t, "", extFor("linux_amd64", config.BuildDetails{}))
require.Equal(t, ".so", extFor("linux_amd64", config.BuildDetails{Buildmode: "c-shared"}))
require.Equal(t, ".so", extFor("linux_386", config.BuildDetails{Buildmode: "c-shared"}))
require.Equal(t, ".a", extFor("linux_amd64", config.BuildDetails{Buildmode: "c-archive"}))
require.Equal(t, ".a", extFor("linux_386", config.BuildDetails{Buildmode: "c-archive"}))
}

func TestExtWindows(t *testing.T) {
require.Equal(t, ".exe", extFor("windows_amd64", config.FlagArray{}))
require.Equal(t, ".exe", extFor("windows_386", config.FlagArray{}))
require.Equal(t, ".exe", extFor("windows_amd64", config.FlagArray{"-tags=dev", "-v"}))
require.Equal(t, ".dll", extFor("windows_amd64", config.FlagArray{"-tags=dev", "-v", "-buildmode=c-shared"}))
require.Equal(t, ".dll", extFor("windows_386", config.FlagArray{"-buildmode=c-shared"}))
require.Equal(t, ".lib", extFor("windows_amd64", config.FlagArray{"-buildmode=c-archive"}))
require.Equal(t, ".lib", extFor("windows_386", config.FlagArray{"-tags=dev", "-v", "-buildmode=c-archive"}))
require.Equal(t, ".exe", extFor("windows_amd64", config.BuildDetails{}))
require.Equal(t, ".exe", extFor("windows_386", config.BuildDetails{}))
require.Equal(t, ".exe", extFor("windows_amd64", config.BuildDetails{}))
require.Equal(t, ".dll", extFor("windows_amd64", config.BuildDetails{Buildmode: "c-shared"}))
require.Equal(t, ".dll", extFor("windows_386", config.BuildDetails{Buildmode: "c-shared"}))
require.Equal(t, ".lib", extFor("windows_amd64", config.BuildDetails{Buildmode: "c-archive"}))
require.Equal(t, ".lib", extFor("windows_386", config.BuildDetails{Buildmode: "c-archive"}))
}

func TestExtWasm(t *testing.T) {
require.Equal(t, ".wasm", extFor("js_wasm", config.FlagArray{}))
require.Equal(t, ".wasm", extFor("js_wasm", config.BuildDetails{}))
}

func TestExtOthers(t *testing.T) {
require.Empty(t, "", extFor("linux_amd64", config.FlagArray{}))
require.Empty(t, "", extFor("linuxwin_386", config.FlagArray{}))
require.Empty(t, "", extFor("winasdasd_sad", config.FlagArray{}))
require.Equal(t, "", extFor("linux_amd64", config.BuildDetails{}))
require.Equal(t, "", extFor("linuxwin_386", config.BuildDetails{}))
require.Equal(t, "", extFor("winasdasd_sad", config.BuildDetails{}))
require.Equal(t, ".so", extFor("aix_amd64", config.BuildDetails{Buildmode: "c-shared"}))
require.Equal(t, ".a", extFor("android_386", config.BuildDetails{Buildmode: "c-archive"}))
require.Equal(t, ".so", extFor("winasdasd_sad", config.BuildDetails{Buildmode: "c-shared"}))
}

func TestTemplate(t *testing.T) {
Expand Down

0 comments on commit 5965c86

Please sign in to comment.