From 6d9abe6299fb51487d19841ded3786f1b2a146c8 Mon Sep 17 00:00:00 2001 From: Sylvia Moss Date: Tue, 12 Jan 2021 21:27:46 +0100 Subject: [PATCH] feat: add Os and Arch template options to the Binary name field (#1936) * allow Os and Arch tmpl variables in binary name * update documentation * fix docs --- internal/pipe/build/build.go | 35 ++++++++-------- internal/pipe/build/build_test.go | 70 ++++++++++++++++++++++--------- www/docs/customization/build.md | 10 +++++ 3 files changed, 78 insertions(+), 37 deletions(-) diff --git a/internal/pipe/build/build.go b/internal/pipe/build/build.go index 775734af5e0..232cd7998f6 100644 --- a/internal/pipe/build/build.go +++ b/internal/pipe/build/build.go @@ -164,8 +164,22 @@ 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) { var ext = extFor(target, build.Flags) + var goos string + var goarch string + + if strings.Contains(target, "_") { + goos = strings.Split(target, "_")[0] + goarch = strings.Split(target, "_")[1] + } + + buildOpts := builders.Options{ + Target: target, + Ext: ext, + Os: goos, + Arch: goarch, + } - binary, err := tmpl.New(ctx).Apply(build.Binary) + binary, err := tmpl.New(ctx).WithBuildOptions(buildOpts).Apply(build.Binary) if err != nil { return nil, err } @@ -183,23 +197,10 @@ func buildOptionsForTarget(ctx *context.Context, build config.Build, target stri return nil, err } - var goos string - var goarch string - - if strings.Contains(target, "_") { - goos = strings.Split(target, "_")[0] - goarch = strings.Split(target, "_")[1] - } - log.WithField("binary", path).Info("building") - return &builders.Options{ - Target: target, - Name: name, - Path: path, - Ext: ext, - Os: goos, - Arch: goarch, - }, nil + buildOpts.Name = name + buildOpts.Path = path + return &buildOpts, nil } func extFor(target string, flags config.FlagArray) string { diff --git a/internal/pipe/build/build_test.go b/internal/pipe/build/build_test.go index 35e4d6b2b22..b268bfe77bd 100644 --- a/internal/pipe/build/build_test.go +++ b/internal/pipe/build/build_test.go @@ -706,28 +706,58 @@ func TestPipeOnBuild_invalidBinaryTpl(t *testing.T) { func TestBuildOptionsForTarget(t *testing.T) { var tmpDir = testlib.Mktmp(t) - build := config.Build{ - ID: "testid", - Binary: "testbinary", - Targets: []string{ - "linux_amd64", - "darwin_amd64", - "windows_amd64", + testCases := []struct { + name string + build config.Build + expectedOpts *api.Options + }{ + { + name: "simple options for target", + build: config.Build{ + ID: "testid", + Binary: "testbinary", + Targets: []string{ + "linux_amd64", + }, + }, + expectedOpts: &api.Options{ + Name: "testbinary", + Path: filepath.Join(tmpDir, "testid_linux_amd64", "testbinary"), + Target: "linux_amd64", + Os: "linux", + Arch: "amd64", + }, + }, + { + name: "binary name with Os and Arch template variables", + build: config.Build{ + ID: "testid", + Binary: "testbinary_{{.Os}}_{{.Arch}}", + Targets: []string{ + "linux_amd64", + }, + }, + expectedOpts: &api.Options{ + Name: "testbinary_linux_amd64", + Path: filepath.Join(tmpDir, "testid_linux_amd64", "testbinary_linux_amd64"), + Target: "linux_amd64", + Os: "linux", + Arch: "amd64", + }, }, } - ctx := context.New(config.Project{ - Dist: tmpDir, - Builds: []config.Build{build}, - }) - opts, err := buildOptionsForTarget(ctx, build, "linux_amd64") - require.NoError(t, err) - require.Equal(t, &api.Options{ - Name: "testbinary", - Path: filepath.Join(tmpDir, "testid_linux_amd64", "testbinary"), - Target: "linux_amd64", - Os: "linux", - Arch: "amd64", - }, opts) + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + ctx := context.New(config.Project{ + Dist: tmpDir, + Builds: []config.Build{tc.build}, + }) + opts, err := buildOptionsForTarget(ctx, tc.build, tc.build.Targets[0]) + require.NoError(t, err) + require.Equal(t, tc.expectedOpts, opts) + }) + } } func TestHookComplex(t *testing.T) { diff --git a/www/docs/customization/build.md b/www/docs/customization/build.md index 64061f098a5..9757da97fc1 100644 --- a/www/docs/customization/build.md +++ b/www/docs/customization/build.md @@ -159,6 +159,16 @@ builds: - windows ``` +The binary name field supports [templating](/customization/templates/). The following build details are exposed: + +| Key | Description | +|---------|----------------------------------| +| .Os | `GOOS` | +| .Arch | `GOARCH` | +| .Arm | `GOARM` | +| .Ext | Extension, e.g. `.exe` | +| .Target | Build target, e.g. `darwin_amd64`| + ## Passing environment variables to ldflags You can do that by using `{{ .Env.VARIABLE_NAME }}` in the template, for