Skip to content

Commit 7ad9f1c

Browse files
author
Net Gusto
authored
Merge pull request #36 from ByteArena/fix-assert-docker-version
Assert docker version
2 parents f0e5d57 + 2e0cb74 commit 7ad9f1c

4 files changed

Lines changed: 70 additions & 2 deletions

File tree

LICENSE

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ github.com/mattn/go-isatty https://github.com/mattn/go-
2323
gopkg.in/mattn/go-colorable.v0 https://github.com/mattn/go-colorable/tree/v0.0.9
2424
gopkg.in/mattn/go-isatty.v0 https://github.com/mattn/go-isatty/blob/v0.0.3/LICENSE
2525
gopkg.in/mattn/go-runewidth.v0 https://github.com/mattn/go-runewidth/blob/v0.0.2/LICENSE
26+
github.com/Masterminds/semver https://github.com/Masterminds/semver/blob/v1.4.0/LICENSE.txt
2627

2728
Apache License
2829

glide.lock

Lines changed: 4 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

glide.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,3 +39,5 @@ import:
3939
- package: github.com/dustinkirkland/golang-petname
4040
- package: github.com/asaskevich/EventBus
4141
- package: github.com/bytearena/core
42+
- package: github.com/Masterminds/semver
43+
version: v1.4.0

subcommand/generate/main.go

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,20 @@
11
package generate
22

33
import (
4+
"context"
45
"encoding/json"
56
"fmt"
67
"os"
78
"os/exec"
89
"path"
910

11+
"github.com/Masterminds/semver"
12+
"github.com/docker/docker/client"
1013
petname "github.com/dustinkirkland/golang-petname"
1114
bettererrors "github.com/xtuc/better-errors"
1215

1316
"github.com/bytearena/ba/subcommand/build"
17+
"github.com/bytearena/core/common/dockerfile"
1418
"github.com/bytearena/core/common/types"
1519
)
1620

@@ -133,6 +137,17 @@ func Main(name string) (bool, error) {
133137
return false, berror
134138
}
135139

140+
// assert Docker supports multistaged
141+
assertErr := assertDockerSupportsMultiStageBuild(path.Join(dest, build.DOCKER_BUILD_FILE))
142+
143+
if assertErr != nil {
144+
berror := bettererrors.
145+
New("assert Docker version failed").
146+
With(assertErr)
147+
148+
return false, berror
149+
}
150+
136151
// Build agent
137152
showUsage, err := build.Main(dest)
138153

@@ -146,3 +161,51 @@ func Main(name string) (bool, error) {
146161

147162
return false, nil
148163
}
164+
165+
func assertDockerSupportsMultiStageBuild(dockerfileLocation string) error {
166+
reader, openErr := os.Open(dockerfileLocation)
167+
168+
if openErr != nil {
169+
return bettererrors.NewFromErr(openErr)
170+
}
171+
172+
froms, parseError := dockerfile.DockerfileParserGetFroms(reader)
173+
174+
if parseError != nil {
175+
return bettererrors.NewFromErr(parseError)
176+
}
177+
178+
// Abord here because it's not a multistage-build
179+
if len(froms) == 1 {
180+
return nil
181+
}
182+
183+
cli, clientErr := client.NewEnvClient()
184+
185+
if clientErr != nil {
186+
return bettererrors.NewFromErr(clientErr)
187+
}
188+
189+
serverVersion, getVersionErr := cli.ServerVersion(context.Background())
190+
191+
if getVersionErr != nil {
192+
return bettererrors.NewFromErr(getVersionErr)
193+
}
194+
195+
expectedRange := ">=17.05.0-ce"
196+
semverExpectedRange, _ := semver.NewConstraint(expectedRange)
197+
current, cliVersionError := semver.NewVersion(serverVersion.Version)
198+
199+
if cliVersionError != nil {
200+
return bettererrors.NewFromErr(cliVersionError)
201+
}
202+
203+
if ok, _ := semverExpectedRange.Validate(current); !ok {
204+
return bettererrors.
205+
New("Invalid Docker version").
206+
SetContext("expected", expectedRange).
207+
SetContext("current", serverVersion.Version)
208+
}
209+
210+
return nil
211+
}

0 commit comments

Comments
 (0)