From 5e067162bb7477c0b94b588239bc5b9742290879 Mon Sep 17 00:00:00 2001 From: till Date: Mon, 6 May 2024 22:36:41 +0200 Subject: [PATCH] Fix: error handling - refactored the big `if/else` to exit early - added error handling for different errors while creating a release --- src/github.ts | 98 +++++++++++++++++++++++++++++---------------------- 1 file changed, 55 insertions(+), 43 deletions(-) diff --git a/src/github.ts b/src/github.ts index b9c0e1e45..c3dd7a9c1 100644 --- a/src/github.ts +++ b/src/github.ts @@ -281,53 +281,65 @@ export const release = async ( }); return release.data; } catch (error) { - if (error.status === 404) { - const tag_name = tag; - const name = config.input_name || tag; - const body = releaseBody(config); - const draft = config.input_draft; - const prerelease = config.input_prerelease; - const target_commitish = config.input_target_commitish; - const make_latest = config.input_make_latest; - let commitMessage: string = ""; - if (target_commitish) { - commitMessage = ` using commit "${target_commitish}"`; - } - console.log( - `👩‍🏭 Creating new GitHub release for tag ${tag_name}${commitMessage}...` - ); - try { - let release = await releaser.createRelease({ - owner, - repo, - tag_name, - name, - body, - draft, - prerelease, - target_commitish, - discussion_category_name, - generate_release_notes, - make_latest, - }); - return release.data; - } catch (error) { - // presume a race with competing metrix runs - console.log(error.response.data); - console.log( - `⚠️ GitHub release failed with status: ${ - error.status - }\n${JSON.stringify(error.response.data.errors)}\nretrying... (${ - maxRetries - 1 - } retries remaining)` - ); - return release(config, releaser, maxRetries - 1); - } - } else { + if (error.status !== 404) { console.log( `⚠️ Unexpected error fetching GitHub release for tag ${config.github_ref}: ${error}` ); throw error; } + + const tag_name = tag; + const name = config.input_name || tag; + const body = releaseBody(config); + const draft = config.input_draft; + const prerelease = config.input_prerelease; + const target_commitish = config.input_target_commitish; + const make_latest = config.input_make_latest; + let commitMessage: string = ""; + if (target_commitish) { + commitMessage = ` using commit "${target_commitish}"`; + } + console.log( + `👩‍🏭 Creating new GitHub release for tag ${tag_name}${commitMessage}...` + ); + try { + let release = await releaser.createRelease({ + owner, + repo, + tag_name, + name, + body, + draft, + prerelease, + target_commitish, + discussion_category_name, + generate_release_notes, + make_latest, + }); + return release.data; + } catch (error) { + // presume a race with competing matrix runs + console.log(`⚠️ GitHub release failed with status: ${error.status}`); + console.log(`${JSON.stringify(error.response.data)}`); + + switch (error.status) { + case 403: + console.log( + "Skip retry — your GitHub token/PAT does not have the required permission to create a release" + ); + throw error; + + case 404: + console.log("Skip retry - discussion category mismatch"); + throw error; + + case 422: + console.log("Skip retry - validation failed"); + throw error; + } + + console.log(`retrying... (${maxRetries - 1} retries remaining)`); + return release(config, releaser, maxRetries - 1); + } } };