in shells/abstract.go [210:270]
func (b *AbstractShell) addExtractCacheCommand(
ctx context.Context,
w ShellWriter,
info common.ShellScriptInfo,
cacheFile string,
cacheKeys []string,
cachePaths []string,
) {
cacheKey := cacheKeys[0]
args := []string{
"cache-extractor",
"--file", cacheFile,
"--timeout", strconv.Itoa(info.Build.GetCacheRequestTimeout()),
}
extraArgs, env, err := getCacheDownloadURLAndEnv(ctx, info.Build, cacheKey)
args = append(args, extraArgs...)
if err != nil {
w.Warningf("Failed to obtain environment for cache %s: %v", cacheKey, err)
}
w.Noticef("Checking cache for %s...", cacheKey)
cacheEnvFilename := ""
if env != nil {
cacheEnvFilename = b.writeCacheExports(w, env)
args = append(args, "--env-file", cacheEnvFilename)
}
w.IfCmdWithOutput(info.RunnerCommand, args...)
w.Noticef("Successfully extracted cache")
w.Else()
w.Warningf("Failed to extract cache")
// When extraction fails, remove the cache directories to avoid problems in cases
// where archives may have been partially extracted, leaving the cache in an inconsistent
// state. If we attempt to extract from fallback caches below, we'll remove the same set
// of directories if that fails.
if info.Build.IsFeatureFlagOn(featureflags.CleanUpFailedCacheExtract) {
for _, cachePath := range cachePaths {
w.Printf("Removing %s", cachePath)
w.RmDir(cachePath)
}
}
// We check that there is another key than the one we just used
if len(cacheKeys) > 1 {
_, cacheFile, err := b.cacheFile(info.Build, cacheKeys[1])
if err != nil {
w.Noticef("Skipping cache extraction due to %v", err)
} else {
b.addExtractCacheCommand(ctx, w, info, cacheFile, cacheKeys[1:], cachePaths)
}
}
w.EndIf()
if cacheEnvFilename != "" {
w.RmFile(cacheEnvFilename)
}
}