TensorRT-LLMs/.github/workflows/waiting_for_feedback.yml
Kanghwan 98c68c195b
[None][infra] Ignore comments from bots and CI accounts (#9929)
Signed-off-by: Kanghwan Jang <861393+karljang@users.noreply.github.com>
2025-12-12 09:20:51 +08:00

128 lines
4.8 KiB
YAML

name: Manage Waiting for Feedback Label
on:
issue_comment:
types: [created]
pull_request_review_comment:
types: [created]
permissions:
issues: write
pull-requests: write
jobs:
manage-waiting-for-feedback:
runs-on: ubuntu-latest
if: github.repository == 'NVIDIA/TensorRT-LLM'
steps:
- name: Check membership and manage label
uses: actions/github-script@v8
with:
script: |
const commenter = context.payload.comment.user.login;
const commenterType = context.payload.comment.user.type;
const label = 'waiting for feedback';
// Ignore bots and CI accounts
const ignoredAccounts = ['tensorrt-cicd'];
if (commenterType === 'Bot' || ignoredAccounts.includes(commenter)) {
console.log(`Ignoring comment from ${commenter} (type: ${commenterType}). Skipping.`);
return;
}
// Handle both issue_comment and pull_request_review_comment events
// context.issue.number is only available for issue_comment events
const issueNumber = context.issue?.number || context.payload.pull_request?.number;
const issue = context.payload.issue || context.payload.pull_request;
const author = issue?.user?.login;
const isAuthor = (commenter === author);
if (!issueNumber) {
console.log('Could not determine issue/PR number. Skipping.');
return;
}
console.log(`Comment by ${commenter} on #${issueNumber} (author: ${author})`);
const owner = context.repo.owner;
const repo = context.repo.repo;
// Check if commenter is repository member
let isMember = false;
try {
await github.rest.repos.checkCollaborator({
owner,
repo,
username: commenter
});
isMember = true;
} catch (error) {
if (error.status === 404) {
isMember = false;
} else if (error.status === 302) {
console.log(`Cannot determine membership for ${commenter} (insufficient token permissions)`);
return;
} else {
console.error(`Error checking membership: ${error.message}`);
throw error;
}
}
// Logic:
// - Author responds → remove label (feedback provided)
// - NVIDIA non-author comments → add label (team is waiting for response)
// - External non-author comments → remove label (someone provided feedback)
if (isAuthor) {
// Author responded - remove 'waiting for feedback' label
console.log(`${commenter} is the author. Removing '${label}' label if present.`);
try {
await github.rest.issues.removeLabel({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: issueNumber,
name: label
});
console.log(`Successfully removed '${label}' label from #${issueNumber}`);
} catch (error) {
if (error.status === 404) {
console.log(`Label '${label}' was not present on #${issueNumber}. No action needed.`);
} else {
throw error;
}
}
} else if (isMember) {
// NVIDIA non-author commented - add 'waiting for feedback' label
console.log(`${commenter} is an NVIDIA member (not author). Adding '${label}' label.`);
await github.rest.issues.addLabels({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: issueNumber,
labels: [label]
});
console.log(`Successfully added '${label}' label to #${issueNumber}`);
} else {
// External non-author commented - remove 'waiting for feedback' label
console.log(`${commenter} is external (not author). Removing '${label}' label if present.`);
try {
await github.rest.issues.removeLabel({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: issueNumber,
name: label
});
console.log(`Successfully removed '${label}' label from #${issueNumber}`);
} catch (error) {
if (error.status === 404) {
console.log(`Label '${label}' was not present on #${issueNumber}. No action needed.`);
} else {
throw error;
}
}
}