Skip to content

Discussion Check to Issue Close #16

Discussion Check to Issue Close

Discussion Check to Issue Close #16

name: Discussion Check to Issue Close
on:
discussion:
types: [edited]
permissions:
issues: write
discussions: read
jobs:
check_discussion_todos:
runs-on: ubuntu-latest
steps:
- name: Check TODO changes and close corresponding issues
uses: actions/github-script@v7
with:
script: |
const discussion = context.payload.discussion;
// ํšŒ์˜๋ก ์นดํ…Œ๊ณ ๋ฆฌ๊ฐ€ ์•„๋‹ˆ๋ฉด ์ข…๋ฃŒ
if (discussion.category.name !== "ํšŒ์˜๋ก") {
console.log("์นดํ…Œ๊ณ ๋ฆฌ๊ฐ€ ํšŒ์˜๋ก์ด ์•„๋‹ˆ๋ฏ€๋กœ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค.");
return;
}
// Discussion ๋ณธ๋ฌธ์—์„œ ์ฒดํฌ๋œ TODO ์ฐพ๊ธฐ
const lines = discussion.body.split('\n');
const checkedTodos = [];
for (const line of lines) {
// ์ฒดํฌ๋œ TODO ์ฐพ๊ธฐ: - [x] ํ…์ŠคํŠธ
const checkedMatch = line.match(/^(\s*)- \[x\] (.+)/);
if (checkedMatch) {
const todoText = checkedMatch[2].trim();
if (todoText) {
checkedTodos.push(todoText);
}
}
}
console.log(`์ฒดํฌ๋œ TODO ๊ฐœ์ˆ˜: ${checkedTodos.length}`);
// ๊ฐ ์ฒดํฌ๋œ TODO์— ๋Œ€ํ•ด ํ•ด๋‹นํ•˜๋Š” ์ด์Šˆ ์ฐพ๊ธฐ ๋ฐ ๋‹ซ๊ธฐ
for (const todoText of checkedTodos) {
try {
// ์ด์Šˆ ๊ฒ€์ƒ‰ (์ œ๋ชฉ์ด TODO ํ…์ŠคํŠธ์™€ ์ผ์น˜ํ•˜๋Š” ๊ฒƒ)
const issues = await github.rest.search.issuesAndPullRequests({
q: `repo:${context.repo.owner}/${context.repo.repo} is:issue is:open "${todoText}"`
});
if (issues.data.items.length > 0) {
// ํ˜„์žฌ Discussion๊ณผ ์—ฐ๊ฒฐ๋œ ์ด์Šˆ ์ฐพ๊ธฐ
let targetIssue = null;
for (const issue of issues.data.items) {
// ๊ณ ์œ  TODO_ID๋กœ ์ •ํ™•ํ•œ ๋งค์นญ
const todoId = `<!-- TODO_ID: ${discussion.id}_${todoText.replace(/[^a-zA-Z0-9]/g, '_')} -->`;
if (issue.body && issue.body.includes(todoId)) {
targetIssue = issue;
break;
}
}
// Discussion ๋งํฌ๊ฐ€ ์žˆ๋Š” ์ด์Šˆ๊ฐ€ ์—†์œผ๋ฉด ์ฒซ ๋ฒˆ์งธ ์ด์Šˆ ์„ ํƒ
if (!targetIssue) {
targetIssue = issues.data.items[0];
console.log(`TODO_ID๊ฐ€ ์ผ์น˜ํ•˜๋Š” ์ด์Šˆ๊ฐ€ ์—†์–ด์„œ ์ฒซ ๋ฒˆ์งธ ์ด์Šˆ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค: #${targetIssue.number}`);
}
// ์ด๋ฏธ ๋‹ซํžŒ ์ด์Šˆ๋Š” ๊ฑด๋„ˆ๋›ฐ๊ธฐ
if (targetIssue.state === 'closed') {
console.log(`์ด์Šˆ #${targetIssue.number}๋Š” ์ด๋ฏธ ๋‹ซํ˜€์žˆ์Šต๋‹ˆ๋‹ค.`);
continue;
}
console.log(`์ด์Šˆ #${targetIssue.number} ๋‹ซ๋Š” ์ค‘: ${todoText}`);
// ์ด์Šˆ ๋‹ซ๊ธฐ
await github.rest.issues.update({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: targetIssue.number,
state: 'closed',
state_reason: 'completed'
});
console.log(`์ด์Šˆ #${targetIssue.number} ๋‹ซ๊ธฐ ์™„๋ฃŒ`);
} else {
console.log(`TODO "${todoText}"์— ํ•ด๋‹นํ•˜๋Š” ์—ด๋ฆฐ ์ด์Šˆ๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.`);
}
} catch (error) {
console.error(`TODO "${todoText}" ์ฒ˜๋ฆฌ ์ค‘ ์˜ค๋ฅ˜:`, error);
}
}