Skip to content

์ƒ˜ํ”Œ๋ฐ์ดํ„ฐ ์ถ”๊ฐ€ #91

์ƒ˜ํ”Œ๋ฐ์ดํ„ฐ ์ถ”๊ฐ€

์ƒ˜ํ”Œ๋ฐ์ดํ„ฐ ์ถ”๊ฐ€ #91

name: Issue Close to Discussion TODO
on:
issues:
types: [closed]
permissions:
issues: read
discussions: write
jobs:
check_discussion_todo:
runs-on: ubuntu-latest
steps:
- name: Check TODO in Discussion
uses: actions/github-script@v7
with:
script: |
// 1. ์ด์Šˆ ๋ณธ๋ฌธ์—์„œ Discussion URL, ์ฒดํฌ๋ฐ•์Šค ํ…์ŠคํŠธ ์ถ”์ถœ
const issueBody = context.payload.issue.body;
const discussionUrlMatch = issueBody.match(/\(https:\/\/github\.com\/.+\/discussions\/(\d+)\)/);
if (!discussionUrlMatch) {
console.log("Discussion ๋งํฌ๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.");
return;
}
const discussionNumber = discussionUrlMatch[1];
const todoText = context.payload.issue.title;
// 2. GraphQL๋กœ Discussion ๋ณธ๋ฌธ ์ฝ๊ธฐ
const query = `
query {
repository(owner: "${context.repo.owner}", name: "${context.repo.repo}") {
discussion(number: ${discussionNumber}) {
id
body
}
}
}
`;
const result = await github.graphql(query);
const discussion = result.repository.discussion;
if (!discussion) {
console.log("Discussion์„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.");
return;
}
let newBody = discussion.body;
// 3. ์ฒดํฌ๋ฐ•์Šค ํ…์ŠคํŠธ๋ฅผ [ ] โ†’ [x]๋กœ ๋ณ€๊ฒฝ
const regex = new RegExp(`- \\[ \\] ${todoText}`);
newBody = newBody.replace(regex, `- [x] ${todoText}`);
// 4. GraphQL๋กœ Discussion ๋ณธ๋ฌธ ์ˆ˜์ •
const mutation = `
mutation {
updateDiscussion(input: {discussionId: "${discussion.id}", body: """${newBody}"""}) {
discussion {
id
}
}
}
`;
await github.graphql(mutation);