forked from buildpacks/lifecycle
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcache.go
75 lines (67 loc) · 2.38 KB
/
cache.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
package lifecycle
import (
"github.com/pkg/errors"
"github.com/buildpacks/lifecycle/platform"
)
func (e *Exporter) Cache(layersDir string, cacheStore Cache) error {
var err error
if !cacheStore.Exists() {
e.Logger.Info("Layer cache not found")
}
origMeta, err := cacheStore.RetrieveMetadata()
if err != nil {
return errors.Wrap(err, "metadata for previous cache")
}
meta := platform.CacheMetadata{}
for _, bp := range e.Buildpacks {
bpDir, err := readBuildpackLayersDir(layersDir, bp, e.Logger)
if err != nil {
return errors.Wrapf(err, "reading layers for buildpack '%s'", bp.ID)
}
bpMD := platform.BuildpackLayersMetadata{
ID: bp.ID,
Version: bp.Version,
Layers: map[string]platform.BuildpackLayerMetadata{},
}
for _, layer := range bpDir.findLayers(forCached) {
layer := layer
if !layer.hasLocalContents() {
e.Logger.Warnf("Failed to cache layer '%s' because it has no contents", layer.Identifier())
continue
}
lmd, err := layer.read()
if err != nil {
e.Logger.Warnf("Failed to cache layer '%s' because of error reading metadata: %s", layer.Identifier(), err)
continue
}
origLayerMetadata := origMeta.MetadataForBuildpack(bp.ID).Layers[layer.name()]
if lmd.SHA, err = e.addOrReuseCacheLayer(cacheStore, &layer, origLayerMetadata.SHA); err != nil {
e.Logger.Warnf("Failed to cache layer '%s': %s", layer.Identifier(), err)
continue
}
bpMD.Layers[layer.name()] = lmd
}
meta.Buildpacks = append(meta.Buildpacks, bpMD)
}
if err := cacheStore.SetMetadata(meta); err != nil {
return errors.Wrap(err, "setting cache metadata")
}
if err := cacheStore.Commit(); err != nil {
return errors.Wrap(err, "committing cache")
}
return nil
}
func (e *Exporter) addOrReuseCacheLayer(cache Cache, layerDir layerDir, previousSHA string) (string, error) {
layer, err := e.LayerFactory.DirLayer(layerDir.Identifier(), layerDir.Path())
if err != nil {
return "", errors.Wrapf(err, "creating layer '%s'", layerDir.Identifier())
}
if layer.Digest == previousSHA {
e.Logger.Infof("Reusing cache layer '%s'\n", layer.ID)
e.Logger.Debugf("Layer '%s' SHA: %s\n", layer.ID, layer.Digest)
return layer.Digest, cache.ReuseLayer(previousSHA)
}
e.Logger.Infof("Adding cache layer '%s'\n", layer.ID)
e.Logger.Debugf("Layer '%s' SHA: %s\n", layer.ID, layer.Digest)
return layer.Digest, cache.AddLayerFile(layer.TarPath, layer.Digest)
}