diff options
author | Michael Kubacki <michael.kubacki@microsoft.com> | 2024-12-19 23:43:11 -0500 |
---|---|---|
committer | mergify[bot] <37929162+mergify[bot]@users.noreply.github.com> | 2024-12-21 01:30:20 +0000 |
commit | 896930edc93be754675af5854dba9b39d8647e5e (patch) | |
tree | 1653083eb0927ad72449a3efc3ce55279a20777f | |
parent | 3c8016b302c658d20ebf8eebd5f32daf818a0531 (diff) | |
download | edk2-896930edc93be754675af5854dba9b39d8647e5e.tar.gz |
.github: Add issue automation workflows
REF: https://github.com/tianocore/edk2/discussions/5926
Adds workflows to manage labels on issues based on issue content.
Workflows:
- `issue-assignment` - Performs actions when an issue is assigned.
- Currently, removed the `state:needs-owner` label.
- `issue-triage` - Assigns initial labels to the issue based on data
entered when the issue was created.
- The policies for applying labels are defined in
- `advanced-issue-labeler.yml`
- Note: Based on https://github.com/marketplace/actions/advanced-issue-labeler
- `scheduled-maintenance` - Runs every hour to perform clean up work
need on issues.
- Currently, closes issues that have had the `state:wont-fix` label
applied.
Signed-off-by: Michael Kubacki <michael.kubacki@microsoft.com>
-rw-r--r-- | .github/advanced-issue-labeler.yml | 115 | ||||
-rw-r--r-- | .github/workflows/issue-assignment.yml | 56 | ||||
-rw-r--r-- | .github/workflows/issue-triage.yml | 57 | ||||
-rw-r--r-- | .github/workflows/scheduled-maintenance.yml | 52 |
4 files changed, 280 insertions, 0 deletions
diff --git a/.github/advanced-issue-labeler.yml b/.github/advanced-issue-labeler.yml new file mode 100644 index 0000000000..9a5ce50a72 --- /dev/null +++ b/.github/advanced-issue-labeler.yml @@ -0,0 +1,115 @@ +# Defines the mappings between GitHub issue responses and labels applied to the issue.
+#
+# Copyright (c) Microsoft Corporation.
+# SPDX-License-Identifier: BSD-2-Clause-Patent
+#
+# For more information, see:
+# https://github.com/redhat-plumbers-in-action/advanced-issue-labeler
+
+policy:
+ - section:
+
+ # Issue Template - Urgency Dropdown
+ - id: ['urgency']
+ block-list: []
+ label:
+ - name: 'priority:low'
+ keys: ['Low']
+ - name: 'priority:medium'
+ keys: ['Medium']
+ - name: 'priority:high'
+ keys: ['High']
+
+ # Issue Template - Code First
+ - id: ['code_first']
+ block-list: []
+ label:
+ - name: 'type:code-first'
+ keys: ['Yes']
+
+ # Issue Template - Fix Owner Dropdown
+ - id: ['fix_owner', 'request_owner']
+ block-list: []
+ label:
+ - name: 'state:needs-owner'
+ keys: [
+ 'Someone else needs to fix it',
+ 'Someone else needs to make the change',
+ 'Someone else needs to implement the feature'
+ ]
+ - name: 'state:needs-triage'
+ keys: [
+ 'Someone else needs to fix it',
+ 'Someone else needs to make the change',
+ 'Someone else needs to implement the feature'
+ ]
+
+ # Issue Template - Needs Maintainer Feedback Dropdown
+ - id: ['needs_maintainer_feedback']
+ block-list: []
+ label:
+ - name: 'state:needs-maintainer-feedback'
+ keys: ['Maintainer feedback requested']
+
+ # Issue Template - Packages Impacted
+ - id: ['packages_impacted']
+ block-list: []
+ label:
+ - name: 'package:armpkg'
+ keys: ['ArmPkg']
+ - name: 'package:armplatformpkg'
+ keys: ['ArmPlatformPkg']
+ - name: 'package:armvirtpkg'
+ keys: ['ArmVirtPkg']
+ - name: 'package:basetools'
+ keys: ['BaseTools']
+ - name: 'package:build-or-ci-code'
+ keys: ['Build or CI Code']
+ - name: 'package:cryptopkg'
+ keys: ['CryptoPkg']
+ - name: 'package:dynamictablespkg'
+ keys: ['DynamicTablesPkg']
+ - name: 'package:embeddedpkg'
+ keys: ['EmbeddedPkg']
+ - name: 'package:emulatorpkg'
+ keys: ['EmulatorPkg']
+ - name: 'package:fatpkg'
+ keys: ['FatPkg']
+ - name: 'package:fmpdevicepkg'
+ keys: ['FmpDevicePkg']
+ - name: 'package:intelfsp2pkg'
+ keys: ['IntelFsp2Pkg']
+ - name: 'package:intelfsp2wrapperpkg'
+ keys: ['IntelFsp2WrapperPkg']
+ - name: 'package:mdemodulepkg'
+ keys: ['MdeModulePkg']
+ - name: 'package:mdepkg'
+ keys: ['MdePkg']
+ - name: 'package:networkpkg'
+ keys: ['NetworkPkg']
+ - name: 'package:ovmfpkg'
+ keys: ['OvmfPkg']
+ - name: 'package:pcatchipsetpkg'
+ keys: ['PcAtChipsetPkg']
+ - name: 'package:prmpkg'
+ keys: ['PrmPkg']
+ - name: 'package:redfishpkg'
+ keys: ['RedfishPkg']
+ - name: 'package:securitypkg'
+ keys: ['SecurityPkg']
+ - name: 'package:shellpkg'
+ keys: ['ShellPkg']
+ - name: 'package:signedcapsulepkg'
+ keys: ['SignedCapsulePkg']
+ - name: 'package:sourceleveldebugpkg'
+ keys: ['SourceLevelDebugPkg']
+ - name: 'package:standalonemmpkg'
+ keys: ['StandaloneMmPkg']
+ - name: 'package:ueficpupkg'
+ keys: ['UefiCpuPkg']
+ - name: 'package:uefipayloadpkg'
+ keys: ['UefiPayloadPkg']
+ - name: 'package:unittestframeworkpkg'
+ keys: ['UnitTestFrameworkPkg']
+ - name: 'package:other'
+ keys: ['Other']
diff --git a/.github/workflows/issue-assignment.yml b/.github/workflows/issue-assignment.yml new file mode 100644 index 0000000000..1c06ea9d44 --- /dev/null +++ b/.github/workflows/issue-assignment.yml @@ -0,0 +1,56 @@ +# Actions that should occur when a GitHub issue is assigned.
+#
+# Currently this will remove the `state:needs-owner` label when the issue is assigned to an owner.
+#
+# Copyright (c) Microsoft Corporation.
+# SPDX-License-Identifier: BSD-2-Clause-Patent
+
+name: React to Issue Assignment
+
+on:
+ issues:
+ types: assigned
+
+jobs:
+ adjust-labels:
+ name: Adjust Issue Labels
+ runs-on: ubuntu-latest
+
+ permissions:
+ contents: read
+ issues: write
+
+ steps:
+ - uses: actions/checkout@v4
+
+ - name: Remove Labels
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ run: |
+ # All labels here will be removed if present in the issue
+ LABELS_TO_REMOVE=("state:needs-owner")
+
+ # Gather issue context information
+ ISSUE_NUMBER=$(jq --raw-output .issue.number "$GITHUB_EVENT_PATH")
+ OWNER=$(jq --raw-output .repository.owner.login "$GITHUB_EVENT_PATH")
+ REPO=$(jq --raw-output .repository.name "$GITHUB_EVENT_PATH")
+ LABELS=$(curl -s \
+ -H "Accept: application/vnd.github+json" \
+ -H "Authorization: Bearer $GITHUB_TOKEN" \
+ -H "X-GitHub-Api-Version: 2022-11-28" \
+ https://api.github.com/repos/$OWNER/$REPO/issues/$ISSUE_NUMBER/labels | jq -r '.[].name')
+
+ # Remove labels
+ for LABEL in "${LABELS_TO_REMOVE[@]}"; do
+ if echo "$LABELS" | grep -q "$LABEL"; then
+ curl -X DELETE \
+ -s \
+ -H "Accept: application/vnd.github+json" \
+ -H "Authorization: Bearer $GITHUB_TOKEN" \
+ -H "X-GitHub-Api-Version: 2022-11-28" \
+ https://api.github.com/repos/$OWNER/$REPO/issues/$ISSUE_NUMBER/labels/"$LABEL" > /dev/null
+ echo "$LABEL removed from issue #$ISSUE_NUMBER"
+ else
+ echo "$LABEL not found on issue #$ISSUE_NUMBER"
+ fi
+ done
diff --git a/.github/workflows/issue-triage.yml b/.github/workflows/issue-triage.yml new file mode 100644 index 0000000000..d80addfbce --- /dev/null +++ b/.github/workflows/issue-triage.yml @@ -0,0 +1,57 @@ +# This workflow assists with initial triage of new issues by applying labels
+# based on data provided in the issue.
+#
+# Configuration file that maps issue form input values to labels:
+# advanced-issue-labeler.yml
+#
+# Copyright (c) Microsoft Corporation.
+# SPDX-License-Identifier: BSD-2-Clause-Patent
+#
+# For more information, see:
+# https://github.com/stefanbuck/github-issue-parser
+# https://github.com/redhat-plumbers-in-action/advanced-issue-labeler
+
+name: Issue Triage Workflow
+
+on:
+ issues:
+ types: [ opened ]
+
+jobs:
+ triage_issue:
+ name: Triage Issue
+ runs-on: ubuntu-latest
+
+ strategy:
+ matrix:
+ template: [ bug_report.yml, documentation_request.yml, feature_request.yml ]
+
+ permissions:
+ issues: write
+
+ steps:
+ - uses: actions/checkout@v4
+
+ - name: Parse Issue Form
+ uses: stefanbuck/github-issue-parser@v3
+ id: issue-parser
+ with:
+ issue-body: ${{ github.event.issue.body }}
+ template-path: .github/ISSUE_TEMPLATE/${{ matrix.template }}
+
+ - name: Apply Labels from Triage
+ uses: redhat-plumbers-in-action/advanced-issue-labeler@v3
+ with:
+ issue-form: ${{ steps.issue-parser.outputs.jsonString }}
+ template: ${{ matrix.template }}
+ token: ${{ secrets.GITHUB_TOKEN }}
+
+ - name: Update Assignee
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ FIX_OWNER: ${{ steps.issue-parser.outputs.issueparser_fix_owner }}
+ run: |
+ if [[ $FIX_OWNER == "I will fix it" ]] || [[ $FIX_OWNER == "I will make the change" ]] || [[ $FIX_OWNER == "I will implement the feature" ]]
+ then
+ gh issue edit ${{ github.event.issue.html_url }} --add-assignee ${{ github.event.issue.user.login }}
+ fi
diff --git a/.github/workflows/scheduled-maintenance.yml b/.github/workflows/scheduled-maintenance.yml new file mode 100644 index 0000000000..cc013db454 --- /dev/null +++ b/.github/workflows/scheduled-maintenance.yml @@ -0,0 +1,52 @@ +# This workflow performs scheduled maintenance tasks.
+#
+# Copyright (c) Microsoft Corporation.
+# SPDX-License-Identifier: BSD-2-Clause-Patent
+#
+
+name: Scheduled Maintenance
+
+on:
+ schedule:
+ # * is a special character in YAML so you have to quote this string
+ # Run every hour - https://crontab.guru/#0_*_*_*_*
+ - cron: '0 * * * *'
+ workflow_dispatch:
+
+jobs:
+ repo_cleanup:
+ runs-on: ubuntu-latest
+
+ permissions:
+ pull-requests: write
+ issues: write
+
+ steps:
+ - name: Prune Won't Fix Pull Requests
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ run: |
+ gh api \
+ -H "Accept: application/vnd.github+json" \
+ /repos/${GITHUB_REPOSITORY}/pulls | jq -r '.[]' | jq -rc '.html_url,.labels' | \
+ while read -r html_url ; do
+ read -r labels
+ if [[ $labels == *"state:wont-fix"* ]]; then
+ gh pr close $html_url -c "Closed due to being marked as wont fix" --delete-branch
+ fi
+ done
+
+ - name: Prune Won't Fix Issues
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ REPOSITORY: ${{ env.REPOSITORY_NAME }}
+ run: |
+ gh api \
+ -H "Accept: application/vnd.github+json" \
+ /repos/${GITHUB_REPOSITORY}/issues | jq -r '.[]' | jq -rc '.html_url,.labels' | \
+ while read -r html_url ; do
+ read -r labels
+ if [[ $labels == *"state:wont-fix"* ]]; then
+ gh issue close $html_url -c "Closed due to being marked as wont fix" -r "not planned"
+ fi
+ done
|