Skip to content

Commit 4d9b39a

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

File tree

1 file changed

+43
-27
lines changed

1 file changed

+43
-27
lines changed

internal/push/push.go

Lines changed: 43 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -308,37 +308,53 @@ 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+
defer assetFile.Close()
332+
progressReader := &ioprogress.Reader{
333+
Reader: assetFile,
334+
Size: assetPathStat.Size(),
335+
DrawFunc: ioprogress.DrawTerminalf(os.Stderr, ioprogress.DrawTextFormatBytes),
336+
}
337+
if err != nil {
338+
return errors.Wrap(err, "Error opening release asset.")
339+
}
340+
_, response, err := pushService.uploadReleaseAsset(release, assetPathStat, progressReader)
341+
if err == nil {
342+
return nil
343+
} else {
344+
if githubErrorResponse := new(github.ErrorResponse); errors.As(err, &githubErrorResponse) {
345+
for _, innerError := range githubErrorResponse.Errors {
346+
if innerError.Code == "already_exists" {
347+
log.Warn("Asset already existed.")
348+
return nil
349+
}
350+
}
351+
}
352+
if response == nil || response.StatusCode < 500 || attempt >= 5 {
353+
return err
354+
}
355+
log.Warnf("Attempt %d failed to upload release asset (%s), retrying...", attempt, err.Error())
356+
}
325357
}
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
342358
}
343359

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

0 commit comments

Comments
 (0)