From 87c9ef072d2876ddbba00f3b6e164a0f995b45cd Mon Sep 17 00:00:00 2001 From: gsquared94 Date: Mon, 8 Mar 2021 11:53:12 -0800 Subject: [PATCH] fix: Parsing fails for named multistage dockerfile using build artifact dependency --- pkg/skaffold/docker/dependencies_test.go | 27 ++++++++++++++++++++++++ pkg/skaffold/docker/parse.go | 19 ++++++++--------- 2 files changed, 36 insertions(+), 10 deletions(-) diff --git a/pkg/skaffold/docker/dependencies_test.go b/pkg/skaffold/docker/dependencies_test.go index eefe09a8805..73ca27d55bf 100644 --- a/pkg/skaffold/docker/dependencies_test.go +++ b/pkg/skaffold/docker/dependencies_test.go @@ -63,6 +63,21 @@ FROM nginx ADD *.go *.none /tmp/ ` +const simpleArtifactDependency = ` +ARG BASE +FROM $BASE +COPY worker.go . +` + +const multiStageArtifactDependency = ` +ARG BASE +FROM golang:1.9.2 +COPY worker.go . + +FROM $BASE AS foo +FROM foo as bar +` + const multiStageDockerfile1 = ` FROM golang:1.9.2 WORKDIR /go/src/github.com/r2d4/leeroy/ @@ -325,6 +340,18 @@ func TestGetDependencies(t *testing.T) { workspace: "", expected: []string{"Dockerfile", "server.go", "worker.go"}, }, + { + description: "simple dockerfile with artifact dependency", + dockerfile: simpleArtifactDependency, + workspace: "", + expected: []string{"Dockerfile", "worker.go"}, + }, + { + description: "multistage dockerfile with artifact dependency", + dockerfile: multiStageArtifactDependency, + workspace: "", + expected: []string{"Dockerfile", "worker.go"}, + }, { description: "copy twice", dockerfile: multiCopy, diff --git a/pkg/skaffold/docker/parse.go b/pkg/skaffold/docker/parse.go index 93c9b503d7a..9e00afbe625 100644 --- a/pkg/skaffold/docker/parse.go +++ b/pkg/skaffold/docker/parse.go @@ -214,15 +214,16 @@ func extractCopyCommands(nodes []*parser.Node, onlyLastImage bool, cfg Config) ( switch node.Value { case command.From: from := fromInstruction(node) + if from.as != "" { + // Stage names are case insensitive + stages[strings.ToLower(from.as)] = true + } + if from.image == "" { // some build args like artifact dependencies are not available until the first build sequence has completed. // skip check if there are unavailable images continue } - if from.as != "" { - // Stage names are case insensitive - stages[strings.ToLower(from.as)] = true - } // If `from` references a previous stage, then the `workdir` // was already changed. @@ -324,15 +325,13 @@ func expandOnbuildInstructions(nodes []*parser.Node, cfg Config) ([]*parser.Node expandedNodes = append(expandedNodes, nodes[n:m+1]...) n = m + 1 - if from.image == "" { - // some build args like artifact dependencies are not available until the first build sequence has completed. - // skip check if there are unavailable images - continue - } - var onbuildNodes []*parser.Node if ons, found := onbuildNodesCache[strings.ToLower(from.image)]; found { onbuildNodes = ons + } else if from.image == "" { + // some build args like artifact dependencies are not available until the first build sequence has completed. + // skip check if there are unavailable images + onbuildNodes = []*parser.Node{} } else if ons, err := parseOnbuild(from.image, cfg); err == nil { onbuildNodes = ons } else if warnMsg, ok := sErrors.IsOldImageManifestProblem(err); ok && warnMsg != "" {