in build/gh-release.php [104:164]
function retryUpload($client, $uploadClient, $owner, $repo, $releaseBody, $uploadUrl, $filename)
{
$isSuccessful = false;
$attempts = 0;
$filetype = substr($filename, strpos($filename, '.') + 1);
while (!$isSuccessful && $attempts < MAX_ATTEMPTS) {
try {
$attempts++;
$response = $uploadClient->post("{$uploadUrl}/assets?name={$filename}", [
'headers' => ['Content-Type' => "application/{$filetype}"],
'body' => Psr7\Utils::tryFopen(__DIR__ . "/artifacts/{$filename}", 'r')
]);
echo "{$filename} uploaded to: " . json_decode($response->getBody(), true)['browser_download_url'] . "\n";
$isSuccessful = true;
} catch (\GuzzleHttp\Exception\ServerException $e) {
echo "{$filename} failed to upload:\n";
var_dump($e->getMessage());
// Fetch and inspect assets for failed downloads
$response = $client->get("/repos/{$owner}/{$repo}/releases/{$releaseBody['id']}/assets", []);
$assets = json_decode($response->getBody(), true);
foreach ($assets as $asset) {
// Only successful uploads have a state of 'uploaded'
if ($asset['state'] !== 'uploaded') {
try {
// Failed uploads leave behind a corrupted artifact that must be deleted
$response = $uploadClient->delete("/repos/{$owner}/{$repo}/releases/assets/{$asset['id']}", []);
// Currently the successful 204 will trigger an exception due to response formatting,
// but keeping this in case Github changes their API response
if ($response->getStatusCode() == 204) {
echo "Failed upload of {$asset['name']} at {$asset['browser_download_url']} has successfully been deleted.\n";
} else {
echo "Failed upload of {$asset['name']} at {$asset['browser_download_url']} was unable to be deleted.\n";
}
} catch (\GuzzleHttp\Exception\ClientException $e) {
// Currently expected to generate an exception every time, even for success
$response = $e->getResponse();
if ($response->getStatusCode() == 204) {
echo "Failed upload of {$asset['name']} at {$asset['browser_download_url']} has successfully been deleted.\n";
} else {
echo "Failed upload of {$asset['name']} at {$asset['browser_download_url']} was unable to be deleted.\n";
var_dump($e);
}
}
}
}
}
}
if ($isSuccessful) {
return $attempts;
}
return false;
}