diff options
author | Dan Duvall <dduvall@wikimedia.org> | 2017-06-14 13:36:07 -0700 |
---|---|---|
committer | Dan Duvall <dduvall@wikimedia.org> | 2017-06-15 14:49:01 -0700 |
commit | 58c8e9718c97cc7d6dd34f9751f313f51fcc61df (patch) | |
tree | ac77486f6e12303bad183ab26518fa705dcc5c31 /docker | |
parent | b6c3ad2aac5263ac7eb7c1c34dcd55075c8fbd04 (diff) | |
download | blubber-58c8e9718c97cc7d6dd34f9751f313f51fcc61df.tar.gz |
Support single-stage builds for older Docker versions
Summary:
Refactored the Docker compiler to omit the stage name (`AS <stage>`)
from the `FROM` instruction when no dependent artifacts are declared.
This allows for use with older versions of Docker that don't support
multi-stage builds.
Test Plan: Run `go test` under the `docker` directory.
Reviewers: thcipriani, mobrovac, hashar, Jrbranaa, mmodell, #release-engineering-team
Reviewed By: mobrovac
Tags: #release-engineering-team
Differential Revision: https://phabricator.wikimedia.org/D684
Diffstat (limited to 'docker')
-rw-r--r-- | docker/compiler.go | 15 | ||||
-rw-r--r-- | docker/compiler_test.go | 43 |
2 files changed, 56 insertions, 2 deletions
diff --git a/docker/compiler.go b/docker/compiler.go index 9f1e5d1..a129ec4 100644 --- a/docker/compiler.go +++ b/docker/compiler.go @@ -13,9 +13,14 @@ func Compile(cfg *config.Config, variant string) *bytes.Buffer { vcfg, err := config.ExpandVariant(cfg, variant) if err == nil { + // omit the main stage name unless multi-stage is required below + mainStage := "" + // write multi-stage sections for each artifact dependency for _, artifact := range vcfg.Artifacts { if artifact.From != "" { + mainStage = variant + dependency, err := config.ExpandVariant(cfg, artifact.From) if err == nil { @@ -24,14 +29,20 @@ func Compile(cfg *config.Config, variant string) *bytes.Buffer { } } - CompileStage(buffer, variant, vcfg) + CompileStage(buffer, mainStage, vcfg) } return buffer } func CompileStage(buffer *bytes.Buffer, stage string, vcfg *config.VariantConfig) { - Writeln(buffer, "FROM ", vcfg.Base, " AS ", stage) + baseAndStage := vcfg.Base + + if stage != "" { + baseAndStage += " AS " + stage + } + + Writeln(buffer, "FROM ", baseAndStage) Writeln(buffer, "USER root") diff --git a/docker/compiler_test.go b/docker/compiler_test.go new file mode 100644 index 0000000..f8b467f --- /dev/null +++ b/docker/compiler_test.go @@ -0,0 +1,43 @@ +package docker_test + +import ( + "testing" + "gopkg.in/stretchr/testify.v1/assert" + + "phabricator.wikimedia.org/source/blubber.git/config" + "phabricator.wikimedia.org/source/blubber.git/docker" +) + +func TestSingleStageHasNoName(t *testing.T) { + cfg, err := config.ReadConfig([]byte(`--- +base: foo/bar +variants: + development: {} +`)) + + assert.Nil(t, err) + + dockerfile := docker.Compile(cfg, "development").String() + + assert.Contains(t, dockerfile, "FROM foo/bar\n") +} + +func TestMultiStageIncludesStageNames(t *testing.T) { + cfg, err := config.ReadConfig([]byte(`--- +base: foo/bar +variants: + build: {} + production: + artifacts: + - from: build + source: . + destination: . +`)) + + assert.Nil(t, err) + + dockerfile := docker.Compile(cfg, "production").String() + + assert.Contains(t, dockerfile, "FROM foo/bar AS build\n") + assert.Contains(t, dockerfile, "FROM foo/bar AS production\n") +} |