diff --git a/internal/build/build.go b/internal/build/build.go index 7328a573..9e408193 100644 --- a/internal/build/build.go +++ b/internal/build/build.go @@ -464,6 +464,8 @@ func (b *Builder) unMarshallKustomization() (*kustomizev1.Kustomization, error) decoder := k8syaml.NewYAMLOrJSONDecoder(bytes.NewBuffer(data), len(data)) // check for kustomization in yaml with the same name and namespace for { + // ensure the target struct is emptied before decoding + k = &kustomizev1.Kustomization{} err = decoder.Decode(k) if err != nil { if err == io.EOF { diff --git a/internal/build/build_test.go b/internal/build/build_test.go index affc0d69..bf82513f 100644 --- a/internal/build/build_test.go +++ b/internal/build/build_test.go @@ -226,6 +226,16 @@ func Test_unMarshallKustomization(t *testing.T) { } }) } + t.Run("correct parsing of multiple documents", func(t *testing.T) { + b.kustomizationFile = "testdata/local-kustomization/multi-doc-reset.yaml" + ks, err := b.unMarshallKustomization() + if err != nil { + t.Errorf("unexpected err '%s'", err) + } + if len(ks.Spec.Components) > 0 { + t.Errorf("previous Kustomization in file leaked into subsequent Kustomizations") + } + }) } func Test_ResolveKustomization(t *testing.T) { diff --git a/internal/build/testdata/local-kustomization/multi-doc-reset.yaml b/internal/build/testdata/local-kustomization/multi-doc-reset.yaml new file mode 100644 index 00000000..fcbe73b8 --- /dev/null +++ b/internal/build/testdata/local-kustomization/multi-doc-reset.yaml @@ -0,0 +1,18 @@ +apiVersion: kustomize.toolkit.fluxcd.io/v1 +kind: Kustomization +metadata: + name: first + namespace: flux-system +spec: + path: "./k8s/first" + components: + - foo +--- +apiVersion: kustomize.toolkit.fluxcd.io/v1 +kind: Kustomization +metadata: + name: podinfo + namespace: flux-system +spec: + path: "./k8s/second" +---