Fixes #540 Add support for immutable releases (#544)

This commit is contained in:
Nick Cipollo
2025-08-28 13:15:38 -04:00
committed by GitHub
parent 05013d58ed
commit defcf131e4
12 changed files with 337 additions and 83 deletions

89
dist/index.js vendored
View File

@@ -66,20 +66,7 @@ class Action {
core.notice("Skipping action, release already exists and skipIfReleaseExists is enabled.");
return;
}
const releaseResponse = await this.createOrUpdateRelease();
const releaseData = releaseResponse.data;
const releaseId = releaseData.id;
const uploadUrl = releaseData.upload_url;
if (this.inputs.removeArtifacts) {
await this.artifactDestroyer.destroyArtifacts(releaseId);
}
const artifacts = this.inputs.artifacts;
let assetUrls = {};
if (artifacts.length > 0) {
assetUrls = await this.uploader.uploadArtifacts(artifacts, releaseId, uploadUrl);
}
this.outputs.applyReleaseData(releaseData);
this.outputs.applyAssetUrls(assetUrls);
await this.createOrUpdateRelease();
}
async createOrUpdateRelease() {
if (this.inputs.allowUpdates) {
@@ -88,32 +75,25 @@ class Action {
getResponse = await this.releases.getByTag(this.inputs.tag);
}
catch (error) {
return await this.checkForMissingReleaseError(error);
await this.checkForMissingReleaseError(error);
return;
}
// Fail if this isn't an unreleased release & updateOnlyUnreleased is enabled.
this.releaseValidator.validateReleaseUpdate(getResponse.data);
return await this.updateRelease(getResponse.data.id);
await this.updateRelease(getResponse.data.id);
}
else {
return await this.createRelease();
await this.createRelease();
}
}
async checkForMissingReleaseError(error) {
if (Action.noPublishedRelease(error)) {
return await this.updateDraftOrCreateRelease();
await this.updateDraftOrCreateRelease();
}
else {
throw error;
}
}
async updateRelease(id) {
let releaseBody = this.inputs.updatedReleaseBody;
if (this.inputs.generateReleaseNotes && !this.inputs.omitBodyDuringUpdate) {
const response = await this.releases.generateReleaseNotes(this.inputs.tag);
releaseBody = response.data.body;
}
return await this.releases.update(id, this.inputs.tag, releaseBody, this.inputs.commit, this.inputs.discussionCategory, this.inputs.updatedDraft, this.inputs.makeLatest, this.inputs.updatedReleaseName, this.inputs.updatedPrerelease);
}
static noPublishedRelease(error) {
const githubError = new GithubError_1.GithubError(error);
return githubError.status == 404;
@@ -121,10 +101,10 @@ class Action {
async updateDraftOrCreateRelease() {
const draftReleaseId = await this.findMatchingDraftReleaseId();
if (draftReleaseId) {
return await this.updateRelease(draftReleaseId);
await this.updateRelease(draftReleaseId);
}
else {
return await this.createRelease();
await this.createRelease();
}
}
async findMatchingDraftReleaseId() {
@@ -137,13 +117,60 @@ class Action {
const draftRelease = releases.find((release) => release.draft && release.tag_name == tag);
return draftRelease?.id;
}
async updateRelease(id) {
let releaseBody = this.inputs.updatedReleaseBody;
if (this.inputs.generateReleaseNotes && !this.inputs.omitBodyDuringUpdate) {
const response = await this.releases.generateReleaseNotes(this.inputs.tag);
releaseBody = response.data.body;
}
const releaseResponse = await this.releases.update(id, this.inputs.tag, releaseBody, this.inputs.commit, this.inputs.discussionCategory, this.inputs.updatedDraft, this.inputs.makeLatest, this.inputs.updatedReleaseName, this.inputs.updatedPrerelease);
await this.processReleaseArtifactsAndOutputs(releaseResponse, false);
}
async createRelease() {
let releaseBody = this.inputs.createdReleaseBody;
if (this.inputs.generateReleaseNotes) {
const response = await this.releases.generateReleaseNotes(this.inputs.tag);
releaseBody = response.data.body;
}
return await this.releases.create(this.inputs.tag, releaseBody, this.inputs.commit, this.inputs.discussionCategory, this.inputs.createdDraft, this.inputs.makeLatest, this.inputs.createdReleaseName, this.inputs.createdPrerelease);
// If immutableCreate is enabled we need to start with a draft release
const draft = this.inputs.createdDraft || this.inputs.immutableCreate;
const releaseResponse = await this.releases.create(this.inputs.tag, releaseBody, this.inputs.commit, this.inputs.discussionCategory, draft, this.inputs.makeLatest, this.inputs.createdReleaseName, this.inputs.createdPrerelease);
await this.processReleaseArtifactsAndOutputs(releaseResponse, true);
}
async processReleaseArtifactsAndOutputs(releaseResponse, wasCreated) {
const releaseData = releaseResponse.data;
const releaseId = releaseData.id;
const uploadUrl = releaseData.upload_url;
if (this.inputs.removeArtifacts) {
await this.artifactDestroyer.destroyArtifacts(releaseId);
}
const artifacts = this.inputs.artifacts;
let assetUrls = {};
if (artifacts.length > 0) {
assetUrls = await this.uploader.uploadArtifacts(artifacts, releaseId, uploadUrl);
}
if (wasCreated) {
const immutableRelease = await this.publishImmutableRelease(releaseId);
if (immutableRelease) {
this.setOutputs(immutableRelease.data, assetUrls);
return;
}
}
this.setOutputs(releaseData, assetUrls);
}
async publishImmutableRelease(releaseId) {
// Check if immutableCreate is on and createdDraft is off
if (!this.inputs.immutableCreate || this.inputs.createdDraft) {
return undefined;
}
return await this.releases.update(releaseId, this.inputs.tag, undefined, // body is omitted
undefined, // commit is omitted
this.inputs.discussionCategory, false, // We want to publish the release, set draft to false
this.inputs.makeLatest, this.inputs.createdReleaseName, this.inputs.createdPrerelease);
}
setOutputs(releaseData, assetUrls) {
this.outputs.applyReleaseData(releaseData);
this.outputs.applyAssetUrls(assetUrls);
}
}
exports.Action = Action;
@@ -833,6 +860,10 @@ class CoreInputs {
const generate = core.getInput("generateReleaseNotes");
return generate == "true";
}
get immutableCreate() {
const immutable = core.getInput("immutableCreate");
return immutable != "false";
}
get makeLatest() {
let latest = core.getInput("makeLatest");
if (latest == "true" || latest == "false" || latest == "legacy") {

2
dist/index.js.map vendored

File diff suppressed because one or more lines are too long