Total rewrite using buildkit · gitpod-io/dazzle@ceaa19e (original) (raw)
`@@ -21,138 +21,44 @@
`
21
21
`package core
`
22
22
``
23
23
`import (
`
24
``
`-
"encoding/xml"
`
25
``
`-
"fmt"
`
26
``
`-
"io/ioutil"
`
27
``
`-
"os"
`
``
24
`+
"context"
`
28
25
``
29
``
`-
"github.com/32leaves/dazzle/pkg/dazzle"
`
30
``
`-
"github.com/32leaves/dazzle/pkg/fancylog"
`
31
``
`-
"github.com/32leaves/dazzle/pkg/test"
`
``
26
`+
"github.com/csweichel/dazzle/pkg/dazzle"
`
``
27
`+
"github.com/csweichel/dazzle/pkg/fancylog"
`
``
28
`+
"github.com/moby/buildkit/client"
`
32
29
` log "github.com/sirupsen/logrus"
`
33
30
`"github.com/spf13/cobra"
`
34
31
`)
`
35
32
``
36
33
`// buildCmd represents the build command
`
37
34
`var buildCmd = &cobra.Command{
`
38
``
`-
Use: "build [context]",
`
``
35
`+
Use: "build ",
`
39
36
`Short: "Builds a Docker image with independent layers",
`
40
``
`-
Args: cobra.MaximumNArgs(1),
`
``
37
`+
Args: cobra.MinimumNArgs(2),
`
41
38
`RunE: func(cmd *cobra.Command, args []string) error {
`
42
39
`formatter := &fancylog.Formatter{}
`
43
40
`log.SetFormatter(formatter)
`
44
41
``
45
``
`-
var wd string
`
46
``
`-
if len(args) > 0 {
`
47
``
`-
wd = args[0]
`
48
``
-
49
``
`-
if stat, err := os.Stat(wd); os.IsNotExist(err) || !stat.IsDir() {
`
50
``
`-
return fmt.Errorf("context %s must be a directory", wd)
`
51
``
`-
}
`
52
``
`-
} else {
`
53
``
`-
var err error
`
54
``
`-
wd, err = os.Getwd()
`
55
``
`-
if err != nil {
`
56
``
`-
return err
`
57
``
`-
}
`
58
``
`-
}
`
59
``
-
60
``
`-
dfn, err := cmd.Flags().GetString("file")
`
61
``
`-
if err != nil {
`
62
``
`-
return err
`
63
``
`-
}
`
64
``
`-
tag, err := cmd.Flags().GetString("tag")
`
65
``
`-
if err != nil {
`
66
``
`-
return err
`
67
``
`-
}
`
68
``
`-
repo, err := cmd.Flags().GetString("repository")
`
``
42
`+
var (
`
``
43
`+
targetref = args[0]
`
``
44
`+
wd = args[1]
`
``
45
`+
)
`
``
46
`+
prj, err := dazzle.LoadFromDir(wd)
`
69
47
`if err != nil {
`
70
48
`return err
`
71
49
` }
`
72
``
`-
repoChanged := cmd.Flags().Changed("repository")
`
73
``
`-
if !repoChanged {
`
74
``
`-
log.Warn("Using dazzle without --repository will likely produce incorrect results!")
`
75
``
`-
}
`
76
50
``
77
``
`-
env, err := dazzle.NewEnvironment()
`
``
51
`+
sckt, _ := cmd.Flags().GetString("addr")
`
``
52
`+
cl, err := client.New(context.Background(), sckt, client.WithFailFast())
`
78
53
`if err != nil {
`
79
``
`-
log.Fatal(err)
`
80
``
`-
}
`
81
``
`-
env.Formatter = formatter
`
82
``
-
83
``
`-
log.WithField("version", version).Debug("this is dazzle")
`
84
``
-
85
``
`-
cfg := dazzle.BuildConfig{
`
86
``
`-
Env: env,
`
87
``
`-
BuildImageRepo: repo,
`
88
``
`-
}
`
89
``
-
90
``
`-
res, err := dazzle.Build(cfg, wd, dfn, tag)
`
91
``
`-
logBuildResult(res)
`
92
``
`-
testXMLOutput, _ := cmd.Flags().GetString("output-test-xml")
`
93
``
`-
if testXMLOutput != "" {
`
94
``
`-
serr := saveTestXMLOutput(res, testXMLOutput)
`
95
``
`-
if serr != nil {
`
96
``
`-
log.WithError(serr).Error("cannot save test result")
`
97
``
`-
}
`
98
``
`-
}
`
99
``
`-
if err != nil {
`
100
``
`-
log.Fatal(err)
`
``
54
`+
return err
`
101
55
` }
`
102
``
-
103
``
`-
return nil
`
``
56
`+
return prj.Build(context.Background(), cl, targetref)
`
104
57
` },
`
105
58
`}
`
106
59
``
107
60
`func init() {
`
108
61
`rootCmd.AddCommand(buildCmd)
`
109
62
``
110
``
`-
buildCmd.Flags().StringP("file", "f", "Dockerfile", "name of the Dockerfile")
`
111
``
`-
buildCmd.Flags().StringP("tag", "t", "dazzle-built:latest", "tag of the resulting image")
`
112
``
`-
buildCmd.Flags().StringP("repository", "r", "dazzle-work", "name of the Docker repository to work in (e.g. eu.gcr.io/someprj/dazzle-work)")
`
113
``
`-
buildCmd.Flags().String("output-test-xml", "", "save the test results as JUnit XML file")
`
114
``
`-
}
`
115
``
-
116
``
`-
func logBuildResult(res *dazzle.BuildResult) {
`
117
``
`-
if res == nil {
`
118
``
`-
return
`
119
``
`-
}
`
120
``
-
121
``
`-
log.Info("build done")
`
122
``
`-
log.WithField("size", res.BaseImage.Size).Debugf("base layer: %s", res.BaseImage.Ref)
`
123
``
`-
for _, l := range res.Layers {
`
124
``
`-
log.WithField("size", l.Size).WithField("ref", l.Ref).Debugf(" layer %s", l.LayerName)
`
125
``
`-
}
`
126
``
`-
}
`
127
``
-
128
``
`-
func saveTestXMLOutput(res *dazzle.BuildResult, fn string) error {
`
129
``
`-
if res == nil {
`
130
``
`-
return nil
`
131
``
`-
}
`
132
``
-
133
``
`-
var r test.Results
`
134
``
`-
for _, l := range res.Layers {
`
135
``
`-
ltr := l.TestResult
`
136
``
`-
if ltr == nil {
`
137
``
`-
continue
`
138
``
`-
}
`
139
``
-
140
``
`-
for _, tr := range ltr.Result {
`
141
``
`-
ttr := *tr
`
142
``
`-
ttr.Desc = fmt.Sprintf("%s: %s", l.LayerName, tr.Desc)
`
143
``
`-
r.Result = append(r.Result, &ttr)
`
144
``
`-
}
`
145
``
`-
}
`
146
``
-
147
``
`-
fc, err := xml.Marshal(r)
`
148
``
`-
if err != nil {
`
149
``
`-
return err
`
150
``
`-
}
`
151
``
-
152
``
`-
err = ioutil.WriteFile(fn, fc, 0644)
`
153
``
`-
if err != nil {
`
154
``
`-
return err
`
155
``
`-
}
`
156
``
-
157
``
`-
return nil
`
``
63
`+
buildCmd.Flags().String("addr", "unix:///run/buildkit/buildkitd.sock", "address of buildkitd")
`
158
64
`}
`