|
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 <target-ref> <context>", |
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 | }
|
0 commit comments