summaryrefslogtreecommitdiff
path: root/docker
diff options
context:
space:
mode:
authorDan Duvall <dduvall@wikimedia.org>2017-06-14 13:36:07 -0700
committerDan Duvall <dduvall@wikimedia.org>2017-06-15 14:49:01 -0700
commit58c8e9718c97cc7d6dd34f9751f313f51fcc61df (patch)
treeac77486f6e12303bad183ab26518fa705dcc5c31 /docker
parentb6c3ad2aac5263ac7eb7c1c34dcd55075c8fbd04 (diff)
downloadblubber-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.go15
-rw-r--r--docker/compiler_test.go43
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")
+}