@semantic-release/github
Version:
semantic-release plugin to publish a GitHub release and comment on released Pull Requests/Issues
105 lines (97 loc) • 3.16 kB
JavaScript
import { template } from "lodash-es";
import debugFactory from "debug";
import parseGithubUrl from "./parse-github-url.js";
import { ISSUE_ID, RELEASE_FAIL_LABEL } from "./definitions/constants.js";
import resolveConfig from "./resolve-config.js";
import { toOctokitOptions } from "./octokit.js";
import findSRIssues from "./find-sr-issues.js";
import getFailComment from "./get-fail-comment.js";
const debug = debugFactory("semantic-release:github");
export default async function fail(pluginConfig, context, { Octokit }) {
const {
options: { repositoryUrl },
branch,
errors,
logger,
} = context;
const {
githubToken,
githubUrl,
githubApiPathPrefix,
githubApiUrl,
proxy,
failTitle,
failComment,
failCommentCondition,
labels,
assignees,
} = resolveConfig(pluginConfig, context);
if (failComment === false || failTitle === false) {
logger.log("Skip issue creation.");
logger.warn(
`DEPRECATION: 'false' for 'failComment' or 'failTitle' is deprecated and will be removed in a future major version. Use 'failCommentCondition' instead.`,
);
} else if (failCommentCondition === false) {
logger.log("Skip issue creation.");
} else {
const octokit = new Octokit(
toOctokitOptions({
githubToken,
githubUrl,
githubApiPathPrefix,
githubApiUrl,
proxy,
}),
);
// In case the repo changed name, get the new `repo`/`owner` as the search API will not follow redirects
const { data: repoData } = await octokit.request(
"GET /repos/{owner}/{repo}",
parseGithubUrl(repositoryUrl),
);
const [owner, repo] = repoData.full_name.split("/");
const body = failComment
? template(failComment)({ branch, errors })
: getFailComment(branch, errors);
const [srIssue] = await findSRIssues(
octokit,
logger,
failTitle,
labels,
owner,
repo,
);
const canCommentOnOrCreateIssue = failCommentCondition
? template(failCommentCondition)({ ...context, issue: srIssue })
: true;
if (!canCommentOnOrCreateIssue) {
logger.log("Skip commenting on or creating an issue.");
return;
}
if (srIssue) {
logger.log("Found existing semantic-release issue #%d.", srIssue.number);
const comment = { owner, repo, issue_number: srIssue.number, body };
debug("create comment: %O", comment);
const {
data: { html_url: url },
} = await octokit.request(
"POST /repos/{owner}/{repo}/issues/{issue_number}/comments",
comment,
);
logger.log("Added comment to issue #%d: %s.", srIssue.number, url);
} else {
const newIssue = {
owner,
repo,
title: failTitle,
body: `${body}\n\n${ISSUE_ID}`,
labels: (labels || []).concat([RELEASE_FAIL_LABEL]),
assignees,
};
debug("create issue: %O", newIssue);
const {
data: { html_url: url, number },
} = await octokit.request("POST /repos/{owner}/{repo}/issues", newIssue);
logger.log("Created issue #%d: %s.", number, url);
}
}
}