in shells/abstract.go [390:444]
func (b *AbstractShell) cacheArchiver(w ShellWriter, info common.ShellScriptInfo) error {
for _, cacheOptions := range info.Build.Cache {
// Skip archiving if no cache is defined
cacheKey, cacheFile := b.cacheFile(info.Build, cacheOptions.Key)
if cacheKey == "" {
continue
}
if ok, err := cacheOptions.CheckPolicy(common.CachePolicyPush); err != nil {
return fmt.Errorf("%s for %s", err, cacheKey)
} else if !ok {
w.Notice("Not uploading cache %s due to policy", cacheKey)
continue
}
args := []string{
"cache-archiver",
"--file", cacheFile,
"--timeout", strconv.Itoa(info.Build.GetCacheRequestTimeout()),
}
// Create list of files to archive
archiverArgs := []string{}
for _, path := range cacheOptions.Paths {
archiverArgs = append(archiverArgs, "--path", path)
}
if cacheOptions.Untracked {
archiverArgs = append(archiverArgs, "--untracked")
}
if len(archiverArgs) < 1 {
// Skip creating archive
continue
}
args = append(args, archiverArgs...)
// Generate cache upload address
if url := getCacheUploadURL(info.Build, cacheKey); url != nil {
args = append(args, "--url", url.String())
}
// Execute cache-archiver command. Failure is not fatal.
b.guardRunnerCommand(w, info.RunnerCommand, "Creating cache", func() {
w.Notice("Creating cache %s...", cacheKey)
w.IfCmdWithOutput(info.RunnerCommand, args...)
w.Notice("Created cache")
w.Else()
w.Warning("Failed to create cache")
w.EndIf()
})
}
return nil
}