Skip to content

Commit a2f98b6

Browse files
authored
Merge pull request #228 from gitpod-io/pd/CLC-1324
Fix gsutil cache download issue
2 parents cbe3e0f + 1dab993 commit a2f98b6

File tree

2 files changed

+52
-9
lines changed

2 files changed

+52
-9
lines changed

.devcontainer/devcontainer.json

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,14 @@
22
"name": "leeway",
33
"image": "mcr.microsoft.com/devcontainers/base:ubuntu",
44
"features": {
5-
"ghcr.io/devcontainers/features/node:1": {
6-
"version": "lts"
7-
},
8-
"ghcr.io/devcontainers/features/go:1": {
9-
"version": "1.24.0"
10-
},
5+
"ghcr.io/devcontainers/features/node:1": {},
6+
"ghcr.io/devcontainers/features/go:1": {},
117
"ghcr.io/devcontainers/features/common-utils:2": {},
128
"ghcr.io/devcontainers-contrib/features/shfmt:1": {
139
"version": "3.10.0"
14-
}
10+
},
11+
"ghcr.io/dhoeric/features/google-cloud-cli:1": {},
12+
"ghcr.io/devcontainers/features/aws-cli:1": {},
1513
},
1614
"postStartCommand": "./.devcontainer/install-leeway.sh"
1715
}

pkg/leeway/cache/remote/gsutil.go

Lines changed: 47 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -97,20 +97,65 @@ func (rs *GSUtilCache) Download(ctx context.Context, dst cache.LocalCache, pkgs
9797
files []string
9898
dest string
9999
)
100+
type urlPair struct {
101+
gzURL string
102+
tarURL string
103+
}
104+
105+
// Create a list of all possible URLs
106+
var urls []string
107+
packageToURLMap := make(map[cache.Package]urlPair)
100108
for _, pkg := range pkgs {
101109
fn, exists := dst.Location(pkg)
102110
if exists {
103111
continue
104112
}
105-
113+
version, err := pkg.Version()
114+
if err != nil {
115+
log.WithError(err).WithField("package", pkg.FullName()).Warn("Failed to get version for package, skipping")
116+
continue
117+
}
106118
if dest == "" {
107119
dest = filepath.Dir(fn)
108120
} else if dest != filepath.Dir(fn) {
109121
return fmt.Errorf("gsutil only supports one target folder, not %s and %s", dest, filepath.Dir(fn))
110122
}
111123

112-
files = append(files, fmt.Sprintf("gs://%s/%s", rs.BucketName, filepath.Base(fn)))
124+
pair := urlPair{
125+
gzURL: fmt.Sprintf("gs://%s/%s.tar.gz", rs.BucketName, version),
126+
tarURL: fmt.Sprintf("gs://%s/%s.tar", rs.BucketName, version),
127+
}
128+
packageToURLMap[pkg] = pair
129+
urls = append(urls, pair.gzURL, pair.tarURL)
130+
}
131+
if len(urls) == 0 {
132+
return nil
133+
}
134+
135+
args := append([]string{"stat"}, urls...)
136+
cmd := exec.Command("gsutil", args...)
137+
138+
var stdoutBuffer, stderrBuffer strings.Builder
139+
cmd.Stdout = &stdoutBuffer
140+
cmd.Stderr = &stderrBuffer
141+
142+
err := cmd.Run()
143+
if err != nil && (!strings.Contains(stderrBuffer.String(), "No URLs matched")) {
144+
log.Debugf("gsutil stat returned non-zero exit code: [%v], stderr: [%v]", err, stderrBuffer.String())
145+
return fmt.Errorf("failed to check if files exist in remote cache: %w", err)
146+
}
147+
148+
existingURLs := parseGSUtilStatOutput(strings.NewReader(stdoutBuffer.String()))
149+
for _, urls := range packageToURLMap {
150+
if _, exists := existingURLs[urls.gzURL]; exists {
151+
files = append(files, urls.gzURL)
152+
continue
153+
}
154+
if _, exists := existingURLs[urls.tarURL]; exists {
155+
files = append(files, urls.tarURL)
156+
}
113157
}
158+
114159
return gsutilTransfer(dest, files)
115160
}
116161

0 commit comments

Comments
 (0)