Add rc tag
parent
9b5fe1fd8f
commit
5cdf6d60b5
File diff suppressed because it is too large
Load Diff
@ -1,114 +1,105 @@
|
|||||||
import * as core from '@actions/core';
|
import * as core from "@actions/core";
|
||||||
import { context } from '@actions/github';
|
import { context } from "@actions/github";
|
||||||
import { GitHub } from '@actions/github/lib/utils';
|
import { GitHub } from "@actions/github/lib/utils";
|
||||||
import { HttpClient } from '@actions/http-client';
|
|
||||||
|
|
||||||
interface GitRef {
|
interface GitRef {
|
||||||
ref: string;
|
ref: string;
|
||||||
node_id: string;
|
node_id: string;
|
||||||
|
url: string;
|
||||||
|
object: {
|
||||||
|
type: string;
|
||||||
|
sha: string;
|
||||||
url: string;
|
url: string;
|
||||||
object: {
|
};
|
||||||
type: string;
|
|
||||||
sha: string;
|
|
||||||
url: string;
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
async function findTag(
|
async function findTag(
|
||||||
tag: string,
|
tag: string,
|
||||||
octokitClient: InstanceType<typeof GitHub>
|
octokitClient: InstanceType<typeof GitHub>
|
||||||
): Promise<GitRef | null> {
|
): Promise<GitRef | null> {
|
||||||
try {
|
try {
|
||||||
const { data: foundTag } = await octokitClient.git.getRef({
|
const { data: foundTag } = await octokitClient.git.getRef({
|
||||||
...context.repo,
|
...context.repo,
|
||||||
ref: `tags/${tag}`
|
ref: `tags/${tag}`,
|
||||||
});
|
});
|
||||||
|
|
||||||
return foundTag;
|
return foundTag;
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
if (err.status === 404) {
|
if (err.status === 404) {
|
||||||
return null;
|
return null;
|
||||||
} else {
|
} else {
|
||||||
throw new Error(
|
throw new Error(
|
||||||
`Retrieving refs failed with the following error: ${err}`
|
`Retrieving refs failed with the following error: ${err}`
|
||||||
);
|
);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async function getTagSHA(
|
async function getTagSHA(
|
||||||
tag: string,
|
tag: string,
|
||||||
octokitClient: InstanceType<typeof GitHub>
|
octokitClient: InstanceType<typeof GitHub>
|
||||||
): Promise<string> {
|
): Promise<string> {
|
||||||
const foundTag = await findTag(tag, octokitClient);
|
const foundTag = await findTag(tag, octokitClient);
|
||||||
if (!foundTag) {
|
if (!foundTag) {
|
||||||
throw new Error(
|
throw new Error(`The '${tag}' tag does not exist in the remote repository`);
|
||||||
`The '${tag}' tag does not exist in the remote repository`
|
}
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
return foundTag.object.sha;
|
return foundTag.object.sha;
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function validateIfReleaseIsPublished(
|
export async function validateIfReleaseIsPublished(
|
||||||
tag: string,
|
tag: string,
|
||||||
octokitClient: InstanceType<typeof GitHub>
|
octokitClient: InstanceType<typeof GitHub>
|
||||||
): Promise<void> {
|
): Promise<void> {
|
||||||
try {
|
try {
|
||||||
const { data: foundRelease } = await octokitClient.repos.getReleaseByTag({
|
const { data: foundRelease } = await octokitClient.repos.getReleaseByTag({
|
||||||
...context.repo,
|
...context.repo,
|
||||||
tag,
|
tag,
|
||||||
});
|
});
|
||||||
|
|
||||||
if (foundRelease.prerelease) {
|
if (foundRelease.prerelease) {
|
||||||
throw new Error(
|
throw new Error(
|
||||||
`The '${foundRelease.name}' release is marked as pre-release. Updating tags for pre-release is not supported`
|
`The '${foundRelease.name}' release is marked as pre-release. Updating tags for pre-release is not supported`
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
if (err.status === 404) {
|
if (err.status === 404) {
|
||||||
throw new Error(
|
throw new Error(`No GitHub release found for the ${tag} tag`);
|
||||||
`No GitHub release found for the ${tag} tag`
|
} else {
|
||||||
);
|
throw new Error(
|
||||||
} else {
|
`Retrieving releases failed with the following error: ${err}`
|
||||||
throw new Error(
|
);
|
||||||
`Retrieving releases failed with the following error: ${err}`
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function updateTag(
|
export async function updateTag(
|
||||||
sourceTag: string,
|
sourceTag: string,
|
||||||
targetTag: string,
|
targetTag: string,
|
||||||
octokitClient: InstanceType<typeof GitHub>
|
octokitClient: InstanceType<typeof GitHub>
|
||||||
): Promise<void> {
|
): Promise<void> {
|
||||||
const sourceTagSHA = await getTagSHA(sourceTag, octokitClient);
|
const sourceTagSHA = await getTagSHA(sourceTag, octokitClient);
|
||||||
const foundTargetTag = await findTag(targetTag, octokitClient);
|
const foundTargetTag = await findTag(targetTag, octokitClient);
|
||||||
const refName = `tags/${targetTag}`;
|
const refName = `tags/${targetTag}`;
|
||||||
|
|
||||||
if (foundTargetTag) {
|
if (foundTargetTag) {
|
||||||
core.info(`Updating the '${targetTag}' tag to point to the '${sourceTag}' tag`);
|
core.info(
|
||||||
|
`Updating the '${targetTag}' tag to point to the '${sourceTag}' tag`
|
||||||
|
);
|
||||||
|
|
||||||
await octokitClient.git.updateRef({
|
await octokitClient.git.updateRef({
|
||||||
...context.repo,
|
...context.repo,
|
||||||
ref: refName,
|
ref: refName,
|
||||||
sha: sourceTagSHA,
|
sha: sourceTagSHA,
|
||||||
force: true
|
force: true,
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
core.info(`Creating the '${targetTag}' tag from the '${sourceTag}' tag`);
|
core.info(`Creating the '${targetTag}' tag from the '${sourceTag}' tag`);
|
||||||
|
|
||||||
await octokitClient.git.createRef({
|
await octokitClient.git.createRef({
|
||||||
...context.repo,
|
...context.repo,
|
||||||
ref: `refs/${refName}`,
|
ref: `refs/${refName}`,
|
||||||
sha: sourceTagSHA
|
sha: sourceTagSHA,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function postMessageToSlack(slackWebhook: string, message: string): Promise<void> {
|
|
||||||
const jsonData = {text: message}
|
|
||||||
const http = new HttpClient();
|
|
||||||
await http.postJson(slackWebhook, jsonData);
|
|
||||||
}
|
|
||||||
@ -1,40 +1,39 @@
|
|||||||
import * as core from '@actions/core';
|
import * as core from "@actions/core";
|
||||||
import * as github from '@actions/github';
|
import * as github from "@actions/github";
|
||||||
import { context } from '@actions/github';
|
import { updateTag, validateIfReleaseIsPublished } from "./api-utils";
|
||||||
import { updateTag, validateIfReleaseIsPublished, postMessageToSlack } from './api-utils';
|
import {
|
||||||
import { validateSemverVersionFromTag, getMajorTagFromFullTag } from './version-utils';
|
validateSemverVersionFromTag,
|
||||||
|
getMajorTagFromFullTag,
|
||||||
|
} from "./version-utils";
|
||||||
|
|
||||||
async function run(): Promise<void> {
|
async function run(): Promise<void> {
|
||||||
try {
|
try {
|
||||||
const token = core.getInput('token');
|
const token = core.getInput("token");
|
||||||
const octokitClient = github.getOctokit(token);
|
const octokitClient = github.getOctokit(token);
|
||||||
const sourceTagName = core.getInput('source-tag');
|
const sourceTagName = core.getInput("source-tag");
|
||||||
|
const rc = core.getInput("rc");
|
||||||
|
|
||||||
validateSemverVersionFromTag(sourceTagName);
|
if (rc !== "") {
|
||||||
|
await updateTag(sourceTagName, "rc", octokitClient);
|
||||||
|
|
||||||
await validateIfReleaseIsPublished(sourceTagName, octokitClient);
|
core.setOutput("major-tag", "rc");
|
||||||
|
core.info(`'rc' tag now points to the '${sourceTagName}' tag`);
|
||||||
|
} else {
|
||||||
|
validateSemverVersionFromTag(sourceTagName);
|
||||||
|
|
||||||
const majorTag = getMajorTagFromFullTag(sourceTagName);
|
await validateIfReleaseIsPublished(sourceTagName, octokitClient);
|
||||||
await updateTag(sourceTagName, majorTag, octokitClient);
|
|
||||||
|
|
||||||
core.setOutput('major-tag', majorTag);
|
const majorTag = getMajorTagFromFullTag(sourceTagName);
|
||||||
core.info(`The '${majorTag}' major tag now points to the '${sourceTagName}' tag`);
|
await updateTag(sourceTagName, majorTag, octokitClient);
|
||||||
|
|
||||||
const slackMessage = `The ${majorTag} tag has been successfully updated for the ${context.repo.repo} action to include changes from the ${sourceTagName}`;
|
core.setOutput("major-tag", majorTag);
|
||||||
await reportStatusToSlack(slackMessage);
|
core.info(
|
||||||
} catch (error) {
|
`The '${majorTag}' major tag now points to the '${sourceTagName}' tag`
|
||||||
core.setFailed(error.message);
|
);
|
||||||
|
|
||||||
const slackMessage = `Failed to update a major tag for the ${context.repo.repo} action`;
|
|
||||||
await reportStatusToSlack(slackMessage);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
async function reportStatusToSlack(message: string): Promise<void> {
|
|
||||||
const slackWebhook = core.getInput('slack-webhook');
|
|
||||||
if (slackWebhook) {
|
|
||||||
await postMessageToSlack(slackWebhook, message);
|
|
||||||
}
|
}
|
||||||
|
} catch (error) {
|
||||||
|
core.setFailed(error.message);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
run();
|
run();
|
||||||
|
|||||||
Loading…
Reference in New Issue