-
Notifications
You must be signed in to change notification settings - Fork 527
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Fix #4594 : Issue Triaging Action Added #5591
base: develop
Are you sure you want to change the base?
Changes from 11 commits
60d9637
d445fde
c979ab6
25260c6
140dc54
e3536d6
6ffb172
3b50f7b
c4391f8
342e76d
e8418d0
8037973
b7c3a05
3ae348d
4ed9640
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,71 @@ | ||
name: Issue Triage and Management | ||
|
||
on: | ||
issues: | ||
types: [opened, labeled, assigned] | ||
|
||
permissions: | ||
issues: write | ||
|
||
jobs: | ||
triage-on-issue-open: | ||
runs-on: ubuntu-latest | ||
if: github.event.sender.login != 'github-actions' | ||
steps: | ||
- name: Reply to Issue | ||
if: ${{ github.event.action == 'opened' }} | ||
uses: peter-evans/create-or-update-comment@v4 | ||
with: | ||
issue-number: ${{ github.event.issue.number }} | ||
body: | | ||
Thanks for filing the issue! We’ll review it shortly and route it to the correct team. | ||
- name: Check Labels for Proper Triaging | ||
id: check-labels | ||
uses: actions/github-script@v6 | ||
with: | ||
script: | | ||
const issue = await github.rest.issues.get({ | ||
owner: context.repo.owner, | ||
repo: context.repo.repo, | ||
issue_number: context.issue.number | ||
}); | ||
const labels = issue.data.labels.map(label => label.name); | ||
const requiredLabels = { | ||
types: ['bug', 'enhancement', 'good first issue'], | ||
impacts: ['Impact: High', 'Impact: Medium', 'Impact: Low'], | ||
work: ['Work: High', 'Work: Medium', 'Work: Low'], | ||
}; | ||
const hasTypeLabel = labels.some(label => requiredLabels.types.includes(label)); | ||
const hasImpactLabel = labels.some(label => requiredLabels.impacts.includes(label)); | ||
const hasWorkLabel = labels.some(label => requiredLabels.work.includes(label)); | ||
const needsTriage = !(hasTypeLabel && hasImpactLabel && hasWorkLabel); | ||
Comment on lines
+39
to
+42
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. It is provided in the issue description,
However, the current implementation seems to check for at least one of each type and not exactly one of each type, which could allow multiple labels of the same type. It would be helpful to adjust the logic to ensure exactly one label of each type, as required. |
||
core.setOutput('needs-triage', needsTriage); | ||
- name: Manage Needs Triage Label | ||
uses: actions/github-script@v6 | ||
with: | ||
script: | | ||
const needsTriage = '${{ steps.check-labels.outputs.needs-triage }}' === 'true'; | ||
if (needsTriage) { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. As per the issue requirements, two conditions must be met for triaging:
Both (all) conditions need to be satisfied to remove the |
||
await github.rest.issues.addLabels({ | ||
owner: context.repo.owner, | ||
repo: context.repo.repo, | ||
issue_number: context.issue.number, | ||
labels: ['needs-triage'] | ||
}); | ||
} else { | ||
try { | ||
await github.rest.issues.removeLabel({ | ||
owner: context.repo.owner, | ||
repo: context.repo.repo, | ||
issue_number: context.issue.number, | ||
name: 'needs-triage' | ||
}); | ||
} catch (error) { | ||
if (error.status !== 404) { | ||
throw error; | ||
} | ||
} | ||
} | ||
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,68 @@ | ||
name: Verify Project Assignment | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I just wanted to know if it's absolutely necessary to have two separate workflows now that project verification is also part of triaging. Since both workflows share the same triggers, I believe the conditional checks should suffice. However, please let me know if it's essential to keep them separate. |
||
|
||
on: | ||
issues: | ||
types: [labeled] | ||
|
||
permissions: | ||
issues: write | ||
|
||
jobs: | ||
verify-project-assignment: | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Could you also explore if there's a way to address the additional requirement mentioned in the comment,
|
||
runs-on: ubuntu-latest | ||
if: github.event.sender.login != 'github-actions' | ||
steps: | ||
- name: Check if Label is an Impact Label | ||
id: check-impact-label | ||
run: | | ||
if [[ "${{ github.event.label.name }}" == "Impact: High" ]] || \ | ||
[[ "${{ github.event.label.name }}" == "Impact: Medium" ]] || \ | ||
[[ "${{ github.event.label.name }}" == "Impact: Low" ]]; then | ||
echo "impact_label=true" >> $GITHUB_ENV | ||
else | ||
echo "impact_label=false" >> $GITHUB_ENV | ||
fi | ||
Comment on lines
+15
to
+24
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. It makes sense to conditionally check these to prevent re-runs. However, I was thinking it might be better to check the |
||
|
||
- name: Verify Project Assignment | ||
if: env.impact_label == 'true' | ||
uses: actions/github-script@v6 | ||
with: | ||
script: | | ||
const issueNumber = context.issue.number; | ||
|
||
// Fetch all open projects in the repository | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Everywhere in this file, I believe we use "#" for comments in yaml files. |
||
const projects = await github.rest.projects.listForRepo({ | ||
owner: context.repo.owner, | ||
repo: context.repo.repo, | ||
}); | ||
|
||
// Filter to get only open projects | ||
const assignedProjects = projects.data.filter(project => project.state === 'open'); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I'm not sure if this is fully implemented. It retrieves the project list and checks if it's open, but the requirement is to verify if the issue is assigned to a project, which would necessitate checking if the issue appears in the project list. From your demonstration, I'm unsure of its verification. Could you please implement this fully, and it would be great if you could provide demonstrations for different scenarios, such as,
|
||
|
||
if (assignedProjects.length !== 1) { | ||
console.warn(`Issue must be assigned to exactly one open project. Found: ${assignedProjects.length}`); | ||
|
||
// Add a comment to notify about incorrect project assignment | ||
const existingComments = await github.rest.issues.listComments({ | ||
owner: context.repo.owner, | ||
repo: context.repo.repo, | ||
issue_number: issueNumber, | ||
}); | ||
|
||
const commentAlreadyExists = existingComments.data.some(comment => | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This is nice to prevent duplicate comments. However, I suggest comparing the entire current comment body with the most recent gentle reminder comment. For example, consider the cases:
The reason for this is that if an issue is reassigned to different projects at different periods, it may end up in multiple or no projects, and no reminder would be posted to handle those changes. @adhiamboperes, I would like to confirm the requirement with you before proceeding. Should we post a comment only once or whenever there's a change? Also, when should the project assigned reminder be posted - when issue is created or when labels are added (issue is triaged)? |
||
comment.body.includes('Gentle Reminder: This issue must be assigned to exactly one open project') | ||
); | ||
|
||
if (!commentAlreadyExists) { | ||
await github.rest.issues.createComment({ | ||
owner: context.repo.owner, | ||
repo: context.repo.repo, | ||
issue_number: issueNumber, | ||
body: `Gentle Reminder: This issue must be assigned to exactly one open project. Currently, ${assignedProjects.length} projects are assigned. Thanks.`, | ||
}); | ||
} | ||
} else { | ||
console.log(`Valid project assignment: ${assignedProjects[0].name}`); | ||
} | ||
|
||
|
||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Ensure there is only one blank line at the end of a file. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think it could be beneficial to trigger actions for label removal as well. This way, we can ensure that the needs-triage label is added as soon as any required label is missing, which will help us better track and manage such issues.