From b2bc801cd061304cbeaec6b368ea89b96f439d69 Mon Sep 17 00:00:00 2001 From: Andrea Luzzardi Date: Wed, 24 Feb 2021 15:38:03 -0800 Subject: [PATCH] fix caching issues with Local Signed-off-by: Andrea Luzzardi --- dagger/pipeline.go | 33 ++++++++++++++++++++++++++------- dagger/solver.go | 4 ++++ 2 files changed, 30 insertions(+), 7 deletions(-) diff --git a/dagger/pipeline.go b/dagger/pipeline.go index 84d31681..2a2e17f8 100644 --- a/dagger/pipeline.go +++ b/dagger/pipeline.go @@ -253,14 +253,33 @@ func (p *Pipeline) Local(ctx context.Context, op *compiler.Value) error { return err } } + // FIXME: Remove the `Copy` and use `Local` directly. + // + // Copy'ing is a costly operation which should be unnecessary. + // However, for a mysterious reason, `llb.Local` is returning a different + // digest at every run, therefore invalidating the cache. + // + // By wrapping `llb.Local` inside `llb.Copy`, we get the same digest for + // the same content. + p.fs = p.fs.Change(func(st llb.State) llb.State { + return st.File( + llb.Copy( + llb.Local( + dir, + llb.FollowPaths(include), + llb.WithCustomName(p.vertexNamef("Local %s", dir)), + + // Without hint, multiple `llb.Local` operations on the + // same path get a different digest. + llb.SessionID(p.s.SessionID()), + llb.SharedKeyHint(dir), + ), + "/", + "/", + ), + ) + }) - p.fs = p.fs.Set( - llb.Local( - dir, - llb.FollowPaths(include), - llb.WithCustomName(p.vertexNamef("Local %s", dir)), - ), - ) return nil } diff --git a/dagger/solver.go b/dagger/solver.go index eddac981..c4e6ebf0 100644 --- a/dagger/solver.go +++ b/dagger/solver.go @@ -35,6 +35,10 @@ func (s Solver) Scratch() FS { return s.FS(llb.Scratch()) } +func (s Solver) SessionID() string { + return s.c.BuildOpts().SessionID +} + // Solve will block until the state is solved and returns a Reference. func (s Solver) SolveRequest(ctx context.Context, req bkgw.SolveRequest) (bkgw.Reference, error) { // call solve