mirror of
https://github.com/softprops/action-gh-release.git
synced 2025-05-11 19:04:20 +00:00
add 'update_tag' option
This commit is contained in:
parent
c062e08bd5
commit
eb679c5bfa
5 changed files with 69 additions and 8 deletions
|
@ -194,6 +194,7 @@ The following are optional as `step.with` keys
|
||||||
| `generate_release_notes` | Boolean | Whether to automatically generate the name and body for this release. If name is specified, the specified name will be used; otherwise, a name will be automatically generated. If body is specified, the body will be pre-pended to the automatically generated notes. See the [GitHub docs for this feature](https://docs.github.com/en/repositories/releasing-projects-on-github/automatically-generated-release-notes) for more information |
|
| `generate_release_notes` | Boolean | Whether to automatically generate the name and body for this release. If name is specified, the specified name will be used; otherwise, a name will be automatically generated. If body is specified, the body will be pre-pended to the automatically generated notes. See the [GitHub docs for this feature](https://docs.github.com/en/repositories/releasing-projects-on-github/automatically-generated-release-notes) for more information |
|
||||||
| `append_body` | Boolean | Append to existing body instead of overwriting it |
|
| `append_body` | Boolean | Append to existing body instead of overwriting it |
|
||||||
| `make_latest` | String | Specifies whether this release should be set as the latest release for the repository. Drafts and prereleases cannot be set as latest. Can be `true`, `false`, or `legacy`. Uses GitHub api defaults if not provided |
|
| `make_latest` | String | Specifies whether this release should be set as the latest release for the repository. Drafts and prereleases cannot be set as latest. Can be `true`, `false`, or `legacy`. Uses GitHub api defaults if not provided |
|
||||||
|
| `update_tag` | Boolean | Update the tag of the release to the current commit. This will also update the release time. Default is false |
|
||||||
|
|
||||||
💡 When providing a `body` and `body_path` at the same time, `body_path` will be
|
💡 When providing a `body` and `body_path` at the same time, `body_path` will be
|
||||||
attempted first, then falling back on `body` if the path can not be read from.
|
attempted first, then falling back on `body` if the path can not be read from.
|
||||||
|
|
|
@ -49,6 +49,8 @@ inputs:
|
||||||
make_latest:
|
make_latest:
|
||||||
description: "Specifies whether this release should be set as the latest release for the repository. Drafts and prereleases cannot be set as latest. Can be `true`, `false`, or `legacy`. Uses GitHub api default if not provided"
|
description: "Specifies whether this release should be set as the latest release for the repository. Drafts and prereleases cannot be set as latest. Can be `true`, `false`, or `legacy`. Uses GitHub api default if not provided"
|
||||||
required: false
|
required: false
|
||||||
|
update_tag:
|
||||||
|
description: "Update the tag of the release to the current commit. This will also update the release time."
|
||||||
env:
|
env:
|
||||||
GITHUB_TOKEN: "As provided by Github Actions"
|
GITHUB_TOKEN: "As provided by Github Actions"
|
||||||
outputs:
|
outputs:
|
||||||
|
|
2
dist/index.js
vendored
2
dist/index.js
vendored
File diff suppressed because one or more lines are too long
|
@ -66,6 +66,19 @@ export interface Releaser {
|
||||||
owner: string;
|
owner: string;
|
||||||
repo: string;
|
repo: string;
|
||||||
}): AsyncIterableIterator<{ data: Release[] }>;
|
}): AsyncIterableIterator<{ data: Release[] }>;
|
||||||
|
|
||||||
|
createRef(params: {
|
||||||
|
owner: string;
|
||||||
|
repo: string;
|
||||||
|
ref: string;
|
||||||
|
sha: string;
|
||||||
|
}) : Promise<any>;
|
||||||
|
|
||||||
|
deleteRef(params: {
|
||||||
|
owner: string;
|
||||||
|
repo: string;
|
||||||
|
ref: string;
|
||||||
|
}) : Promise<any>;
|
||||||
}
|
}
|
||||||
|
|
||||||
export class GitHubReleaser implements Releaser {
|
export class GitHubReleaser implements Releaser {
|
||||||
|
@ -138,6 +151,23 @@ export class GitHubReleaser implements Releaser {
|
||||||
this.github.rest.repos.listReleases.endpoint.merge(updatedParams),
|
this.github.rest.repos.listReleases.endpoint.merge(updatedParams),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
createRef(params: {
|
||||||
|
owner: string;
|
||||||
|
repo: string;
|
||||||
|
ref: string;
|
||||||
|
sha: string;
|
||||||
|
}) : Promise<any> {
|
||||||
|
return this.github.rest.git.createRef(params);
|
||||||
|
}
|
||||||
|
|
||||||
|
deleteRef(params: {
|
||||||
|
owner: string;
|
||||||
|
repo: string;
|
||||||
|
ref: string;
|
||||||
|
}) : Promise<any> {
|
||||||
|
return this.github.rest.git.deleteRef(params);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export const asset = (path: string): ReleaseAsset => {
|
export const asset = (path: string): ReleaseAsset => {
|
||||||
|
@ -224,18 +254,18 @@ export const release = async (
|
||||||
// so we must find one in the list of all releases
|
// so we must find one in the list of all releases
|
||||||
let _release: Release | undefined = undefined;
|
let _release: Release | undefined = undefined;
|
||||||
if (config.input_draft) {
|
if (config.input_draft) {
|
||||||
for await (const response of releaser.allReleases({
|
for await (const response of releaser.allReleases({
|
||||||
owner,
|
owner,
|
||||||
repo,
|
repo,
|
||||||
})) {
|
})) {
|
||||||
_release = response.data.find((release) => release.tag_name === tag);
|
_release = response.data.find((release) => release.tag_name === tag);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
_release = (
|
_release = (
|
||||||
await releaser.getReleaseByTag({
|
await releaser.getReleaseByTag({
|
||||||
owner,
|
owner,
|
||||||
repo,
|
repo,
|
||||||
tag,
|
tag,
|
||||||
})
|
})
|
||||||
).data;
|
).data;
|
||||||
}
|
}
|
||||||
|
@ -297,6 +327,26 @@ export const release = async (
|
||||||
|
|
||||||
const make_latest = config.input_make_latest;
|
const make_latest = config.input_make_latest;
|
||||||
|
|
||||||
|
if(config.input_update_tag){
|
||||||
|
await releaser.deleteRef({
|
||||||
|
owner,
|
||||||
|
repo,
|
||||||
|
ref: "tags/"+existingRelease.tag_name,
|
||||||
|
});
|
||||||
|
await releaser.createRef({
|
||||||
|
owner,
|
||||||
|
repo,
|
||||||
|
ref: "refs/tags/"+existingRelease.tag_name,
|
||||||
|
sha: config.github_sha
|
||||||
|
})
|
||||||
|
|
||||||
|
console.log(`Updated ref/tags/${existingRelease.tag_name} to ${config.github_sha}`);
|
||||||
|
|
||||||
|
// give github the time to draft the release before updating it
|
||||||
|
// Else, I think we would have a race condition with github to update the release
|
||||||
|
await sleep(2000);
|
||||||
|
}
|
||||||
|
|
||||||
const release = await releaser.updateRelease({
|
const release = await releaser.updateRelease({
|
||||||
owner,
|
owner,
|
||||||
repo,
|
repo,
|
||||||
|
@ -397,3 +447,7 @@ async function createRelease(
|
||||||
return release(config, releaser, maxRetries - 1);
|
return release(config, releaser, maxRetries - 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function sleep(ms) {
|
||||||
|
return new Promise(resolve => setTimeout(resolve, ms));
|
||||||
|
}
|
||||||
|
|
|
@ -4,6 +4,7 @@ import { statSync, readFileSync } from "fs";
|
||||||
export interface Config {
|
export interface Config {
|
||||||
github_token: string;
|
github_token: string;
|
||||||
github_ref: string;
|
github_ref: string;
|
||||||
|
github_sha: string;
|
||||||
github_repository: string;
|
github_repository: string;
|
||||||
// user provided
|
// user provided
|
||||||
input_name?: string;
|
input_name?: string;
|
||||||
|
@ -20,6 +21,7 @@ export interface Config {
|
||||||
input_generate_release_notes?: boolean;
|
input_generate_release_notes?: boolean;
|
||||||
input_append_body?: boolean;
|
input_append_body?: boolean;
|
||||||
input_make_latest: "true" | "false" | "legacy" | undefined;
|
input_make_latest: "true" | "false" | "legacy" | undefined;
|
||||||
|
input_update_tag?: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
export const uploadUrl = (url: string): string => {
|
export const uploadUrl = (url: string): string => {
|
||||||
|
@ -55,6 +57,7 @@ export const parseConfig = (env: Env): Config => {
|
||||||
return {
|
return {
|
||||||
github_token: env.GITHUB_TOKEN || env.INPUT_TOKEN || "",
|
github_token: env.GITHUB_TOKEN || env.INPUT_TOKEN || "",
|
||||||
github_ref: env.GITHUB_REF || "",
|
github_ref: env.GITHUB_REF || "",
|
||||||
|
github_sha: env.GITHUB_SHA || "",
|
||||||
github_repository: env.INPUT_REPOSITORY || env.GITHUB_REPOSITORY || "",
|
github_repository: env.INPUT_REPOSITORY || env.GITHUB_REPOSITORY || "",
|
||||||
input_name: env.INPUT_NAME,
|
input_name: env.INPUT_NAME,
|
||||||
input_tag_name: env.INPUT_TAG_NAME?.trim(),
|
input_tag_name: env.INPUT_TAG_NAME?.trim(),
|
||||||
|
@ -72,6 +75,7 @@ export const parseConfig = (env: Env): Config => {
|
||||||
input_generate_release_notes: env.INPUT_GENERATE_RELEASE_NOTES == "true",
|
input_generate_release_notes: env.INPUT_GENERATE_RELEASE_NOTES == "true",
|
||||||
input_append_body: env.INPUT_APPEND_BODY == "true",
|
input_append_body: env.INPUT_APPEND_BODY == "true",
|
||||||
input_make_latest: parseMakeLatest(env.INPUT_MAKE_LATEST),
|
input_make_latest: parseMakeLatest(env.INPUT_MAKE_LATEST),
|
||||||
|
input_update_tag: env.INPUT_UPDATE_TAG,
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue