feat(workflows): support recursive workstream labeling and new IDs (#17207)

This commit is contained in:
Bryan Morgan
2026-01-21 11:15:38 -05:00
committed by GitHub
parent c21c297133
commit 8605d0d024
+37 -16
View File
@@ -23,7 +23,9 @@ jobs:
const allowedParentUrls = [ const allowedParentUrls = [
'https://github.com/google-gemini/gemini-cli/issues/15374', 'https://github.com/google-gemini/gemini-cli/issues/15374',
'https://github.com/google-gemini/gemini-cli/issues/15456', 'https://github.com/google-gemini/gemini-cli/issues/15456',
'https://github.com/google-gemini/gemini-cli/issues/15324' 'https://github.com/google-gemini/gemini-cli/issues/15324',
'https://github.com/google-gemini/gemini-cli/issues/17202',
'https://github.com/google-gemini/gemini-cli/issues/17203'
]; ];
async function getIssueParent(owner, repo, number) { async function getIssueParent(owner, repo, number) {
@@ -33,6 +35,7 @@ jobs:
issue(number:$number) { issue(number:$number) {
parent { parent {
url url
number
} }
} }
} }
@@ -40,7 +43,7 @@ jobs:
`; `;
try { try {
const result = await github.graphql(query, { owner, repo, number }); const result = await github.graphql(query, { owner, repo, number });
return result.repository.issue.parent ? result.repository.issue.parent.url : null; return result.repository.issue.parent || null;
} catch (error) { } catch (error) {
console.error(`Failed to fetch parent for #${number}:`, error); console.error(`Failed to fetch parent for #${number}:`, error);
return null; return null;
@@ -75,20 +78,38 @@ jobs:
console.log(`Processing ${issuesToProcess.length} issue(s)...`); console.log(`Processing ${issuesToProcess.length} issue(s)...`);
for (const issue of issuesToProcess) { for (const issue of issuesToProcess) {
const parentUrl = await getIssueParent(issue.owner, issue.repo, issue.number); let currentNumber = issue.number;
let depth = 0;
const MAX_DEPTH = 5; // Safety limit for recursion
let matched = false;
let tracedParents = [];
if (parentUrl && allowedParentUrls.includes(parentUrl)) { while (depth < MAX_DEPTH) {
console.log(`SUCCESS: Issue #${issue.number} is a direct child of ${parentUrl}. Adding label.`); const parent = await getIssueParent(issue.owner, issue.repo, currentNumber);
await github.rest.issues.addLabels({
owner: issue.owner, if (!parent) {
repo: issue.repo, break;
issue_number: issue.number, }
labels: [labelToAdd]
}); tracedParents.push(parent.url);
} else {
// logging only for single execution to avoid spam if (allowedParentUrls.includes(parent.url)) {
if (context.eventName === 'issues') { console.log(`SUCCESS: Issue #${issue.number} is a descendant of ${parent.url}. Trace: ${tracedParents.join(' -> ')}. Adding label.`);
console.log(`Issue #${issue.number} parent is ${parentUrl || 'None'}. No action.`); await github.rest.issues.addLabels({
} owner: issue.owner,
repo: issue.repo,
issue_number: issue.number,
labels: [labelToAdd]
});
matched = true;
break;
}
currentNumber = parent.number;
depth++;
}
if (!matched && context.eventName === 'issues') {
console.log(`Issue #${issue.number} did not match any allowed workstreams after checking ${depth} levels. Trace: ${tracedParents.join(' -> ') || 'None'}.`);
} }
} }