Skip to content

Commit 4c785a3

Browse files
author
Andrew Pennebaker
committed
close #6
1 parent 1c06f64 commit 4c785a3

File tree

3 files changed

+68
-25
lines changed

3 files changed

+68
-25
lines changed

cmd/tug/main.go

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ var flagExcludeArch = flag.String("exclude-arch", "", "exclude architecture targ
1717
var flagGetPlatforms = flag.Bool("get-platforms", false, "Get available buildx platforms")
1818
var flagLs = flag.String("ls", "", "List buildx cache for the given image name, of the form name[:tag]")
1919
var flagT = flag.String("t", "", "Docker image name, of the form name[:tag]")
20+
var flagJobs = flag.Int("jobs", 4, "Number of concurrent build jobs. Zero indicates no restriction.")
2021
var flagClean = flag.Bool("clean", false, "Remove junk resources (buildx cache; buildx builder)")
2122
var flagHelp = flag.Bool("help", false, "Show usage information")
2223
var flagVersion = flag.Bool("version", false, "Show version information")
@@ -55,11 +56,6 @@ func main() {
5556
os.Exit(0)
5657
}
5758

58-
if err := tug.EnsureTugBuilder(); err != nil {
59-
fmt.Fprintf(os.Stderr, "%v", err)
60-
os.Exit(1)
61-
}
62-
6359
job, err := tug.NewJob()
6460

6561
if err != nil {
@@ -73,6 +69,7 @@ func main() {
7369
}
7470

7571
job.ImageName = flagT
72+
job.BatchSize = *flagJobs
7673
job.Push = *flagPush
7774
job.OsExclusions = strings.Split(*flagExcludeOS, " ")
7875
job.ArchExclusions = strings.Split(*flagExcludeArch, " ")

job.go

Lines changed: 61 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -41,11 +41,15 @@ type Job struct {
4141
// of the form name[:tag].
4242
ImageName *string
4343

44+
// BatchSize restricts the number of concurrent builds.
45+
// Zero indicates no restriction.
46+
BatchSize int
47+
4448
// Directory denotes the Docker build directory (defaults behavior assumes the current working directory).
4549
Directory string
4650
}
4751

48-
// NewJob generates a default Job.
52+
// NewJob initializes tug and generates a default Job.
4953
func NewJob() (*Job, error) {
5054
platforms, err := AvailablePlatforms()
5155

@@ -62,8 +66,8 @@ func NewJob() (*Job, error) {
6266
return &Job{Builder: TugBuilderName, Platforms: platforms, Directory: cwd}, nil
6367
}
6468

65-
// Run executes a Job.
66-
func (o Job) Run() error {
69+
// runBatch executes a batch of platforms.
70+
func (o Job) runBatch() error {
6771
cmd := exec.Command("docker")
6872
cmd.Env = os.Environ()
6973
cmd.Stderr = os.Stderr
@@ -79,6 +83,39 @@ func (o Job) Run() error {
7983

8084
var platformPairs []string
8185

86+
for _, platform := range o.Platforms {
87+
platformPairs = append(platformPairs, platform.Format())
88+
}
89+
90+
cmd.Args = append(cmd.Args, "--platform")
91+
92+
if o.LoadPlatform == nil {
93+
cmd.Args = append(cmd.Args, strings.Join(platformPairs, ","))
94+
} else {
95+
cmd.Args = append(cmd.Args, *o.LoadPlatform)
96+
cmd.Args = append(cmd.Args, "--load")
97+
}
98+
99+
if o.Push {
100+
cmd.Args = append(cmd.Args, "--push")
101+
}
102+
103+
cmd.Args = append(cmd.Args, "-t")
104+
cmd.Args = append(cmd.Args, *o.ImageName)
105+
106+
cmd.Args = append(cmd.Args, o.Directory)
107+
108+
if o.Debug {
109+
log.Printf("Command: %v\n", cmd)
110+
}
111+
112+
return cmd.Run()
113+
}
114+
115+
// Run schedules builds.
116+
func (o Job) Run() error {
117+
var platforms []Platform
118+
82119
for _, platform := range o.Platforms {
83120
var excludedOs bool
84121

@@ -106,30 +143,35 @@ func (o Job) Run() error {
106143
continue
107144
}
108145

109-
platformPairs = append(platformPairs, platform.Format())
146+
platforms = append(platforms, platform)
110147
}
111148

112-
cmd.Args = append(cmd.Args, "--platform")
149+
o.Platforms = platforms
113150

114-
if o.LoadPlatform == nil {
115-
cmd.Args = append(cmd.Args, strings.Join(platformPairs, ","))
116-
} else {
117-
cmd.Args = append(cmd.Args, *o.LoadPlatform)
118-
cmd.Args = append(cmd.Args, "--load")
119-
}
151+
batchSize := o.BatchSize
120152

121-
if o.Push {
122-
cmd.Args = append(cmd.Args, "--push")
153+
if batchSize == 0 {
154+
return o.runBatch()
123155
}
124156

125-
cmd.Args = append(cmd.Args, "-t")
126-
cmd.Args = append(cmd.Args, *o.ImageName)
157+
var platformGroups [][]Platform
127158

128-
cmd.Args = append(cmd.Args, o.Directory)
159+
for len(o.Platforms) != 0 {
160+
if len(o.Platforms) < batchSize {
161+
batchSize = len(o.Platforms)
162+
}
129163

130-
if o.Debug {
131-
log.Printf("Command: %v\n", cmd)
164+
platformGroups = append(platformGroups, o.Platforms[0:batchSize])
165+
o.Platforms = o.Platforms[batchSize:]
132166
}
133167

134-
return cmd.Run()
168+
for _, platformGroup := range platformGroups {
169+
o.Platforms = platformGroup
170+
171+
if err := o.runBatch(); err != nil {
172+
return err
173+
}
174+
}
175+
176+
return nil
135177
}

platform.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -145,8 +145,12 @@ func EnsureTugBuilder() error {
145145
return EnsureTugBuilderBootstrapped()
146146
}
147147

148-
// AvailablePlatforms reports the available buildx platforms.
148+
// AvailablePlatforms initializes tug and reports the available buildx platforms.
149149
func AvailablePlatforms() ([]Platform, error) {
150+
if err := EnsureTugBuilder(); err != nil {
151+
return nil, err
152+
}
153+
150154
cmd := exec.Command("docker")
151155
cmd.Args = []string{"docker", "buildx", "inspect", TugBuilderName}
152156
cmd.Env = os.Environ()

0 commit comments

Comments
 (0)