refactor(builder): Calculate image cache key only once

This commit is contained in:
Vincent Ambo 2019-09-10 11:13:10 +01:00 committed by Vincent Ambo
parent 4a58b0ab4d
commit 5a002fe067
2 changed files with 15 additions and 17 deletions

View file

@ -110,7 +110,13 @@ func convenienceNames(packages []string) []string {
// Call out to Nix and request that an image be built. Nix will, upon success,
// return a manifest for the container image.
func BuildImage(ctx *context.Context, cfg *config.Config, cache *LocalCache, image *Image, bucket *storage.BucketHandle) (*BuildResult, error) {
resultFile, cached := manifestFromCache(ctx, bucket, cfg.Pkgs, cache, image)
var resultFile string
cached := false
key := cfg.Pkgs.CacheKey(image.Packages, image.Tag)
if key != "" {
resultFile, cached = manifestFromCache(ctx, cache, bucket, key)
}
if !cached {
packages, err := json.Marshal(image.Packages)
@ -158,7 +164,10 @@ func BuildImage(ctx *context.Context, cfg *config.Config, cache *LocalCache, ima
log.Println("Finished Nix image build")
resultFile = strings.TrimSpace(string(stdout))
cacheManifest(ctx, bucket, cfg.Pkgs, cache, image, resultFile)
if key != "" {
cacheManifest(ctx, cache, bucket, key, resultFile)
}
}
buildOutput, err := ioutil.ReadFile(resultFile)

View file

@ -21,7 +21,6 @@ import (
"sync"
"cloud.google.com/go/storage"
"github.com/google/nixery/config"
)
type void struct{}
@ -83,12 +82,7 @@ func (c *LocalCache) localCacheManifest(key, path string) {
// Retrieve a manifest from the cache(s). First the local cache is
// checked, then the GCS-bucket cache.
func manifestFromCache(ctx *context.Context, bucket *storage.BucketHandle, pkgs config.PkgSource, cache *LocalCache, image *Image) (string, bool) {
key := pkgs.CacheKey(image.Packages, image.Tag)
if key == "" {
return "", false
}
func manifestFromCache(ctx *context.Context, cache *LocalCache, bucket *storage.BucketHandle, key string) (string, bool) {
path, cached := cache.manifestFromLocalCache(key)
if cached {
return path, true
@ -118,18 +112,13 @@ func manifestFromCache(ctx *context.Context, bucket *storage.BucketHandle, pkgs
log.Printf("Failed to read cached manifest for '%s': %s\n", key, err)
}
log.Printf("Retrieved manifest for '%s' (%s) from GCS\n", image.Name, key)
log.Printf("Retrieved manifest for sha1:%s from GCS\n", key)
cache.localCacheManifest(key, path)
return path, true
}
func cacheManifest(ctx *context.Context, bucket *storage.BucketHandle, pkgs config.PkgSource, cache *LocalCache, image *Image, path string) {
key := pkgs.CacheKey(image.Packages, image.Tag)
if key == "" {
return
}
func cacheManifest(ctx *context.Context, cache *LocalCache, bucket *storage.BucketHandle, key, path string) {
cache.localCacheManifest(key, path)
obj := bucket.Object("manifests/" + key)
@ -137,7 +126,7 @@ func cacheManifest(ctx *context.Context, bucket *storage.BucketHandle, pkgs conf
f, err := os.Open(path)
if err != nil {
log.Printf("failed to open '%s' manifest for cache upload: %s\n", image.Name, err)
log.Printf("failed to open manifest sha1:%s for cache upload: %s\n", key, err)
return
}
defer f.Close()