@@ -67,23 +67,13 @@ function get_or_create_release(tag_1, draft_1, prerelease_1, make_latest_1, rele
6767 return __awaiter(this, arguments, void 0, function* (tag, draft, prerelease, make_latest, release_name, body, octokit, overwrite, promote, target_commit, release_id = 0) {
6868 let release;
6969 try {
70- if (release_id !== 0) {
71- // Draft releases can only be found by ID, not by tag.
72- core.info(`Getting release by id ${release_id}`);
73- release = yield octokit.request(releaseByID, Object.assign(Object.assign({}, repo()), { release_id: release_id }));
74- core.debug(`The release has the following ID: ${release.data.id}`);
75- }
76- else {
77- core.info(`Getting release by tag ${tag}.`);
78- // @ts-ignore
79- release = yield octokit.request(releaseByTag, Object.assign(Object.assign({}, repo()), { tag: tag }));
80- }
70+ release = yield get_release(octokit, tag, release_id);
8171 }
8272 catch (error) {
8373 // If this returns 404, we need to create the release first.
8474 if (error.status !== 404)
8575 throw error;
86- core.info(`Release for tag ${tag} doesn't exist yet so we'll create it now. `);
76+ core.info(`Release for tag ${tag} doesn't exist - creating it `);
8777 if (target_commit) {
8878 try {
8979 yield octokit.request(getRef, Object.assign(Object.assign({}, repo()), { ref: `tags/${tag}` }));
@@ -94,13 +84,43 @@ function get_or_create_release(tag_1, draft_1, prerelease_1, make_latest_1, rele
9484 throw tagError;
9585 }
9686 }
97- // @ts-ignore
98- const _release = yield octokit.request(createRelease, Object.assign(Object.assign({}, repo()), { tag_name: tag, draft: draft, prerelease: prerelease, make_latest: make_latest ? 'true' : 'false', name: release_name, body: body, target_commitish: target_commit }));
99- return _release;
87+ try {
88+ // @ts-ignore
89+ const _release = yield octokit.request(createRelease, Object.assign(Object.assign({}, repo()), { tag_name: tag, draft: draft, prerelease: prerelease, make_latest: make_latest ? 'true' : 'false', name: release_name, body: body, target_commitish: target_commit }));
90+ return _release;
91+ }
92+ catch (create_release_error) {
93+ if (create_release_error.status == 422 &&
94+ create_release_error.response.data.errors[0].code == 'already_exists') {
95+ core.info(`Tried to create a release for tag ${tag}, but it already exists - probably due to race condition between matrix jobs.`);
96+ release = yield get_release(octokit, tag, release_id);
97+ // In this case, we do not throw the error, and we don't return since possibly we want to update it
98+ }
99+ else {
100+ core.setFailed(`Failed to create release for tag ${tag}: ${error.message}`);
101+ throw error;
102+ }
103+ }
100104 }
101105 return yield update_release(promote, release, tag, overwrite, release_name, body, octokit);
102106 });
103107}
108+ /** May throw octokit exceptions */
109+ function get_release(octokit, tag, release_id) {
110+ return __awaiter(this, void 0, void 0, function* () {
111+ if (release_id !== 0) {
112+ // Draft releases can only be found by ID, not by tag.
113+ core.info(`Getting release by id ${release_id}`);
114+ // @ts-ignore
115+ return yield octokit.request(releaseByID, Object.assign(Object.assign({}, repo()), { release_id: release_id }));
116+ }
117+ else {
118+ core.info(`Getting release by tag ${tag}.`);
119+ // @ts-ignore
120+ return yield octokit.request(releaseByTag, Object.assign(Object.assign({}, repo()), { tag: tag }));
121+ }
122+ });
123+ }
104124function update_release(promote, release, tag, overwrite, release_name, body, octokit) {
105125 return __awaiter(this, void 0, void 0, function* () {
106126 let updateObject;
0 commit comments