ci(release-commenter): unlock issue in order to comment

This commit is contained in:
Elliot DeNolf
2024-09-08 18:55:14 -04:00
parent 59f4d125ab
commit 3dd3f5b135
6 changed files with 154 additions and 62 deletions

View File

@@ -3,7 +3,7 @@
This GitHub Action automatically comments on and/or labels Issues and PRs when a fix is released for them.
> [!IMPORTANT]
> 🍴 Forked version of https://github.comapexskier/github-release-commenter
> 🔧 Heavily modified version of https://github.com/apexskier/github-release-commenter
## Fork Modifications
@@ -12,6 +12,7 @@ This GitHub Action automatically comments on and/or labels Issues and PRs when a
- Better logging
- Moved to pnpm
- Uses @vercel/ncc for packaging
- Comments on locked issues by unlocking then re-locking
## How it works

View File

@@ -33890,13 +33890,13 @@ var releaseTagTemplateRegex = /{release_tag}/g;
(function main() {
var _a, _b, _c;
return __awaiter(this, void 0, void 0, function () {
var payload_1, githubToken, tagFilter, octokit_1, commentTemplate, labelTemplate, skipLabelTemplate, rawReleases, currentTag, releases, regexMatch_1, _d, currentRelease_1, priorRelease, commits, releaseLabel_1, comment, parseLabels, labels, skipLabels_1, linkedIssuesPrs_2, requests, _loop_1, linkedIssuesPrs_1, linkedIssuesPrs_1_1, issueNumber, error_1;
var payload_1, githubToken, tagFilter, octokit_1, commentTemplate, labelTemplate, skipLabelTemplate, rawReleases, currentTag, releases, regexMatch_1, _d, currentRelease_1, priorRelease, commits, releaseLabel_1, comment, parseLabels, labels, skipLabels_1, linkedIssuesPrs_2, requests, _loop_1, linkedIssuesPrs_1, linkedIssuesPrs_1_1, issueNumber, e_1_1, error_1;
var e_1, _e;
var _this = this;
return __generator(this, function (_f) {
switch (_f.label) {
case 0:
_f.trys.push([0, 5, , 6]);
_f.trys.push([0, 13, , 14]);
payload_1 = _actions_github__WEBPACK_IMPORTED_MODULE_1__.context.payload;
githubToken = _actions_core__WEBPACK_IMPORTED_MODULE_0__.getInput('GITHUB_TOKEN');
tagFilter = _actions_core__WEBPACK_IMPORTED_MODULE_0__.getInput('tag-filter') || undefined // Accept tag filter as an input
@@ -34076,59 +34076,118 @@ var releaseTagTemplateRegex = /{release_tag}/g;
.join('\n')));
requests = [];
_loop_1 = function (issueNumber) {
var baseRequest = __assign(__assign({}, _actions_github__WEBPACK_IMPORTED_MODULE_1__.context.repo), { issue_number: issueNumber });
if (comment) {
var request_1 = __assign(__assign({}, baseRequest), { body: comment });
var safeCreateComment = function () { return __awaiter(_this, void 0, void 0, function () {
var error_2;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
_a.trys.push([0, 2, , 3]);
return [4 /*yield*/, octokit_1.rest.issues.createComment(request_1)];
case 1:
_a.sent();
return [3 /*break*/, 3];
case 2:
error_2 = _a.sent();
_actions_core__WEBPACK_IMPORTED_MODULE_0__.error(error_2);
_actions_core__WEBPACK_IMPORTED_MODULE_0__.error("Failed to comment on issue/PR: ".concat(issueNumber, ". ").concat(payload_1.repository.html_url, "/pull/").concat(issueNumber));
return [3 /*break*/, 3];
case 3: return [2 /*return*/];
var baseRequest, commentRequest_1, issue, createCommentPromise, request;
return __generator(this, function (_g) {
switch (_g.label) {
case 0:
baseRequest = __assign(__assign({}, _actions_github__WEBPACK_IMPORTED_MODULE_1__.context.repo), { issue_number: issueNumber });
if (!comment) return [3 /*break*/, 2];
commentRequest_1 = __assign(__assign({}, baseRequest), { body: comment });
return [4 /*yield*/, octokit_1.rest.issues.get(baseRequest)];
case 1:
issue = (_g.sent()).data;
createCommentPromise = void 0;
if (!issue.locked) {
createCommentPromise = function () { return __awaiter(_this, void 0, void 0, function () {
var error_2;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
_a.trys.push([0, 2, , 3]);
return [4 /*yield*/, octokit_1.rest.issues.createComment(commentRequest_1)];
case 1:
_a.sent();
return [3 /*break*/, 3];
case 2:
error_2 = _a.sent();
_actions_core__WEBPACK_IMPORTED_MODULE_0__.error(error_2);
_actions_core__WEBPACK_IMPORTED_MODULE_0__.error("Failed to comment on issue/PR: ".concat(issueNumber, ". ").concat(payload_1.repository.html_url, "/pull/").concat(issueNumber));
return [3 /*break*/, 3];
case 3: return [2 /*return*/];
}
});
}); };
requests.push(createCommentPromise());
}
});
}); };
requests.push(safeCreateComment());
}
if (labels) {
var request = __assign(__assign({}, baseRequest), { labels: labels });
// core.info(JSON.stringify(request, null, 2))
requests.push(octokit_1.rest.issues.addLabels(request));
}
else {
_actions_core__WEBPACK_IMPORTED_MODULE_0__.info("Issue/PR is locked: ".concat(issueNumber, ". Unlocking, commenting, and re-locking. ").concat(payload_1.repository.html_url, "/pull/").concat(issueNumber));
createCommentPromise = function () { return __awaiter(_this, void 0, void 0, function () {
var error_3;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
_a.trys.push([0, 4, , 5]);
_actions_core__WEBPACK_IMPORTED_MODULE_0__.debug("Unlocking issue/PR: ".concat(issueNumber));
return [4 /*yield*/, octokit_1.rest.issues.unlock(baseRequest)];
case 1:
_a.sent();
_actions_core__WEBPACK_IMPORTED_MODULE_0__.debug("Commenting on issue/PR: ".concat(issueNumber));
return [4 /*yield*/, octokit_1.rest.issues.createComment(commentRequest_1)];
case 2:
_a.sent();
_actions_core__WEBPACK_IMPORTED_MODULE_0__.debug("Re-locking issue/PR: ".concat(issueNumber));
return [4 /*yield*/, octokit_1.rest.issues.lock(baseRequest)];
case 3:
_a.sent();
return [3 /*break*/, 5];
case 4:
error_3 = _a.sent();
_actions_core__WEBPACK_IMPORTED_MODULE_0__.error(error_3);
_actions_core__WEBPACK_IMPORTED_MODULE_0__.error("Failed to unlock, comment, and re-lock issue/PR: ".concat(issueNumber, ". ").concat(payload_1.repository.html_url, "/pull/").concat(issueNumber));
return [3 /*break*/, 5];
case 5: return [2 /*return*/];
}
});
}); };
}
requests.push(createCommentPromise());
_g.label = 2;
case 2:
if (labels) {
request = __assign(__assign({}, baseRequest), { labels: labels });
// core.info(JSON.stringify(request, null, 2))
requests.push(octokit_1.rest.issues.addLabels(request));
}
return [2 /*return*/];
}
});
};
try {
for (linkedIssuesPrs_1 = __values(linkedIssuesPrs_2), linkedIssuesPrs_1_1 = linkedIssuesPrs_1.next(); !linkedIssuesPrs_1_1.done; linkedIssuesPrs_1_1 = linkedIssuesPrs_1.next()) {
issueNumber = linkedIssuesPrs_1_1.value;
_loop_1(issueNumber);
}
}
catch (e_1_1) { e_1 = { error: e_1_1 }; }
finally {
try {
if (linkedIssuesPrs_1_1 && !linkedIssuesPrs_1_1.done && (_e = linkedIssuesPrs_1.return)) _e.call(linkedIssuesPrs_1);
}
finally { if (e_1) throw e_1.error; }
}
return [4 /*yield*/, Promise.all(requests)];
_f.label = 4;
case 4:
_f.sent();
return [3 /*break*/, 6];
_f.trys.push([4, 9, 10, 11]);
linkedIssuesPrs_1 = __values(linkedIssuesPrs_2), linkedIssuesPrs_1_1 = linkedIssuesPrs_1.next();
_f.label = 5;
case 5:
if (!!linkedIssuesPrs_1_1.done) return [3 /*break*/, 8];
issueNumber = linkedIssuesPrs_1_1.value;
return [5 /*yield**/, _loop_1(issueNumber)];
case 6:
_f.sent();
_f.label = 7;
case 7:
linkedIssuesPrs_1_1 = linkedIssuesPrs_1.next();
return [3 /*break*/, 5];
case 8: return [3 /*break*/, 11];
case 9:
e_1_1 = _f.sent();
e_1 = { error: e_1_1 };
return [3 /*break*/, 11];
case 10:
try {
if (linkedIssuesPrs_1_1 && !linkedIssuesPrs_1_1.done && (_e = linkedIssuesPrs_1.return)) _e.call(linkedIssuesPrs_1);
}
finally { if (e_1) throw e_1.error; }
return [7 /*endfinally*/];
case 11: return [4 /*yield*/, Promise.all(requests)];
case 12:
_f.sent();
return [3 /*break*/, 14];
case 13:
error_1 = _f.sent();
_actions_core__WEBPACK_IMPORTED_MODULE_0__.error(error_1);
_actions_core__WEBPACK_IMPORTED_MODULE_0__.setFailed(error_1.message);
return [3 /*break*/, 6];
case 6: return [2 /*return*/];
return [3 /*break*/, 14];
case 14: return [2 /*return*/];
}
});
});

View File

@@ -7,7 +7,9 @@
"private": true,
"scripts": {
"clean": "rimraf dist",
"build": "ncc build src/index.ts -t -o dist",
"build": "pnpm build:typecheck && pnpm build:ncc",
"build:ncc": "ncc build src/index.ts -t -o dist",
"build:typecheck": "tsc",
"test": "jest"
},
"dependencies": {

View File

@@ -288,23 +288,50 @@ const releaseTagTemplateRegex = /{release_tag}/g
issue_number: issueNumber,
}
if (comment) {
const request = {
const commentRequest = {
...baseRequest,
body: comment,
}
const safeCreateComment = async () => {
try {
await octokit.rest.issues.createComment(request)
} catch (error) {
core.error(error as Error)
core.error(
`Failed to comment on issue/PR: ${issueNumber}. ${payload.repository.html_url}/pull/${issueNumber}`,
)
// Check if issue is locked or not
const { data: issue } = await octokit.rest.issues.get(baseRequest)
let createCommentPromise: () => Promise<void>
if (!issue.locked) {
createCommentPromise = async () => {
try {
await octokit.rest.issues.createComment(commentRequest)
} catch (error) {
core.error(error as Error)
core.error(
`Failed to comment on issue/PR: ${issueNumber}. ${payload.repository.html_url}/pull/${issueNumber}`,
)
}
}
requests.push(createCommentPromise())
} else {
core.info(
`Issue/PR is locked: ${issueNumber}. Unlocking, commenting, and re-locking. ${payload.repository.html_url}/pull/${issueNumber}`,
)
createCommentPromise = async () => {
try {
core.debug(`Unlocking issue/PR: ${issueNumber}`)
await octokit.rest.issues.unlock(baseRequest)
core.debug(`Commenting on issue/PR: ${issueNumber}`)
await octokit.rest.issues.createComment(commentRequest)
core.debug(`Re-locking issue/PR: ${issueNumber}`)
await octokit.rest.issues.lock(baseRequest)
} catch (error) {
core.error(error as Error)
core.error(
`Failed to unlock, comment, and re-lock issue/PR: ${issueNumber}. ${payload.repository.html_url}/pull/${issueNumber}`,
)
}
}
}
requests.push(safeCreateComment())
requests.push(createCommentPromise())
}
if (labels) {
const request = {

View File

@@ -2,13 +2,14 @@
"compilerOptions": {
"target": "es5",
"lib": ["es2020.string"],
"noEmit": true,
"strict": true,
"noUnusedLocals": true,
"noImplicitReturns": true,
"noFallthroughCasesInSwitch": true,
"forceConsistentCasingInFileNames": true,
"downlevelIteration": true,
"outDir": "./dst"
"skipLibCheck": true,
},
"exclude": ["src/**/*.test.ts"]
}

View File

@@ -3,7 +3,7 @@ name: post-release
on:
release:
types:
# - published
# - published # Re-enable this line for this to work with 2.x releases
- prereleased
workflow_dispatch:
@@ -19,6 +19,8 @@ jobs:
- run: echo "npm_version=$(npm pkg get version | tr -d '"')" >> "$GITHUB_ENV"
- uses: ./.github/actions/release-commenter
continue-on-error: true
env:
ACTIONS_STEP_DEBUG: true
with:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
tag-filter: 'v\d'