Skip to content
This repository was archived by the owner on Apr 12, 2024. It is now read-only.

Commit 344999d

Browse files
authored
Global build variables (#13)
1 parent bce621a commit 344999d

File tree

10 files changed

+140
-26
lines changed

10 files changed

+140
-26
lines changed

config/buildvars.go

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package config
2+
3+
// BuildVariables will be passed to a Golang's ldflags for variable injection.
4+
type BuildVariables map[string]Resolver
5+
6+
// BuildVariablesBuilder for a build variables.
7+
type BuildVariablesBuilder interface {
8+
// Add a key/value pair.
9+
Add(key string, resolver Resolver) BuildVariablesBuilder
10+
// ConditionallyAdd a key/value pair if cnd is true.
11+
ConditionallyAdd(cnd func() bool, key string, resolver Resolver) BuildVariablesBuilder
12+
// Build a build variables instance.
13+
Build() BuildVariables
14+
}
15+
16+
// NewBuildVariablesBuilder creates a new BuildVariablesBuilder.
17+
func NewBuildVariablesBuilder() BuildVariablesBuilder {
18+
return &defaultBuilder{
19+
bv: make(BuildVariables),
20+
}
21+
}
22+
23+
type defaultBuilder struct {
24+
bv BuildVariables
25+
}
26+
27+
func (d defaultBuilder) Add(key string, resolver Resolver) BuildVariablesBuilder {
28+
d.bv[key] = resolver
29+
return d
30+
}
31+
32+
func (d defaultBuilder) ConditionallyAdd(cnd func() bool, key string, resolver Resolver) BuildVariablesBuilder {
33+
if cnd() {
34+
return d.Add(key, resolver)
35+
}
36+
return d
37+
}
38+
39+
func (d defaultBuilder) Build() BuildVariables {
40+
return d.bv
41+
}

config/types.go

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,10 @@ type Config struct {
4141
// Checks holds a list of checks to perform.
4242
Checks []Task
4343

44+
// BuildVariables holds extra list of variables to be passed to Golang's
45+
// ldflags.
46+
BuildVariables
47+
4448
// Overrides holds a list of overrides of this configuration.
4549
Overrides []Configurator
4650

@@ -110,8 +114,8 @@ type Version struct {
110114

111115
// Metadata holds additional contextual information.
112116
type Metadata struct {
113-
Name string
114-
BuildVariables map[string]Resolver
117+
Name string
118+
BuildVariables
115119
}
116120

117121
func (m Metadata) GetName() string {

pkg/artifact/binary.go

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -81,11 +81,14 @@ func (b Binary) buildForPlatform(
8181
args := []string{
8282
"build",
8383
}
84-
version := config.Actual().Version
85-
if version != nil || len(b.BuildVariables) > 0 {
84+
c := config.Actual()
85+
if c.Version != nil || len(c.BuildVariables) > 0 || len(b.BuildVariables) > 0 {
8686
builder := ldflags.NewBuilder()
87-
if version != nil {
88-
builder.Add(version.Path, version.Resolver)
87+
for key, resolver := range c.BuildVariables {
88+
builder.Add(key, resolver)
89+
}
90+
if c.Version != nil {
91+
builder.Add(c.Version.Path, c.Version.Resolver)
8992
}
9093
for key, resolver := range b.BuildVariables {
9194
builder.Add(key, resolver)

pkg/artifact/ko_build.go

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -69,12 +69,15 @@ func (kb KoBuilder) Build(artifact config.Artifact, notifier config.Notifier) co
6969
}
7070

7171
func fillInLdflags(bo *options.BuildOptions, importPath string, image Image) {
72-
version := config.Actual().Version
72+
c := config.Actual()
7373
args := make([]string, 0)
74-
if version != nil || len(image.BuildVariables) > 0 {
74+
if c.Version != nil || len(c.BuildVariables) > 0 || len(image.BuildVariables) > 0 {
7575
builder := ldflags.NewBuilder()
76-
if version != nil {
77-
builder.Add(version.Path, version.Resolver)
76+
for key, resolver := range c.BuildVariables {
77+
builder.Add(key, resolver)
78+
}
79+
if c.Version != nil {
80+
builder.Add(c.Version.Path, c.Version.Resolver)
7881
}
7982
for key, resolver := range image.BuildVariables {
8083
builder.Add(key, resolver)

testing.go

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -24,17 +24,22 @@ func Test() {
2424
"test", "-v", "-covermode=count",
2525
fmt.Sprintf("-coverprofile=%s/coverage.out", files.BuildDir()),
2626
}
27-
args = append(appendVersion(args), "./...")
27+
args = append(appendBuildVariables(args), "./...")
2828
err := sh.RunV(cmd, args...)
2929
t.End(err)
3030
}
3131

32-
func appendVersion(args []string) []string {
33-
version := config.Actual().Version
34-
if version != nil {
35-
args = ldflags.NewBuilder().
36-
Add(version.Path, version.Resolver).
37-
BuildOnto(args)
32+
func appendBuildVariables(args []string) []string {
33+
c := config.Actual()
34+
if c.Version != nil || len(c.BuildVariables) > 0 {
35+
builder := ldflags.NewBuilder()
36+
if c.Version != nil {
37+
builder.Add(c.Version.Path, c.Version.Resolver)
38+
}
39+
for key, resolver := range c.BuildVariables {
40+
builder.Add(key, resolver)
41+
}
42+
args = builder.BuildOnto(args)
3843
}
3944
return args
4045
}

tests/example/Magefile.go

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
package main
55

66
import (
7+
"os"
8+
"strings"
79

810
// mage:import
911
"github.com/wavesoftware/go-magetasks"
@@ -33,9 +35,10 @@ func init() { //nolint:gochecknoinits
3335
other := artifact.Binary{
3436
Metadata: config.Metadata{
3537
Name: "other",
36-
BuildVariables: map[string]config.Resolver{
37-
metadata.ImagePath(): artifact.ImageReferenceOf(dummy),
38-
},
38+
BuildVariables: config.NewBuildVariablesBuilder().
39+
ConditionallyAdd(referenceImageByDigest,
40+
metadata.ImagePath(), artifact.ImageReferenceOf(dummy)).
41+
Build(),
3942
},
4043
Platforms: []artifact.Platform{
4144
{OS: platform.Linux, Architecture: platform.AMD64},
@@ -57,6 +60,22 @@ func init() { //nolint:gochecknoinits
5760
checks.Revive(),
5861
checks.Staticcheck(),
5962
},
63+
BuildVariables: map[string]config.Resolver{
64+
metadata.ImageBasenamePath(): func() string {
65+
return os.Getenv("IMAGE_BASENAME")
66+
},
67+
},
6068
Overrides: overrides.List,
6169
})
6270
}
71+
72+
func skipImageReference() bool {
73+
if val, ok := os.LookupEnv("SKIP_IMAGE_REFERENCE"); ok {
74+
return strings.ToLower(val) == "true"
75+
}
76+
return false
77+
}
78+
79+
func referenceImageByDigest() bool {
80+
return !skipImageReference()
81+
}

tests/example/cmd/other/main.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,5 @@ import (
88

99
func main() {
1010
log.Printf("Version: %s\n", metadata.Version)
11-
log.Printf("Image: %s\n", metadata.Image)
11+
log.Printf("Image: %s\n", metadata.ResolveImage())
1212
}
Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,31 @@
11
package metadata
22

3-
// Image holds information about companion image reference.
4-
//goland:noinspection GoUnusedGlobalVariable
5-
var Image = ""
3+
import "fmt"
4+
5+
var (
6+
// Image holds information about companion image reference.
7+
Image = "" //nolint:gochecknoglobals
8+
// ImageBasename holds a basename of a image, so the development reference
9+
// could be built from it.
10+
ImageBasename = "" //nolint:gochecknoglobals
11+
)
12+
13+
// ResolveImage will try to resolve the image reference from set values. If
14+
// Image is given it will be used, otherwise the ImageBasename and Version will
15+
// be used.
16+
func ResolveImage() string {
17+
if Image == "" {
18+
return fmt.Sprintf("%s:%s", ImageBasename, Version)
19+
}
20+
return Image
21+
}
622

723
// ImagePath return a path to the image variable.
824
func ImagePath() string {
9-
return "github.com/wavesoftware/go-magetasks/tests/example/pkg/metadata.Image"
25+
return importPath("Image")
26+
}
27+
28+
// ImageBasenamePath return a path to the image basename variable.
29+
func ImageBasenamePath() string {
30+
return importPath("ImageBasename")
1031
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package metadata
2+
3+
import (
4+
"fmt"
5+
"reflect"
6+
)
7+
8+
type marker struct{}
9+
10+
func importPath(variable string) string {
11+
m := marker{}
12+
p := findPackageForType(m)
13+
return fmt.Sprintf("%s.%s", p, variable)
14+
}
15+
16+
func findPackageForType(any interface{}) string {
17+
return reflect.TypeOf(any).PkgPath()
18+
}

tests/example/pkg/metadata/version.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,5 @@ var Version = "0.0.0"
55

66
// VersionPath return a path to the version variable.
77
func VersionPath() string {
8-
return "github.com/wavesoftware/go-magetasks/tests/example/pkg/metadata.Version"
8+
return importPath("Version")
99
}

0 commit comments

Comments
 (0)