summaryrefslogtreecommitdiff
path: root/config
diff options
context:
space:
mode:
authorDan Duvall <dduvall@wikimedia.org>2017-09-05 17:33:27 -0700
committerDan Duvall <dduvall@wikimedia.org>2017-09-07 10:06:47 -0700
commit62066296380d19dc77ab216cb27100e7e72ff69f (patch)
tree658fcce89b8e18bad2144d99bc8cfef5869b10e8 /config
parent410085e1f5be759b6a2bfbe08a51dca84aa18e3c (diff)
downloadblubber-62066296380d19dc77ab216cb27100e7e72ff69f.tar.gz
Smarter copies/sharedvolume/default behavior
Summary: Defined new abstract `build.Volume` and corresponding `docker.DockerVolume` instructions. Refactored compilation of main `COPY` or `VOLUME` instruction for application files to use the new instructions and moved injection of these instructions out of the compiler and into `VariantConfig`. The latter can be smarter about the following cases: 1. When `copies` is set, simply depend on artifacts for the application files and do not copy anything from the build host. 2. When `sharedvolume` is `true`, inject a `build.Volume` instruction for the application working directory. 3. When neither of the above are set, copy application files from the host. Fixes T174623 Depends on D768 Test Plan: Run `go test ./...`. Run `blubber blubber.example.yaml production` and ensure: 1. The `prep` stage has a `COPY . .` instruction. 2. The final stage has no `COPY . .` instruction, only `COPY --from=prep` instructions. Reviewers: thcipriani, mobrovac, hashar, mmodell, #release-engineering-team Reviewed By: thcipriani, mobrovac, #release-engineering-team Tags: #release-engineering-team Maniphest Tasks: T174623 Differential Revision: https://phabricator.wikimedia.org/D769
Diffstat (limited to 'config')
-rw-r--r--config/variant.go19
-rw-r--r--config/variant_test.go80
2 files changed, 81 insertions, 18 deletions
diff --git a/config/variant.go b/config/variant.go
index cc2cbdb..dea45af 100644
--- a/config/variant.go
+++ b/config/variant.go
@@ -25,7 +25,20 @@ func (vc *VariantConfig) InstructionsForPhase(phase build.Phase) []build.Instruc
ainstructions = append(ainstructions, artifact.InstructionsForPhase(phase)...)
}
- return append(ainstructions, instructions...)
+ instructions = append(ainstructions, instructions...)
+
+ switch phase {
+ case build.PhaseInstall:
+ if vc.Copies == "" {
+ if vc.SharedVolume.True {
+ instructions = append(instructions, build.Volume{vc.Runs.In})
+ } else {
+ instructions = append(instructions, build.Copy{[]string{"."}, "."})
+ }
+ }
+ }
+
+ return instructions
}
func (vc *VariantConfig) VariantDependencies() []string {
@@ -52,8 +65,8 @@ func (vc *VariantConfig) defaultArtifacts() []ArtifactsConfig {
return []ArtifactsConfig{
{
From: vc.Copies,
- Source: vc.CommonConfig.Runs.In,
- Destination: vc.CommonConfig.Runs.In,
+ Source: vc.Runs.In,
+ Destination: vc.Runs.In,
},
{
From: vc.Copies,
diff --git a/config/variant_test.go b/config/variant_test.go
index 0a98828..666b4d7 100644
--- a/config/variant_test.go
+++ b/config/variant_test.go
@@ -45,22 +45,72 @@ func TestVariantDependencies(t *testing.T) {
}
func TestVariantConfigInstructions(t *testing.T) {
- cfg := config.VariantConfig{
- CommonConfig: config.CommonConfig{Runs: config.RunsConfig{In: "/srv/service"}},
- Copies: "foo",
- Artifacts: []config.ArtifactsConfig{
- {From: "build", Source: "/foo/src", Destination: "/foo/dst"},
- },
- }
+ t.Run("PhaseInstall", func(t *testing.T) {
+ t.Run("copies", func(t *testing.T) {
+ cfg := config.VariantConfig{Copies: "foo"}
+
+ assert.Empty(t, cfg.InstructionsForPhase(build.PhaseInstall))
+ })
+
+ t.Run("shared volume", func(t *testing.T) {
+ cfg := config.VariantConfig{}
+ cfg.Runs.In = "/srv/service"
+ cfg.SharedVolume.True = true
+
+ assert.Equal(t,
+ []build.Instruction{
+ build.Volume{"/srv/service"},
+ },
+ cfg.InstructionsForPhase(build.PhaseInstall),
+ )
+ })
+
+ t.Run("standard source copy", func(t *testing.T) {
+ cfg := config.VariantConfig{}
+
+ assert.Equal(t,
+ []build.Instruction{
+ build.Copy{[]string{"."}, "."},
+ },
+ cfg.InstructionsForPhase(build.PhaseInstall),
+ )
+ })
+ })
t.Run("PhasePostInstall", func(t *testing.T) {
- assert.Equal(t,
- []build.Instruction{
- build.CopyFrom{"foo", build.Copy{[]string{"/srv/service"}, "/srv/service"}},
- build.CopyFrom{"foo", build.Copy{[]string{config.LocalLibPrefix}, config.LocalLibPrefix}},
- build.CopyFrom{"build", build.Copy{[]string{"/foo/src"}, "/foo/dst"}},
- },
- cfg.InstructionsForPhase(build.PhasePostInstall),
- )
+ t.Run("for copies and artifacts", func(t *testing.T) {
+ cfg := config.VariantConfig{
+ Copies: "foo",
+ Artifacts: []config.ArtifactsConfig{
+ {From: "build", Source: "/foo/src", Destination: "/foo/dst"},
+ },
+ CommonConfig: config.CommonConfig{Runs: config.RunsConfig{In: "/srv/service"}},
+ }
+
+ assert.Equal(t,
+ []build.Instruction{
+ build.CopyFrom{"foo", build.Copy{[]string{"/srv/service"}, "/srv/service"}},
+ build.CopyFrom{"foo", build.Copy{[]string{config.LocalLibPrefix}, config.LocalLibPrefix}},
+ build.CopyFrom{"build", build.Copy{[]string{"/foo/src"}, "/foo/dst"}},
+ },
+ cfg.InstructionsForPhase(build.PhasePostInstall),
+ )
+ })
+
+ t.Run("for just artifacts", func(t *testing.T) {
+ cfg := config.VariantConfig{
+ Artifacts: []config.ArtifactsConfig{
+ {From: "build", Source: "/foo/src", Destination: "/foo/dst"},
+ },
+ CommonConfig: config.CommonConfig{Runs: config.RunsConfig{In: "/srv/service"}},
+ }
+
+ assert.Equal(t,
+ []build.Instruction{
+ build.CopyFrom{"build", build.Copy{[]string{"/foo/src"}, "/foo/dst"}},
+ },
+ cfg.InstructionsForPhase(build.PhasePostInstall),
+ )
+ })
})
}