fix: stages are now resolved correctly if skip-unused

This commit is contained in:
Jordan Goasdoue 2020-05-04 17:51:07 +02:00 committed by goasdoue
parent ae9c9b2813
commit a9c7839491
2 changed files with 15 additions and 8 deletions

View File

@ -575,12 +575,12 @@ func DoBuild(opts *config.KanikoOptions) (v1.Image, error) {
if err != nil { if err != nil {
return nil, err return nil, err
} }
stageNameToIdx := ResolveCrossStageInstructions(stages)
kanikoStages, err := dockerfile.MakeKanikoStages(opts, stages, metaArgs) kanikoStages, err := dockerfile.MakeKanikoStages(opts, stages, metaArgs)
if err != nil { if err != nil {
return nil, err return nil, err
} }
stageNameToIdx := ResolveCrossStageInstructions(kanikoStages)
if err := util.GetExcludedFiles(opts.DockerfilePath, opts.SrcContext); err != nil { if err := util.GetExcludedFiles(opts.DockerfilePath, opts.SrcContext); err != nil {
return nil, err return nil, err
@ -841,9 +841,9 @@ func reviewConfig(stage config.KanikoStage, config *v1.Config) {
} }
} }
// iterates over a list of stages and resolves instructions referring to earlier stages // iterates over a list of KanikoStage and resolves instructions referring to earlier stages
// returns a mapping of stage name to stage id, f.e - ["first": "0", "second": "1", "target": "2"] // returns a mapping of stage name to stage id, f.e - ["first": "0", "second": "1", "target": "2"]
func ResolveCrossStageInstructions(stages []instructions.Stage) map[string]string { func ResolveCrossStageInstructions(stages []config.KanikoStage) map[string]string {
nameToIndex := make(map[string]string) nameToIndex := make(map[string]string)
for i, stage := range stages { for i, stage := range stages {
index := strconv.Itoa(i) index := strconv.Itoa(i)

View File

@ -379,11 +379,11 @@ COPY --from=second /bar /bat
t.Errorf("Failed to parse test dockerfile to stages: %s", err) t.Errorf("Failed to parse test dockerfile to stages: %s", err)
} }
stageNameToIdx := ResolveCrossStageInstructions(testStages)
kanikoStages, err := dockerfile.MakeKanikoStages(opts, testStages, metaArgs) kanikoStages, err := dockerfile.MakeKanikoStages(opts, testStages, metaArgs)
if err != nil { if err != nil {
t.Errorf("Failed to parse stages to Kaniko Stages: %s", err) t.Errorf("Failed to parse stages to Kaniko Stages: %s", err)
} }
stageNameToIdx := ResolveCrossStageInstructions(kanikoStages)
got, err := CalculateDependencies(kanikoStages, opts, stageNameToIdx) got, err := CalculateDependencies(kanikoStages, opts, stageNameToIdx)
if err != nil { if err != nil {
@ -933,11 +933,12 @@ COPY %s bar.txt
if err != nil { if err != nil {
t.Errorf("Failed to parse test dockerfile to stages: %s", err) t.Errorf("Failed to parse test dockerfile to stages: %s", err)
} }
_ = ResolveCrossStageInstructions(testStages)
kanikoStages, err := dockerfile.MakeKanikoStages(opts, testStages, metaArgs) kanikoStages, err := dockerfile.MakeKanikoStages(opts, testStages, metaArgs)
if err != nil { if err != nil {
t.Errorf("Failed to parse stages to Kaniko Stages: %s", err) t.Errorf("Failed to parse stages to Kaniko Stages: %s", err)
} }
_ = ResolveCrossStageInstructions(kanikoStages)
stage := kanikoStages[0] stage := kanikoStages[0]
cmds := stage.Commands cmds := stage.Commands
@ -1008,11 +1009,12 @@ COPY %s bar.txt
if err != nil { if err != nil {
t.Errorf("Failed to parse test dockerfile to stages: %s", err) t.Errorf("Failed to parse test dockerfile to stages: %s", err)
} }
_ = ResolveCrossStageInstructions(testStages)
kanikoStages, err := dockerfile.MakeKanikoStages(opts, testStages, metaArgs) kanikoStages, err := dockerfile.MakeKanikoStages(opts, testStages, metaArgs)
if err != nil { if err != nil {
t.Errorf("Failed to parse stages to Kaniko Stages: %s", err) t.Errorf("Failed to parse stages to Kaniko Stages: %s", err)
} }
_ = ResolveCrossStageInstructions(kanikoStages)
stage := kanikoStages[0] stage := kanikoStages[0]
@ -1333,11 +1335,16 @@ func Test_ResolveCrossStageInstructions(t *testing.T) {
COPY --from=third /hi3 /hi4 COPY --from=third /hi3 /hi4
COPY --from=2 /hi3 /hi4 COPY --from=2 /hi3 /hi4
` `
stages, _, err := dockerfile.Parse([]byte(df)) stages, metaArgs, err := dockerfile.Parse([]byte(df))
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
} }
stageToIdx := ResolveCrossStageInstructions(stages) opts := &config.KanikoOptions{}
kanikoStages, err := dockerfile.MakeKanikoStages(opts, stages, metaArgs)
if err != nil {
t.Fatal(err)
}
stageToIdx := ResolveCrossStageInstructions(kanikoStages)
for index, stage := range stages { for index, stage := range stages {
if index == 0 { if index == 0 {
continue continue