@@ -67,23 +67,13 @@ function get_or_create_release(tag_1, draft_1, prerelease_1, make_latest_1, rele
67
67
return __awaiter(this, arguments, void 0, function* (tag, draft, prerelease, make_latest, release_name, body, octokit, overwrite, promote, target_commit, release_id = 0) {
68
68
let release;
69
69
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);
81
71
}
82
72
catch (error) {
83
73
// If this returns 404, we need to create the release first.
84
74
if (error.status !== 404)
85
75
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 `);
87
77
if (target_commit) {
88
78
try {
89
79
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
94
84
throw tagError;
95
85
}
96
86
}
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
+ }
100
104
}
101
105
return yield update_release(promote, release, tag, overwrite, release_name, body, octokit);
102
106
});
103
107
}
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
+ }
104
124
function update_release(promote, release, tag, overwrite, release_name, body, octokit) {
105
125
return __awaiter(this, void 0, void 0, function* () {
106
126
let updateObject;
0 commit comments