From 942f9a20b0886f7a25e8e931523003a337577d2e Mon Sep 17 00:00:00 2001 From: David Genest Date: Thu, 27 Sep 2018 21:27:11 -0400 Subject: [PATCH] fix first pass rendering crash on syntax error (#374) --- README.md | 2 +- main.go | 14 ++++++++------ main_test.go | 28 +++++++++++++++++++++++++++- 3 files changed, 36 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 6ce02df0..c75711be 100644 --- a/README.md +++ b/README.md @@ -402,7 +402,7 @@ environments: releases: -{{ if (eq .Environment.Name "production" }} +{{ if eq .Environment.Name "production" }} - name: newrelic-agent # snip {{ end }} diff --git a/main.go b/main.go index e09f6d8b..399109f3 100644 --- a/main.go +++ b/main.go @@ -3,16 +3,15 @@ package main import ( "bytes" "fmt" + "io/ioutil" "log" "os" + "os/exec" "os/signal" "path/filepath" "sort" - "syscall" - - "io/ioutil" - "strings" + "syscall" "github.com/roboll/helmfile/args" "github.com/roboll/helmfile/environment" @@ -22,7 +21,6 @@ import ( "github.com/urfave/cli" "go.uber.org/zap" "go.uber.org/zap/zapcore" - "os/exec" ) const ( @@ -726,8 +724,12 @@ func (r *twoPassRenderer) renderEnvironment(content []byte) environment.Environm // parse as much as we can, tolerate errors, this is a preparse yamlBuf, err := firstPassRenderer.RenderTemplateContentToBuffer(content) - if err != nil && logger != nil { + if err != nil && r.logger != nil { r.logger.Debugf("first-pass rendering input of \"%s\":\n%s", r.filename, prependLineNumbers(string(content))) + if yamlBuf == nil { // we have a template syntax error, let the second parse report + r.logger.Debugf("template syntax error: %v", err) + return firstPassEnv + } } c := state.NewCreator(r.logger, r.reader, r.abs) c.Strict = false diff --git a/main_test.go b/main_test.go index a4ed0029..10280219 100644 --- a/main_test.go +++ b/main_test.go @@ -2,10 +2,12 @@ package main import ( "fmt" + "os" "path/filepath" "strings" "testing" + "github.com/roboll/helmfile/helmexec" "github.com/roboll/helmfile/state" "gopkg.in/yaml.v2" ) @@ -16,7 +18,7 @@ func makeRenderer(readFile func(string) ([]byte, error), env string) *twoPassRen env: env, namespace: "namespace", filename: "", - logger: logger, + logger: helmexec.NewLogger(os.Stdout, "debug"), abs: filepath.Abs, } } @@ -228,3 +230,27 @@ func TestReadFromYaml_RenderTemplateWithNamespace(t *testing.T) { t.Errorf("release name should be namespace-myrelease") } } + +func TestReadFromYaml_HelfileShouldBeResilentToTemplateErrors(t *testing.T) { + yamlContent := []byte(`environments: + staging: + production: + +releases: +{{ if (eq .Environment.Name "production" }} # notice syntax error: unclosed left paren +- name: prod-myrelease +{{ else }} +- name: myapp +{{ end }} + chart: mychart +`) + fileReader := func(filename string) ([]byte, error) { + return yamlContent, nil + } + + r := makeRenderer(fileReader, "staging") + _, err := r.renderTemplate(yamlContent) + if err == nil { + t.Fatalf("wanted error, none returned") + } +}