From 8ff225b4c9e536620ab6d54a8ae90eda5fd616a2 Mon Sep 17 00:00:00 2001 From: aneykrap Date: Mon, 29 Jun 2026 16:43:50 +0900 Subject: [PATCH 1/6] =?UTF-8?q?chore:=20pr=20=EB=A6=AC=EB=B7=B0=20?= =?UTF-8?q?=EC=8A=B9=EC=9D=B8=20=EC=8A=AC=EB=9E=99=20=EC=95=8C=EB=9E=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/pr-approval-notify.yml | 154 +++++++++++++++++++++++ 1 file changed, 154 insertions(+) create mode 100644 .github/workflows/pr-approval-notify.yml diff --git a/.github/workflows/pr-approval-notify.yml b/.github/workflows/pr-approval-notify.yml new file mode 100644 index 0000000..bfaa5f9 --- /dev/null +++ b/.github/workflows/pr-approval-notify.yml @@ -0,0 +1,154 @@ + name: PR 승인 완료 Slack 알림 + on: + pull_request_review: + types: [submitted, dismissed] + pull_request: + types: [synchronize] + + permissions: + pull-requests: read + issues: write + + env: + REQUIRED_APPROVALS: "2" + NOTIFIED_LABEL: "slack-approval-notified" + + concurrency: + group: pr-approval-notify-${{ github.event.pull_request.number }} + cancel-in-progress: false + + jobs: + notify: + if: github.event.pull_request.state == 'open' && github.event.pull_request.draft == false + runs-on: ubuntu-latest + + steps: + - name: 승인 상태 확인 및 Slack 알림 전송 + uses: actions/github-script@v8 + env: + SLACK_PR_WEBHOOK_URL: ${{ secrets.SLACK_PR_WEBHOOK_URL }} + SLACK_USER_MAP: ${{ secrets.SLACK_USER_MAP }} + with: + script: | + const { owner, repo } = context.repo; + const pr = context.payload.pull_request; + + const requiredApprovals = Number(process.env.REQUIRED_APPROVALS); + const markerLabel = process.env.NOTIFIED_LABEL; + const webhookUrl = process.env.SLACK_PR_WEBHOOK_URL; + const rawUserMap = process.env.SLACK_USER_MAP; + + if (!webhookUrl) { + throw new Error("Repository Secret 'SLACK_PR_WEBHOOK_URL'이 없습니다."); + } + + if (!rawUserMap) { + throw new Error("Repository Secret 'SLACK_USER_MAP'이 없습니다."); + } + + const reviews = await github.paginate( + github.rest.pulls.listReviews, + { + owner, + repo, + pull_number: pr.number, + per_page: 100 + } + ); + + const latestOpinionByReviewer = new Map(); + + for (const review of reviews) { + const reviewerLogin = review.user?.login; + + if (!reviewerLogin || reviewerLogin === pr.user.login) { + continue; + } + + if ( + ["APPROVED", "CHANGES_REQUESTED", "DISMISSED"] + .includes(review.state) + ) { + latestOpinionByReviewer.set(reviewerLogin, review.state); + } + } + + const approvers = [...latestOpinionByReviewer.entries()] + .filter(([, state]) => state === "APPROVED") + .map(([login]) => login); + + const labels = await github.paginate( + github.rest.issues.listLabelsOnIssue, + { + owner, + repo, + issue_number: pr.number, + per_page: 100 + } + ); + + const alreadyNotified = labels.some( + (label) => label.name === markerLabel + ); + + const approvalsCompleted = + approvers.length >= requiredApprovals; + + if (!approvalsCompleted) { + if (alreadyNotified) { + await github.rest.issues.removeLabel({ + owner, + repo, + issue_number: pr.number, + name: markerLabel + }); + } + + return; + } + + if (alreadyNotified) { + return; + } + + let slackUserMap; + + try { + slackUserMap = JSON.parse(rawUserMap); + } catch { + throw new Error( + "SLACK_USER_MAP은 올바른 JSON 형식이어야 합니다." + ); + } + + const slackMemberId = slackUserMap[pr.user.login]; + + if (!slackMemberId) { + throw new Error( + `SLACK_USER_MAP에 '${pr.user.login}'의 Slack 멤버 ID가 없습니다.` + ); + } + + const text = [ + `<@${slackMemberId}> 리뷰 승인 완료 🧞`, + `<${pr.html_url}|PR 보러가기>` + ].join("\n"); + + const slackResponse = await fetch(webhookUrl, { + method: "POST", + headers: { + "Content-Type": "application/json; charset=utf-8" + }, + body: JSON.stringify({ text }) + }); + + if (!slackResponse.ok) { + throw new Error("Slack 알림 전송에 실패했습니다."); + } + + await github.rest.issues.addLabels({ + owner, + repo, + issue_number: pr.number, + labels: [markerLabel] + }); \ No newline at end of file From 043f0cc179b129600970b9816163d05d24cae6fb Mon Sep 17 00:00:00 2001 From: aneykrap Date: Mon, 29 Jun 2026 16:44:09 +0900 Subject: [PATCH 2/6] =?UTF-8?q?chore:=20pr=20=EB=A8=B8=EC=A7=80=20?= =?UTF-8?q?=EC=8A=AC=EB=9E=99=20=EC=95=8C=EB=9E=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/pr-merged-notify.yml | 41 ++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 .github/workflows/pr-merged-notify.yml diff --git a/.github/workflows/pr-merged-notify.yml b/.github/workflows/pr-merged-notify.yml new file mode 100644 index 0000000..1f3d261 --- /dev/null +++ b/.github/workflows/pr-merged-notify.yml @@ -0,0 +1,41 @@ + name: PR 머지 완료 Slack 알림 + + on: + pull_request: + types: [closed] + + jobs: + notify: + if: github.event.pull_request.merged == true + runs-on: ubuntu-latest + + steps: + - name: Slack 머지 완료 알림 전송 + uses: actions/github-script@v8 + env: + SLACK_PR_WEBHOOK_URL: ${{ secrets.SLACK_PR_WEBHOOK_URL }} + with: + script: | + const pr = context.payload.pull_request; + const webhookUrl = process.env.SLACK_PR_WEBHOOK_URL; + + if (!webhookUrl) { + throw new Error("Repository Secret 'SLACK_PR_WEBHOOK_URL'이 없습니다."); + } + + const text = [ + " PR이 머지되었어요!", + `<${pr.html_url}|PR 보러가기>` + ].join("\n"); + + const slackResponse = await fetch(webhookUrl, { + method: "POST", + headers: { + "Content-Type": "application/json; charset=utf-8" + }, + body: JSON.stringify({ text }) + }); + + if (!slackResponse.ok) { + throw new Error("Slack 알림 전송에 실패했습니다."); + } From f348eeebd0a0051c9811ad7729dce1d286c49efb Mon Sep 17 00:00:00 2001 From: aneykrap Date: Tue, 30 Jun 2026 01:36:23 +0900 Subject: [PATCH 3/6] =?UTF-8?q?chore:=20=EB=93=A4=EC=97=AC=EC=93=B0?= =?UTF-8?q?=EA=B8=B0=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/pr-approval-notify.yml | 282 +++++++++++------------ .github/workflows/pr-merged-notify.yml | 76 +++--- 2 files changed, 179 insertions(+), 179 deletions(-) diff --git a/.github/workflows/pr-approval-notify.yml b/.github/workflows/pr-approval-notify.yml index bfaa5f9..5a59cc9 100644 --- a/.github/workflows/pr-approval-notify.yml +++ b/.github/workflows/pr-approval-notify.yml @@ -1,154 +1,154 @@ - name: PR 승인 완료 Slack 알림 - on: - pull_request_review: - types: [submitted, dismissed] - pull_request: - types: [synchronize] +name: PR 승인 완료 Slack 알림 +on: + pull_request_review: + types: [submitted, dismissed] + pull_request: + types: [synchronize,ready_for_review] - permissions: - pull-requests: read - issues: write +permissions: + pull-requests: read + issues: write - env: - REQUIRED_APPROVALS: "2" - NOTIFIED_LABEL: "slack-approval-notified" +env: + REQUIRED_APPROVALS: "2" + NOTIFIED_LABEL: "slack-approval-notified" - concurrency: - group: pr-approval-notify-${{ github.event.pull_request.number }} - cancel-in-progress: false +concurrency: + group: pr-approval-notify-${{ github.event.pull_request.number }} + cancel-in-progress: false - jobs: - notify: - if: github.event.pull_request.state == 'open' && github.event.pull_request.draft == false - runs-on: ubuntu-latest +jobs: + notify: + if: github.event.pull_request.state == 'open' && github.event.pull_request.draft == false + runs-on: ubuntu-latest - steps: - - name: 승인 상태 확인 및 Slack 알림 전송 - uses: actions/github-script@v8 - env: - SLACK_PR_WEBHOOK_URL: ${{ secrets.SLACK_PR_WEBHOOK_URL }} - SLACK_USER_MAP: ${{ secrets.SLACK_USER_MAP }} - with: - script: | - const { owner, repo } = context.repo; - const pr = context.payload.pull_request; - - const requiredApprovals = Number(process.env.REQUIRED_APPROVALS); - const markerLabel = process.env.NOTIFIED_LABEL; - const webhookUrl = process.env.SLACK_PR_WEBHOOK_URL; - const rawUserMap = process.env.SLACK_USER_MAP; - - if (!webhookUrl) { - throw new Error("Repository Secret 'SLACK_PR_WEBHOOK_URL'이 없습니다."); + steps: + - name: 승인 상태 확인 및 Slack 알림 전송 + uses: actions/github-script@v8 + env: + SLACK_PR_WEBHOOK_URL: ${{ secrets.SLACK_PR_WEBHOOK_URL }} + SLACK_USER_MAP: ${{ secrets.SLACK_USER_MAP }} + with: + script: | + const { owner, repo } = context.repo; + const pr = context.payload.pull_request; + + const requiredApprovals = Number(process.env.REQUIRED_APPROVALS); + const markerLabel = process.env.NOTIFIED_LABEL; + const webhookUrl = process.env.SLACK_PR_WEBHOOK_URL; + const rawUserMap = process.env.SLACK_USER_MAP; + + if (!webhookUrl) { + throw new Error("Repository Secret 'SLACK_PR_WEBHOOK_URL'이 없습니다."); + } + + if (!rawUserMap) { + throw new Error("Repository Secret 'SLACK_USER_MAP'이 없습니다."); + } + + const reviews = await github.paginate( + github.rest.pulls.listReviews, + { + owner, + repo, + pull_number: pr.number, + per_page: 100 } - - if (!rawUserMap) { - throw new Error("Repository Secret 'SLACK_USER_MAP'이 없습니다."); + ); + + const latestOpinionByReviewer = new Map(); + + for (const review of reviews) { + const reviewerLogin = review.user?.login; + + if (!reviewerLogin || reviewerLogin === pr.user.login) { + continue; } - - const reviews = await github.paginate( - github.rest.pulls.listReviews, - { - owner, - repo, - pull_number: pr.number, - per_page: 100 - } - ); - - const latestOpinionByReviewer = new Map(); - - for (const review of reviews) { - const reviewerLogin = review.user?.login; - - if (!reviewerLogin || reviewerLogin === pr.user.login) { - continue; - } - - if ( - ["APPROVED", "CHANGES_REQUESTED", "DISMISSED"] - .includes(review.state) - ) { - latestOpinionByReviewer.set(reviewerLogin, review.state); - } + + if ( + ["APPROVED", "CHANGES_REQUESTED", "DISMISSED"] + .includes(review.state) + ) { + latestOpinionByReviewer.set(reviewerLogin, review.state); } - - const approvers = [...latestOpinionByReviewer.entries()] - .filter(([, state]) => state === "APPROVED") - .map(([login]) => login); - - const labels = await github.paginate( - github.rest.issues.listLabelsOnIssue, - { + } + + const approvers = [...latestOpinionByReviewer.entries()] + .filter(([, state]) => state === "APPROVED") + .map(([login]) => login); + + const labels = await github.paginate( + github.rest.issues.listLabelsOnIssue, + { + owner, + repo, + issue_number: pr.number, + per_page: 100 + } + ); + + const alreadyNotified = labels.some( + (label) => label.name === markerLabel + ); + + const approvalsCompleted = + approvers.length >= requiredApprovals; + + if (!approvalsCompleted) { + if (alreadyNotified) { + await github.rest.issues.removeLabel({ owner, repo, issue_number: pr.number, - per_page: 100 - } + name: markerLabel + }); + } + + return; + } + + if (alreadyNotified) { + return; + } + + let slackUserMap; + + try { + slackUserMap = JSON.parse(rawUserMap); + } catch { + throw new Error( + "SLACK_USER_MAP은 올바른 JSON 형식이어야 합니다." ); - - const alreadyNotified = labels.some( - (label) => label.name === markerLabel + } + + const slackMemberId = slackUserMap[pr.user.login]; + + if (!slackMemberId) { + throw new Error( + `SLACK_USER_MAP에 '${pr.user.login}'의 Slack 멤버 ID가 없습니다.` ); - - const approvalsCompleted = - approvers.length >= requiredApprovals; - - if (!approvalsCompleted) { - if (alreadyNotified) { - await github.rest.issues.removeLabel({ - owner, - repo, - issue_number: pr.number, - name: markerLabel - }); - } - - return; - } - - if (alreadyNotified) { - return; - } - - let slackUserMap; - - try { - slackUserMap = JSON.parse(rawUserMap); - } catch { - throw new Error( - "SLACK_USER_MAP은 올바른 JSON 형식이어야 합니다." - ); - } - - const slackMemberId = slackUserMap[pr.user.login]; - - if (!slackMemberId) { - throw new Error( - `SLACK_USER_MAP에 '${pr.user.login}'의 Slack 멤버 ID가 없습니다.` - ); - } - - const text = [ - `<@${slackMemberId}> 리뷰 승인 완료 🧞`, - `<${pr.html_url}|PR 보러가기>` - ].join("\n"); - - const slackResponse = await fetch(webhookUrl, { - method: "POST", - headers: { - "Content-Type": "application/json; charset=utf-8" - }, - body: JSON.stringify({ text }) - }); - - if (!slackResponse.ok) { - throw new Error("Slack 알림 전송에 실패했습니다."); - } - - await github.rest.issues.addLabels({ - owner, - repo, - issue_number: pr.number, - labels: [markerLabel] - }); \ No newline at end of file + } + + const text = [ + `<@${slackMemberId}> 리뷰 승인 완료 🧞`, + `<${pr.html_url}|PR 보러가기>` + ].join("\n"); + + const slackResponse = await fetch(webhookUrl, { + method: "POST", + headers: { + "Content-Type": "application/json; charset=utf-8" + }, + body: JSON.stringify({ text }) + }); + + if (!slackResponse.ok) { + throw new Error("Slack 알림 전송에 실패했습니다."); + } + + await github.rest.issues.addLabels({ + owner, + repo, + issue_number: pr.number, + labels: [markerLabel] + }); \ No newline at end of file diff --git a/.github/workflows/pr-merged-notify.yml b/.github/workflows/pr-merged-notify.yml index 1f3d261..d9b76bb 100644 --- a/.github/workflows/pr-merged-notify.yml +++ b/.github/workflows/pr-merged-notify.yml @@ -1,41 +1,41 @@ - name: PR 머지 완료 Slack 알림 +name: PR 머지 완료 Slack 알림 - on: - pull_request: - types: [closed] +on: + pull_request: + types: [closed] - jobs: - notify: - if: github.event.pull_request.merged == true - runs-on: ubuntu-latest +jobs: + notify: + if: github.event.pull_request.merged == true + runs-on: ubuntu-latest - steps: - - name: Slack 머지 완료 알림 전송 - uses: actions/github-script@v8 - env: - SLACK_PR_WEBHOOK_URL: ${{ secrets.SLACK_PR_WEBHOOK_URL }} - with: - script: | - const pr = context.payload.pull_request; - const webhookUrl = process.env.SLACK_PR_WEBHOOK_URL; - - if (!webhookUrl) { - throw new Error("Repository Secret 'SLACK_PR_WEBHOOK_URL'이 없습니다."); - } - - const text = [ - " PR이 머지되었어요!", - `<${pr.html_url}|PR 보러가기>` - ].join("\n"); - - const slackResponse = await fetch(webhookUrl, { - method: "POST", - headers: { - "Content-Type": "application/json; charset=utf-8" - }, - body: JSON.stringify({ text }) - }); - - if (!slackResponse.ok) { - throw new Error("Slack 알림 전송에 실패했습니다."); - } + steps: + - name: Slack 머지 완료 알림 전송 + uses: actions/github-script@v8 + env: + SLACK_PR_WEBHOOK_URL: ${{ secrets.SLACK_PR_WEBHOOK_URL }} + with: + script: | + const pr = context.payload.pull_request; + const webhookUrl = process.env.SLACK_PR_WEBHOOK_URL; + + if (!webhookUrl) { + throw new Error("Repository Secret 'SLACK_PR_WEBHOOK_URL'이 없습니다."); + } + + const text = [ + " PR이 머지되었어요!", + `<${pr.html_url}|PR 보러가기>` + ].join("\n"); + + const slackResponse = await fetch(webhookUrl, { + method: "POST", + headers: { + "Content-Type": "application/json; charset=utf-8" + }, + body: JSON.stringify({ text }) + }); + + if (!slackResponse.ok) { + throw new Error("Slack 알림 전송에 실패했습니다."); + } From 079184d45c45f65afea4d406f483495580f5517a Mon Sep 17 00:00:00 2001 From: aneykrap Date: Tue, 30 Jun 2026 01:37:36 +0900 Subject: [PATCH 4/6] =?UTF-8?q?comment=20:=20=EB=9D=BC=EB=B2=A8=EB=A7=81?= =?UTF-8?q?=20=EC=A0=84=EC=B2=B4=20=EC=A3=BC=EC=84=9D=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/auto-label.yml | 237 +++++++++++++++---------------- 1 file changed, 118 insertions(+), 119 deletions(-) diff --git a/.github/workflows/auto-label.yml b/.github/workflows/auto-label.yml index 335d22d..e03a2fd 100644 --- a/.github/workflows/auto-label.yml +++ b/.github/workflows/auto-label.yml @@ -1,119 +1,118 @@ -name: Auto Label - -on: - issues: - types: [opened, edited] - pull_request_target: - types: [opened, edited, reopened, synchronize] - -permissions: - issues: write - -jobs: - label: - runs-on: ubuntu-latest - steps: - - uses: actions/github-script@f28e40c7f34bde8b3046d885e986cb6290c5673b - with: - script: | - const isIssue = context.eventName === 'issues'; - const item = isIssue - ? context.payload.issue - : context.payload.pull_request; - - const title = item.title.toLowerCase(); - const body = (item.body || '').toLowerCase(); - const author = item.user.login; - - const labels = new Set(); - - const titleRules = [ - { - label: '✨ feat', - patterns: [/\[feat\]/, /(?:^|[^a-z0-9])feat:/] - }, - { - label: '🛠️ fix', - patterns: [/\[fix\]/, /(?:^|[^a-z0-9])fix:/] - }, - { - label: '🚨 hotfix', - patterns: [/\[hotfix\]/, /(?:^|[^a-z0-9])hotfix:/] - }, - { - label: '📃 docs', - patterns: [/\[docs\]/, /(?:^|[^a-z0-9])docs:/] - }, - { - label: '🔁 refactor', - patterns: [/\[refactor\]/, /(?:^|[^a-z0-9])refactor:/] - }, - { - label: '📝 chore', - patterns: [/\[chore\]/, /(?:^|[^a-z0-9])chore:/] - }, - { - label: '🧪 test', - patterns: [/\[test\]/, /(?:^|[^a-z0-9])test:/] - }, - { - label: '✏️ style', - patterns: [/\[style\]/, /(?:^|[^a-z0-9])style:/] - }, - { - label: '✒️ comment', - patterns: [/\[comment\]/, /(?:^|[^a-z0-9])comment:/] - }, - { - label: '📄 rename', - patterns: [/\[rename\]/, /(?:^|[^a-z0-9])rename:/] - }, - { - label: '♻️ remove', - patterns: [/\[remove\]/, /(?:^|[^a-z0-9])remove:/] - } - ]; - - for (const rule of titleRules) { - if (rule.patterns.some(pattern => pattern.test(title))) { - labels.add(rule.label); - } - } - - const authorLabels = { - 'Jy000n': '🌸 자윤', - 'aneykrap': '🌵 예나', - 'laura-jung': '🍀️ 윤아' - }; - - const managedLabels = new Set([ - ...titleRules.map(rule => rule.label), - ...Object.values(authorLabels) - ]); - - if (authorLabels[author]) { - labels.add(authorLabels[author]); - } - - const currentLabels = (item.labels || []).map(label => label.name || label); - const labelsToRemove = currentLabels.filter(label => managedLabels.has(label)); - - await Promise.all(labelsToRemove.map(label => github.rest.issues.removeLabel({ - owner: context.repo.owner, - repo: context.repo.repo, - issue_number: item.number, - name: label - }).catch(error => { - if (error.status !== 404) { - throw error; - } - }))); - - if (labels.size > 0) { - await github.rest.issues.addLabels({ - owner: context.repo.owner, - repo: context.repo.repo, - issue_number: item.number, - labels: [...labels] - }); - } +#name: Auto Label +# +#on: +# issues: +# types: [opened, edited] +# pull_request_target: +# types: [opened, edited, reopened, synchronize] +# +#permissions: +# issues: write +# +#jobs: +# label: +# runs-on: ubuntu-latest +# steps: +# - uses: actions/github-script@f28e40c7f34bde8b3046d885e986cb6290c5673b +# with: +# script: | +# const isIssue = context.eventName === 'issues'; +# const item = isIssue +# ? context.payload.issue +# : context.payload.pull_request; +# +# const title = item.title.toLowerCase(); +# const body = (item.body || '').toLowerCase(); +# const author = item.user.login; +# +# const labels = new Set(); +# +# const titleRules = [ +# { +# label: '✨ feat', +# patterns: [/\[feat\]/, /(?:^|[^a-z0-9])feat:/] +# }, +# { +# label: '🛠️ fix', +# patterns: [/\[fix\]/, /(?:^|[^a-z0-9])fix:/] +# }, +# { +# label: '🚨 hotfix', +# patterns: [/\[hotfix\]/, /(?:^|[^a-z0-9])hotfix:/] +# }, +# { +# label: '📃 docs', +# patterns: [/\[docs\]/, /(?:^|[^a-z0-9])docs:/] +# }, +# { +# label: '🔁 refactor', +# patterns: [/\[refactor\]/, /(?:^|[^a-z0-9])refactor:/] +# }, +# { +# label: '📝 chore', +# patterns: [/\[chore\]/, /(?:^|[^a-z0-9])chore:/] +# }, +# { +# label: '🧪 test', +# patterns: [/\[test\]/, /(?:^|[^a-z0-9])test:/] +# }, +# { +# label: '✏️ style', +# patterns: [/\[style\]/, /(?:^|[^a-z0-9])style:/] +# }, +# { +# label: '✒️ comment', +# patterns: [/\[comment\]/, /(?:^|[^a-z0-9])comment:/] +# }, +# { +# label: '📄 rename', +# patterns: [/\[rename\]/, /(?:^|[^a-z0-9])rename:/] +# }, +# { +# label: '♻️ remove', +# patterns: [/\[remove\]/, /(?:^|[^a-z0-9])remove:/] +# } +# ]; +# +# for (const rule of titleRules) { +# if (rule.patterns.some(pattern => pattern.test(title))) { +# labels.add(rule.label); +# } +# } +# +# const authorLabels = { +# 'Jy000n': '🌸 자윤', +# 'aneykrap': '🌵 예나', +# 'laura-jung': '🍀️ 윤아' +# }; +# +# const managedLabels = new Set([ +# ...titleRules.map(rule => rule.label), +# ...Object.values(authorLabels) +# ]); +# +# if (authorLabels[author]) { +# labels.add(authorLabels[author]); +# } +# +# const currentLabels = (item.labels || []).map(label => label.name || label); +# const labelsToRemove = currentLabels.filter(label => managedLabels.has(label)); +# +# await Promise.all(labelsToRemove.map(label => github.rest.issues.removeLabel({ +# owner: context.repo.owner, +# repo: context.repo.repo, +# issue_number: item.number, +# name: label +# }).catch(error => { +# if (error.status !== 404) { +# throw error; +# } +# }))); +# +# if (labels.size > 0) { +# await github.rest.issues.addLabels({ +# owner: context.repo.owner, +# repo: context.repo.repo, +# issue_number: item.number, +# labels: [...labels] +# }); \ No newline at end of file From 85dd029e7f114e8d64d0a5955fc64f81fd54f323 Mon Sep 17 00:00:00 2001 From: aneykrap Date: Tue, 30 Jun 2026 02:19:14 +0900 Subject: [PATCH 5/6] =?UTF-8?q?chore:=20=EC=9B=B9=ED=9B=85=20=ED=98=B8?= =?UTF-8?q?=EC=B6=9C=EC=97=90=20=ED=83=80=EC=9E=84=EC=95=84=EC=9B=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/pr-merged-notify.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/pr-merged-notify.yml b/.github/workflows/pr-merged-notify.yml index d9b76bb..606d164 100644 --- a/.github/workflows/pr-merged-notify.yml +++ b/.github/workflows/pr-merged-notify.yml @@ -33,7 +33,8 @@ jobs: headers: { "Content-Type": "application/json; charset=utf-8" }, - body: JSON.stringify({ text }) + body: JSON.stringify({ text }), + signal: AbortSignal.timeout(10_000) }); if (!slackResponse.ok) { From d934415a96cee41f10105135f742db0c84c7645e Mon Sep 17 00:00:00 2001 From: aneykrap Date: Thu, 2 Jul 2026 18:57:41 +0900 Subject: [PATCH 6/6] =?UTF-8?q?chore:=20pr=20=EA=B6=8C=ED=95=9C=20write?= =?UTF-8?q?=EB=A1=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/pr-approval-notify.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/pr-approval-notify.yml b/.github/workflows/pr-approval-notify.yml index 5a59cc9..1789f5a 100644 --- a/.github/workflows/pr-approval-notify.yml +++ b/.github/workflows/pr-approval-notify.yml @@ -6,7 +6,7 @@ on: types: [synchronize,ready_for_review] permissions: - pull-requests: read + pull-requests: write issues: write env: @@ -151,4 +151,4 @@ jobs: repo, issue_number: pr.number, labels: [markerLabel] - }); \ No newline at end of file + });