Skip to content

Commit 40fa4bc

Browse files
Merge pull request #90 from codedwithhs/feature/AIRA-65-Branch-Protection-Rules-Core-Development-Automation
AIRA-65: Project Automation Action Update
2 parents dc6e177 + 5f192c8 commit 40fa4bc

File tree

1 file changed

+86
-82
lines changed

1 file changed

+86
-82
lines changed

.github/workflows/project-automation.yml

Lines changed: 86 additions & 82 deletions
Original file line numberDiff line numberDiff line change
@@ -325,105 +325,70 @@ jobs:
325325
return issues;
326326
}
327327
328-
// Helper function to find issue by AIRA number (REST API fallback)
328+
// Helper function to find issue by AIRA number (REST API primary)
329329
async function findIssueByAiraNumber(airaNumber) {
330330
try {
331-
// First try GraphQL search
332-
console.log(` 🔍 Searching for AIRA-${airaNumber} using GraphQL...`);
331+
// Use REST API as primary method (GraphQL search has been problematic)
332+
console.log(` 🔍 Searching for AIRA-${airaNumber} using REST API...`);
333333
334-
const query = `
335-
query($searchQuery: String!) {
336-
search(query: $searchQuery, type: ISSUE, first: 10) {
337-
nodes {
338-
... on Issue {
339-
number
340-
title
341-
state
342-
id
343-
}
344-
}
345-
}
346-
}
347-
`;
348-
349-
const searchQuery = `repo:${context.repo.owner}/${context.repo.repo} AIRA-${airaNumber} in:title`;
350-
console.log(` 🔍 GraphQL search query: ${searchQuery}`);
351-
352-
const result = await github.graphql(query, {
353-
searchQuery
334+
const searchResponse = await github.rest.search.issuesAndPullRequests({
335+
q: `repo:${context.repo.owner}/${context.repo.repo} AIRA-${airaNumber} in:title type:issue`,
336+
per_page: 10
354337
});
355338
356-
const issues = result.search.nodes.filter(node =>
357-
node.title.includes(`AIRA-${airaNumber}`)
358-
);
339+
console.log(` 🔍 REST API found ${searchResponse.data.total_count} results`);
359340
360-
if (issues.length > 0) {
361-
console.log(` ✅ Found issue via GraphQL: #${issues[0].number} - ${issues[0].title}`);
362-
return issues[0];
341+
if (searchResponse.data.items && searchResponse.data.items.length > 0) {
342+
const matchingIssues = searchResponse.data.items.filter(issue =>
343+
issue.title && issue.title.includes(`AIRA-${airaNumber}`)
344+
);
345+
346+
if (matchingIssues.length > 0) {
347+
const issue = matchingIssues[0];
348+
console.log(` ✅ Found issue via REST API: #${issue.number} - ${issue.title} (State: ${issue.state})`);
349+
return {
350+
number: issue.number,
351+
title: issue.title,
352+
state: issue.state,
353+
id: issue.node_id
354+
};
355+
}
363356
}
364357
365-
console.log(` ❌ No results from GraphQL search, trying REST API...`);
358+
console.log(` ❌ No matching issues found in search results`);
366359
367-
} catch (graphqlError) {
368-
console.log(` ❌ GraphQL search failed: ${graphqlError.message}`);
369-
console.log(` 🔄 Falling back to REST API search...`);
360+
} catch (restError) {
361+
console.log(` ❌ REST API search failed: ${restError.message}`);
370362
}
371363
372364
try {
373-
// Fallback to REST API search
374-
const searchResponse = await github.rest.search.issuesAndPullRequests({
375-
q: `repo:${context.repo.owner}/${context.repo.repo} AIRA-${airaNumber} in:title type:issue`,
376-
per_page: 10
377-
});
365+
// Fallback: Direct lookup if AIRA number matches issue number
366+
console.log(` 🔄 Fallback: checking if AIRA-${airaNumber} corresponds to issue #${airaNumber}...`);
378367
379-
console.log(` 🔍 REST API found ${searchResponse.data.total_count} results`);
380-
381-
const matchingIssues = searchResponse.data.items.filter(issue =>
382-
issue.title.includes(`AIRA-${airaNumber}`)
383-
);
368+
const issueResponse = await github.rest.issues.get({
369+
owner: context.repo.owner,
370+
repo: context.repo.repo,
371+
issue_number: airaNumber
372+
});
384373
385-
if (matchingIssues.length > 0) {
386-
const issue = matchingIssues[0];
387-
console.log(` ✅ Found issue via REST API: #${issue.number} - ${issue.title}`);
374+
if (issueResponse.data.title && issueResponse.data.title.includes(`AIRA-${airaNumber}`)) {
375+
console.log(` ✅ Found by direct lookup: #${issueResponse.data.number} - ${issueResponse.data.title} (State: ${issueResponse.data.state})`);
388376
return {
389-
number: issue.number,
390-
title: issue.title,
391-
state: issue.state,
392-
id: issue.node_id
377+
number: issueResponse.data.number,
378+
title: issueResponse.data.title,
379+
state: issueResponse.data.state,
380+
id: issueResponse.data.node_id
393381
};
394382
} else {
395-
console.log(` ❌ No matching issues found for AIRA-${airaNumber}`);
396-
return null;
383+
console.log(` ❌ Issue #${airaNumber} exists but doesn't match AIRA-${airaNumber}`);
397384
}
398385
399-
} catch (restError) {
400-
console.log(` ❌ REST API search also failed: ${restError.message}`);
401-
402-
// Last resort: try to find by issue number if AIRA number matches
403-
try {
404-
console.log(` 🔄 Last resort: checking if AIRA-${airaNumber} corresponds to issue #${airaNumber}...`);
405-
406-
const issueResponse = await github.rest.issues.get({
407-
owner: context.repo.owner,
408-
repo: context.repo.repo,
409-
issue_number: airaNumber
410-
});
411-
412-
if (issueResponse.data.title.includes(`AIRA-${airaNumber}`)) {
413-
console.log(` ✅ Found by direct lookup: #${issueResponse.data.number} - ${issueResponse.data.title}`);
414-
return {
415-
number: issueResponse.data.number,
416-
title: issueResponse.data.title,
417-
state: issueResponse.data.state,
418-
id: issueResponse.data.node_id
419-
};
420-
}
421-
} catch (directError) {
422-
console.log(` ❌ Direct lookup failed: ${directError.message}`);
423-
}
424-
425-
return null;
386+
} catch (directError) {
387+
console.log(` ❌ Direct lookup failed: ${directError.message}`);
426388
}
389+
390+
console.log(` ❌ Could not find issue for AIRA-${airaNumber}`);
391+
return null;
427392
}
428393
429394
// Main automation logic
@@ -534,7 +499,16 @@ jobs:
534499
// Find the actual GitHub issue
535500
const issue = await findIssueByAiraNumber(airaNumber);
536501
537-
if (issue && issue.state === 'open') {
502+
if (!issue) {
503+
console.log(` ❌ Could not find GitHub issue for AIRA-${airaNumber}`);
504+
continue;
505+
}
506+
507+
console.log(` 📋 Found issue #${issue.number}: "${issue.title}" (State: ${issue.state})`);
508+
509+
if (issue.state === 'open') {
510+
console.log(` 🔄 Issue is open, proceeding to close it...`);
511+
538512
// Close the issue
539513
await github.rest.issues.update({
540514
owner: context.repo.owner,
@@ -543,20 +517,50 @@ jobs:
543517
state: 'closed'
544518
});
545519
520+
console.log(` ✅ Closed issue #${issue.number}`);
521+
546522
// Move to Done in project
547523
let linkedItemId = await getProjectItemId(issue.id);
548524
549525
if (!linkedItemId) {
526+
console.log(` 🔄 Adding issue to project...`);
550527
linkedItemId = await addToProject(issue.id);
551528
}
552529
553530
if (linkedItemId) {
554531
await updateItemStatus(linkedItemId, 'Done');
532+
console.log(` ✅ Moved issue to Done in project`);
533+
} else {
534+
console.log(` ❌ Could not add issue to project`);
555535
}
556536
557537
console.log(`✅ Auto-closed and moved AIRA-${airaNumber} (issue #${issue.number}) to Done`);
558-
} else if (issue) {
559-
console.log(`ℹ️ Issue AIRA-${airaNumber} already closed`);
538+
539+
} else if (issue.state === 'closed') {
540+
console.log(` ℹ️ Issue AIRA-${airaNumber} (issue #${issue.number}) is already closed, skipping closure`);
541+
542+
// Still move to Done in project if not already there
543+
let linkedItemId = await getProjectItemId(issue.id);
544+
545+
if (!linkedItemId) {
546+
console.log(` 🔄 Adding closed issue to project...`);
547+
linkedItemId = await addToProject(issue.id);
548+
}
549+
550+
if (linkedItemId) {
551+
const currentStatus = await getCurrentItemStatus(linkedItemId);
552+
if (currentStatus && currentStatus.toLowerCase() !== 'done') {
553+
await updateItemStatus(linkedItemId, 'Done');
554+
console.log(` ✅ Moved already-closed issue to Done in project`);
555+
} else {
556+
console.log(` ℹ️ Issue already in Done status`);
557+
}
558+
}
559+
560+
console.log(`✅ Verified AIRA-${airaNumber} (issue #${issue.number}) is closed and in Done status`);
561+
562+
} else {
563+
console.log(` ⚠️ Issue AIRA-${airaNumber} has unexpected state: ${issue.state}`);
560564
}
561565
} catch (error) {
562566
console.log(`❌ Failed to process AIRA-${airaNumber}:`, error.message);

0 commit comments

Comments
 (0)