From 0c72992e431eb57e432cfd8bd4ea0d3b8f2df374 Mon Sep 17 00:00:00 2001 From: Tibor Vass Date: Tue, 16 Oct 2018 18:51:25 +0000 Subject: [PATCH] builder: fix bugs when pruning buildkit cache with filters Only the filters the user specified should be added as cache filters to buildkit. Make an AND operation of the provided filters. ID filter now does prefix-matching. Signed-off-by: Tibor Vass (cherry picked from commit b6137bebb83e886aef906b7ff277778b69616991) Signed-off-by: Tibor Vass Upstream-commit: 52a3c39506b883f713694ce39d1a4fd9f5638800 Component: engine --- .../engine/builder/builder-next/builder.go | 24 ++++++++++++------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/components/engine/builder/builder-next/builder.go b/components/engine/builder/builder-next/builder.go index 12d7a28b10..261803fee5 100644 --- a/components/engine/builder/builder-next/builder.go +++ b/components/engine/builder/builder-next/builder.go @@ -532,20 +532,26 @@ func toBuildkitPruneInfo(opts types.BuildCachePruneOptions) (client.PruneInfo, e bkFilter := make([]string, 0, opts.Filters.Len()) for cacheField := range cacheFields { - values := opts.Filters.Get(cacheField) - switch len(values) { - case 0: - bkFilter = append(bkFilter, cacheField) - case 1: - bkFilter = append(bkFilter, cacheField+"=="+values[0]) - default: - return client.PruneInfo{}, errMultipleFilterValues + if opts.Filters.Include(cacheField) { + values := opts.Filters.Get(cacheField) + switch len(values) { + case 0: + bkFilter = append(bkFilter, cacheField) + case 1: + if cacheField == "id" { + bkFilter = append(bkFilter, cacheField+"~="+values[0]) + } else { + bkFilter = append(bkFilter, cacheField+"=="+values[0]) + } + default: + return client.PruneInfo{}, errMultipleFilterValues + } } } return client.PruneInfo{ All: opts.All, KeepDuration: unusedFor, KeepBytes: opts.KeepStorage, - Filter: bkFilter, + Filter: []string{strings.Join(bkFilter, ",")}, }, nil }