Skip to content

Commit d089cfe

Browse files
committed
Add some release asset upload retrying.
1 parent ad03f1e commit d089cfe

File tree

1 file changed

+46
-27
lines changed

1 file changed

+46
-27
lines changed

internal/push/push.go

+46-27
Original file line numberDiff line numberDiff line change
@@ -308,37 +308,56 @@ func (pushService *pushService) uploadReleaseAsset(release *github.RepositoryRel
308308
}
309309

310310
func (pushService *pushService) createOrUpdateReleaseAsset(release *github.RepositoryRelease, existingAssets []*github.ReleaseAsset, assetPathStat os.FileInfo) error {
311-
for _, existingAsset := range existingAssets {
312-
if existingAsset.GetName() == assetPathStat.Name() {
313-
actualSize := int64(existingAsset.GetSize())
314-
expectedSize := assetPathStat.Size()
315-
if actualSize == expectedSize {
316-
return nil
317-
} else {
318-
log.Warnf("Removing existing release asset %s because it was only partially-uploaded (had size %d, but should have been %d)...", existingAsset.GetName(), actualSize, expectedSize)
319-
response, err := pushService.githubEnterpriseClient.Repositories.DeleteReleaseAsset(pushService.ctx, pushService.destinationRepositoryOwner, pushService.destinationRepositoryName, existingAsset.GetID())
320-
if err != nil {
321-
return githubapiutil.EnrichResponseError(response, err, "Error deleting existing release asset.")
311+
attempt := 0
312+
for {
313+
attempt++
314+
for _, existingAsset := range existingAssets {
315+
if existingAsset.GetName() == assetPathStat.Name() {
316+
actualSize := int64(existingAsset.GetSize())
317+
expectedSize := assetPathStat.Size()
318+
if actualSize == expectedSize {
319+
return nil
320+
} else {
321+
log.Warnf("Removing existing release asset %s because it was only partially-uploaded (had size %d, but should have been %d)...", existingAsset.GetName(), actualSize, expectedSize)
322+
response, err := pushService.githubEnterpriseClient.Repositories.DeleteReleaseAsset(pushService.ctx, pushService.destinationRepositoryOwner, pushService.destinationRepositoryName, existingAsset.GetID())
323+
if err != nil {
324+
return githubapiutil.EnrichResponseError(response, err, "Error deleting existing release asset.")
325+
}
322326
}
323327
}
324328
}
329+
log.Debugf("Uploading release asset %s...", assetPathStat.Name())
330+
assetFile, err := os.Open(pushService.cacheDirectory.AssetPath(release.GetTagName(), assetPathStat.Name()))
331+
if err != nil {
332+
return errors.Wrap(err, "Error opening release asset.")
333+
}
334+
defer assetFile.Close()
335+
progressReader := &ioprogress.Reader{
336+
Reader: assetFile,
337+
Size: assetPathStat.Size(),
338+
DrawFunc: ioprogress.DrawTerminalf(os.Stderr, ioprogress.DrawTextFormatBytes),
339+
}
340+
if err != nil {
341+
return errors.Wrap(err, "Error opening release asset.")
342+
}
343+
_, response, err := pushService.uploadReleaseAsset(release, assetPathStat, progressReader)
344+
if err == nil {
345+
return nil
346+
} else {
347+
if githubErrorResponse := new(github.ErrorResponse); errors.As(err, &githubErrorResponse) {
348+
for _, innerError := range githubErrorResponse.Errors {
349+
if innerError.Code == "already_exists" {
350+
log.Warn("Asset already existed.")
351+
return nil
352+
}
353+
}
354+
}
355+
if response == nil || response.StatusCode < 500 || attempt >= 5 {
356+
return err
357+
}
358+
log.Warnf("Attempt %d failed to upload release asset (%s), retrying...", attempt, err.Error())
359+
}
325360
}
326-
log.Debugf("Uploading release asset %s...", assetPathStat.Name())
327-
assetFile, err := os.Open(pushService.cacheDirectory.AssetPath(release.GetTagName(), assetPathStat.Name()))
328-
if err != nil {
329-
return errors.Wrap(err, "Error opening release asset.")
330-
}
331-
defer assetFile.Close()
332-
progressReader := &ioprogress.Reader{
333-
Reader: assetFile,
334-
Size: assetPathStat.Size(),
335-
DrawFunc: ioprogress.DrawTerminalf(os.Stderr, ioprogress.DrawTextFormatBytes),
336-
}
337-
_, response, err := pushService.uploadReleaseAsset(release, assetPathStat, progressReader)
338-
if err != nil {
339-
return githubapiutil.EnrichResponseError(response, err, "Error uploading release asset.")
340-
}
341-
return nil
342361
}
343362

344363
func (pushService *pushService) pushReleases() error {

0 commit comments

Comments
 (0)