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

Commit 9961ce9

Browse files
authored
Overhaul with multiplatform build, nicer API, and embedded KO build (#9)
* A rework of the library structure * Project builds and passes golangci-lint * Binary builds are working * In fact build for various platforms. * Tweaking the output * KO build works, tests as well * Basic KO publisher * Publishing works * LDflags for images works * Minor UI fixes * Remove changes for ko-build/ko#476
1 parent d81ad26 commit 9961ce9

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

63 files changed

+3070
-622
lines changed

.github/workflows/lints.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ jobs:
1616
uses: golangci/golangci-lint-action@v2
1717
with:
1818
# Required: the version of golangci-lint is required and must be specified without patch version: we always use the latest patch version.
19-
version: v1.35.2
19+
version: latest
2020
editorconfig:
2121
name: EditorConfig
2222
runs-on: ubuntu-latest

.github/workflows/test.yml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@ jobs:
1515
strategy:
1616
matrix:
1717
go-version:
18-
- '1.15'
18+
- '1.16'
19+
- '1.17'
1920
steps:
2021

2122
- name: Set up Go ${{ matrix.go-version }}

.golangci.yml

Lines changed: 33 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -1,57 +1,44 @@
11
run:
22
timeout: 5m
3+
build-tags:
4+
- e2e
5+
- mage
36

47
linters:
58
disable-all: false
69
presets:
710
- bugs
811
- unused
12+
- complexity
13+
- format
14+
- performance
15+
- style
916
enable:
10-
- bodyclose
11-
- deadcode
12-
- depguard
13-
- dogsled
14-
- dupl
15-
- errcheck
16-
- exhaustive
17-
- funlen
18-
- goconst
19-
- gocritic
20-
- gocyclo
21-
- gofmt
22-
- goimports
23-
- golint
24-
- gomnd
25-
- goprintffuncname
26-
- gosec
27-
- gosimple
28-
- govet
29-
- ineffassign
30-
- interfacer
31-
- lll
32-
- misspell
33-
- nakedret
34-
- noctx
35-
- nolintlint
36-
- rowserrcheck
37-
- scopelint
38-
- staticcheck
39-
- structcheck
40-
- stylecheck
41-
- typecheck
42-
- unconvert
43-
- unparam
44-
- unused
45-
- varcheck
46-
- asciicheck
47-
- gocognit
48-
- godot
49-
- godox
50-
- goerr113
51-
- maligned
52-
- nestif
53-
- prealloc
54-
- testpackage
17+
- gci
5518
disable:
56-
- whitespace
19+
- paralleltest
20+
- nlreturn
21+
- exhaustivestruct
5722
- wsl
23+
- godox
24+
- scopelint
25+
- maligned
26+
- interfacer
27+
- golint
28+
- deadcode
29+
- gochecknoglobals
30+
- wrapcheck
31+
32+
issues:
33+
exclude-rules:
34+
- path: _test\.go
35+
linters:
36+
- wrapcheck
37+
38+
39+
linters-settings:
40+
gomoddirectives:
41+
# List of allowed `replace` directives. Default is empty.
42+
replace-allow-list:
43+
# FIXME: remove after https://github.com/google/ko/issues/476
44+
- github.com/google/ko

binary.go

Lines changed: 0 additions & 39 deletions
This file was deleted.

build.go

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package magetasks
2+
3+
import (
4+
"context"
5+
"errors"
6+
"fmt"
7+
8+
"github.com/magefile/mage/mg"
9+
"github.com/wavesoftware/go-magetasks/config"
10+
"github.com/wavesoftware/go-magetasks/pkg/artifact"
11+
"github.com/wavesoftware/go-magetasks/pkg/files"
12+
"github.com/wavesoftware/go-magetasks/pkg/tasks"
13+
)
14+
15+
// ErrNoBuilderForArtifact when no builder for artifact is found.
16+
var ErrNoBuilderForArtifact = errors.New("no builder for artifact found")
17+
18+
// Build will build project artifacts, binaries and images.
19+
func Build() {
20+
mg.Deps(Test, files.EnsureBuildDir)
21+
t := tasks.Start("🔨", "Building", len(config.Actual().Artifacts) > 0)
22+
for _, art := range config.Actual().Artifacts {
23+
p := t.Part(fmt.Sprintf("%s %s", art.GetType(), art.GetName()))
24+
pp := p.Starting()
25+
26+
buildArtifact(art, pp)
27+
}
28+
t.End()
29+
}
30+
31+
func buildArtifact(art config.Artifact, pp tasks.PartProcessing) {
32+
found := false
33+
for _, builder := range config.Actual().Builders {
34+
if !builder.Accepts(art) {
35+
continue
36+
}
37+
found = true
38+
result := builder.Build(art, pp)
39+
if result.Failed() {
40+
pp.Done(result.Error)
41+
return
42+
}
43+
config.WithContext(func(ctx context.Context) context.Context {
44+
return context.WithValue(ctx, artifact.BuildKey(art), result)
45+
})
46+
}
47+
var err error
48+
if !found {
49+
err = ErrNoBuilderForArtifact
50+
}
51+
pp.Done(err)
52+
}

checks.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,18 @@ package magetasks
33
import (
44
"github.com/magefile/mage/mg"
55
"github.com/wavesoftware/go-magetasks/config"
6-
"github.com/wavesoftware/go-magetasks/internal"
6+
"github.com/wavesoftware/go-magetasks/pkg/deps"
77
"github.com/wavesoftware/go-magetasks/pkg/tasks"
88
)
99

1010
// Check will run all lints checks.
1111
func Check() {
12-
mg.Deps(internal.BuildDeps)
13-
t := tasks.StartMultiline("🔍", "Checking")
14-
for _, check := range config.Checks {
12+
mg.Deps(deps.Install)
13+
t := tasks.Start("🔍", "Checking", len(config.Actual().Checks) > 0)
14+
for _, check := range config.Actual().Checks {
1515
p := t.Part(check.Name)
16-
ps := p.Starting()
17-
ps.Done(check.Task())
16+
pp := p.Starting()
17+
pp.Done(check.Operation(pp))
1818
}
1919
t.End(nil)
2020
}

cleaning.go

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,19 +4,20 @@ import (
44
"os"
55

66
"github.com/wavesoftware/go-magetasks/config"
7-
"github.com/wavesoftware/go-magetasks/internal"
7+
"github.com/wavesoftware/go-magetasks/pkg/files"
88
"github.com/wavesoftware/go-magetasks/pkg/tasks"
99
)
1010

1111
// Clean will clean project files.
1212
func Clean() {
13-
t := tasks.Start("🚿", "Cleaning")
14-
err := os.RemoveAll(internal.BuildDir())
13+
t := tasks.Start("🚿", "Cleaning", len(config.Actual().Cleaning) > 0)
14+
err := os.RemoveAll(files.BuildDir())
1515
errs := make([]error, 0, 1)
1616
errs = append(errs, err)
17-
for _, task := range config.CleaningTasks {
17+
for _, task := range config.Actual().Cleaning {
1818
p := t.Part(task.Name)
19-
p.Starting().Done(task.Task())
19+
pp := p.Starting()
20+
pp.Done(task.Operation(pp))
2021
}
2122
t.End(errs...)
2223
}

config/defaults.go

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package config
2+
3+
import (
4+
"context"
5+
6+
"github.com/fatih/color"
7+
)
8+
9+
var (
10+
// DefaultBuilders is a list of default builders.
11+
DefaultBuilders = make([]Builder, 0)
12+
// DefaultPublishers is a list of default publishers.
13+
DefaultPublishers = make([]Publisher, 0)
14+
)
15+
16+
// FillInDefaultValues in provided config and returns a filled one.
17+
func FillInDefaultValues(cfg Config) Config {
18+
if len(cfg.BuildDirPath) == 0 {
19+
cfg.BuildDirPath = []string{"build", "_output"}
20+
}
21+
empty := &MageTag{}
22+
if cfg.MageTag == *empty {
23+
cfg.MageTag = MageTag{
24+
Color: color.FgCyan,
25+
Label: "[MAGE]",
26+
}
27+
}
28+
if cfg.Dependencies == nil {
29+
cfg.Dependencies = NewDependencies("github.com/kyoh86/richgo")
30+
}
31+
if cfg.Context == nil {
32+
cfg.Context = context.TODO()
33+
}
34+
if cfg.Artifacts == nil {
35+
cfg.Artifacts = make([]Artifact, 0)
36+
}
37+
if len(cfg.Builders) == 0 {
38+
cfg.Builders = append(cfg.Builders, DefaultBuilders...)
39+
}
40+
if len(cfg.Publishers) == 0 {
41+
cfg.Publishers = append(cfg.Publishers, DefaultPublishers...)
42+
}
43+
return cfg
44+
}

config/deps.go

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package config
2+
3+
type Dependencies interface {
4+
Configurator
5+
Installs() []string
6+
merge(other Dependencies)
7+
}
8+
9+
func NewDependencies(deps ...string) Dependencies {
10+
s := make(map[string]bool, len(deps))
11+
for _, dep := range deps {
12+
s[dep] = exists
13+
}
14+
return dependencies{
15+
set: s,
16+
}
17+
}
18+
19+
const exists = true
20+
21+
type dependencies struct {
22+
set map[string]bool
23+
}
24+
25+
func (d dependencies) Installs() []string {
26+
keys := make([]string, len(d.set))
27+
28+
i := 0
29+
for k := range d.set {
30+
keys[i] = k
31+
i++
32+
}
33+
34+
return keys
35+
}
36+
37+
func (d dependencies) Configure(cfg Configurable) {
38+
cfg.Config().Dependencies.merge(d)
39+
}
40+
41+
func (d dependencies) merge(other Dependencies) {
42+
for _, dep := range other.Installs() {
43+
d.set[dep] = exists
44+
}
45+
}

config/settings.go

Lines changed: 0 additions & 34 deletions
This file was deleted.

0 commit comments

Comments
 (0)