From f5c98a7601b8e05bc233fb8ff2ab1a438458d4e7 Mon Sep 17 00:00:00 2001 From: Megan Marsh Date: Mon, 30 Mar 2020 01:31:59 -0700 Subject: [PATCH] make sure cli vars supercede var files (#8964) --- command/build_test.go | 12 +++++++++++- command/meta.go | 8 +++++++- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/command/build_test.go b/command/build_test.go index 63c76f7e7..9d23bb197 100644 --- a/command/build_test.go +++ b/command/build_test.go @@ -32,7 +32,16 @@ func TestBuild_VarArgs(t *testing.T) { }, fileCheck: fileCheck{expected: []string{"apple.txt"}}, }, - + { + name: "json - json varfile sets an apple env var, " + + "override with banana cli var", + args: []string{ + "-var", "fruit=banana", + "-var-file=" + filepath.Join(testFixture("var-arg"), "apple.json"), + filepath.Join(testFixture("var-arg"), "fruit_builder.json"), + }, + fileCheck: fileCheck{expected: []string{"banana.txt"}}, + }, { name: "json - arg sets a pear env var", args: []string{ @@ -401,6 +410,7 @@ func cleanup(moreFiles ...string) { os.RemoveAll("lilas.txt") os.RemoveAll("campanules.txt") os.RemoveAll("ducky.txt") + os.RemoveAll("banana.txt") for _, file := range moreFiles { os.RemoveAll(file) } diff --git a/command/meta.go b/command/meta.go index bdd40883f..72eb44c82 100644 --- a/command/meta.go +++ b/command/meta.go @@ -44,17 +44,23 @@ func (m *Meta) Core(tpl *template.Template) (*packer.Core, error) { config.Template = tpl fj := &kvflag.FlagJSON{} + // First populate fj with contents from var files for _, file := range m.varFiles { err := fj.Set(file) if err != nil { return nil, err } } + // Now read fj values back into flagvars and set as config.Variables. Only + // add to flagVars if the key doesn't already exist, because flagVars comes + // from the command line and should not be overridden by variable files. if m.flagVars == nil { m.flagVars = map[string]string{} } for k, v := range *fj { - m.flagVars[k] = v + if _, exists := m.flagVars[k]; !exists { + m.flagVars[k] = v + } } config.Variables = m.flagVars