mirror of
https://github.com/fankes/beszel.git
synced 2025-10-18 17:29:28 +08:00
[Chrore] Improve Issue Templates with Categorization and Label Automation (#939)
* Update templates * update script * update labels * add PR template * update dropdown
This commit is contained in:
47
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
47
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
@@ -1,8 +1,19 @@
|
|||||||
name: 🐛 Bug report
|
name: 🐛 Bug report
|
||||||
description: Report a new bug or issue.
|
description: Report a new bug or issue.
|
||||||
title: '[Bug]: '
|
title: '[Bug]: '
|
||||||
labels: ['bug']
|
labels: ['bug', "needs confirmation"]
|
||||||
body:
|
body:
|
||||||
|
- type: dropdown
|
||||||
|
id: component
|
||||||
|
attributes:
|
||||||
|
label: Component
|
||||||
|
description: Which part of Beszel is this about?
|
||||||
|
options:
|
||||||
|
- Hub
|
||||||
|
- Agent
|
||||||
|
- Hub & Agent
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
- type: markdown
|
- type: markdown
|
||||||
attributes:
|
attributes:
|
||||||
value: |
|
value: |
|
||||||
@@ -43,6 +54,39 @@ body:
|
|||||||
3. Pour it into a cup.
|
3. Pour it into a cup.
|
||||||
validations:
|
validations:
|
||||||
required: true
|
required: true
|
||||||
|
- type: dropdown
|
||||||
|
id: category
|
||||||
|
attributes:
|
||||||
|
label: Category
|
||||||
|
description: Which category does this relate to most?
|
||||||
|
options:
|
||||||
|
- Metrics
|
||||||
|
- Charts & Visualization
|
||||||
|
- Settings & Configuration
|
||||||
|
- Notifications & Alerts
|
||||||
|
- Authentication
|
||||||
|
- Installation
|
||||||
|
- Performance
|
||||||
|
- UI / UX
|
||||||
|
- Other
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: dropdown
|
||||||
|
id: metrics
|
||||||
|
attributes:
|
||||||
|
label: Affected Metrics
|
||||||
|
description: If applicable, which specific metric does this relate to most?
|
||||||
|
options:
|
||||||
|
- CPU
|
||||||
|
- Memory
|
||||||
|
- Storage
|
||||||
|
- Network
|
||||||
|
- Containers
|
||||||
|
- GPU
|
||||||
|
- Sensors
|
||||||
|
- Other
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
- type: input
|
- type: input
|
||||||
id: system
|
id: system
|
||||||
attributes:
|
attributes:
|
||||||
@@ -61,7 +105,6 @@ body:
|
|||||||
id: install-method
|
id: install-method
|
||||||
attributes:
|
attributes:
|
||||||
label: Installation method
|
label: Installation method
|
||||||
default: 0
|
|
||||||
options:
|
options:
|
||||||
- Docker
|
- Docker
|
||||||
- Binary
|
- Binary
|
||||||
|
60
.github/ISSUE_TEMPLATE/feature_request.yml
vendored
60
.github/ISSUE_TEMPLATE/feature_request.yml
vendored
@@ -1,8 +1,19 @@
|
|||||||
name: 🚀 Feature request
|
name: 🚀 Feature request
|
||||||
description: Request a new feature or change.
|
description: Request a new feature or change.
|
||||||
title: "[Feature]: "
|
title: "[Feature]: "
|
||||||
labels: ["enhancement"]
|
labels: ["enhancement", "needs review"]
|
||||||
body:
|
body:
|
||||||
|
- type: dropdown
|
||||||
|
id: component
|
||||||
|
attributes:
|
||||||
|
label: Component
|
||||||
|
description: Which part of Beszel is this about?
|
||||||
|
options:
|
||||||
|
- Hub
|
||||||
|
- Agent
|
||||||
|
- Hub & Agent
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
- type: markdown
|
- type: markdown
|
||||||
attributes:
|
attributes:
|
||||||
value: Before submitting, please search existing [issues](https://github.com/henrygd/beszel/issues) and [discussions](https://github.com/henrygd/beszel/discussions) (including closed).
|
value: Before submitting, please search existing [issues](https://github.com/henrygd/beszel/issues) and [discussions](https://github.com/henrygd/beszel/discussions) (including closed).
|
||||||
@@ -11,8 +22,55 @@ body:
|
|||||||
label: Describe the feature you would like to see
|
label: Describe the feature you would like to see
|
||||||
validations:
|
validations:
|
||||||
required: true
|
required: true
|
||||||
|
- type: textarea
|
||||||
|
id: motivation
|
||||||
|
attributes:
|
||||||
|
label: Motivation / Use Case
|
||||||
|
description: Why do you want this feature? What problem does it solve?
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
- type: textarea
|
- type: textarea
|
||||||
attributes:
|
attributes:
|
||||||
label: Describe how you would like to see this feature implemented
|
label: Describe how you would like to see this feature implemented
|
||||||
validations:
|
validations:
|
||||||
required: true
|
required: true
|
||||||
|
- type: textarea
|
||||||
|
id: logs
|
||||||
|
attributes:
|
||||||
|
label: Screenshots
|
||||||
|
description: Please attach any relevant screenshots, such as images from your current solution or similar implementations.
|
||||||
|
validations:
|
||||||
|
required: false
|
||||||
|
- type: dropdown
|
||||||
|
id: category
|
||||||
|
attributes:
|
||||||
|
label: Category
|
||||||
|
description: Which category does this relate to most?
|
||||||
|
options:
|
||||||
|
- Metrics
|
||||||
|
- Charts & Visualization
|
||||||
|
- Settings & Configuration
|
||||||
|
- Notifications & Alerts
|
||||||
|
- Authentication
|
||||||
|
- Installation
|
||||||
|
- Performance
|
||||||
|
- UI / UX
|
||||||
|
- Other
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: dropdown
|
||||||
|
id: metrics
|
||||||
|
attributes:
|
||||||
|
label: Affected Metrics
|
||||||
|
description: If applicable, which specific metric does this relate to most?
|
||||||
|
options:
|
||||||
|
- CPU
|
||||||
|
- Memory
|
||||||
|
- Storage
|
||||||
|
- Network
|
||||||
|
- Containers
|
||||||
|
- GPU
|
||||||
|
- Sensors
|
||||||
|
- Other
|
||||||
|
validations:
|
||||||
|
required: true
|
33
.github/pull_request_template.md
vendored
Normal file
33
.github/pull_request_template.md
vendored
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
## 📃 Description
|
||||||
|
|
||||||
|
A short description of the pull request changes should go here and the sections below should list in detail all changes. You can remove the sections you don't need.
|
||||||
|
|
||||||
|
## 📖 Documentation
|
||||||
|
|
||||||
|
Add a link to the PR for [documentation](https://github.com/henrygd/beszel-docs) changes.
|
||||||
|
|
||||||
|
## 🪵 Changelog
|
||||||
|
|
||||||
|
### ➕ Added
|
||||||
|
|
||||||
|
- one
|
||||||
|
- two
|
||||||
|
|
||||||
|
### ✏️ Changed
|
||||||
|
|
||||||
|
- one
|
||||||
|
- two
|
||||||
|
|
||||||
|
### 🔧 Fixed
|
||||||
|
|
||||||
|
- one
|
||||||
|
- two
|
||||||
|
|
||||||
|
### 🗑️ Removed
|
||||||
|
|
||||||
|
- one
|
||||||
|
- two
|
||||||
|
|
||||||
|
## 📷 Screenshots
|
||||||
|
|
||||||
|
If this PR has any UI/UX changes it's strongly suggested you add screenshots here.
|
43
.github/workflows/inactivity-actions.yml
vendored
Normal file
43
.github/workflows/inactivity-actions.yml
vendored
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
name: 'Issue and PR Maintenance'
|
||||||
|
|
||||||
|
on:
|
||||||
|
schedule:
|
||||||
|
- cron: '0 0 * * *' # runs at midnight UTC
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
issues: write
|
||||||
|
pull-requests: write
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
close-stale:
|
||||||
|
name: Close Stale Issues
|
||||||
|
runs-on: ubuntu-24.04
|
||||||
|
steps:
|
||||||
|
- name: Close Stale Issues
|
||||||
|
uses: actions/stale@v9
|
||||||
|
with:
|
||||||
|
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
|
# Messaging
|
||||||
|
stale-issue-message: >
|
||||||
|
👋 This issue has been automatically marked as stale due to inactivity.
|
||||||
|
If this issue is still relevant, please comment to keep it open.
|
||||||
|
Without activity, it will be closed in 7 days.
|
||||||
|
|
||||||
|
close-issue-message: >
|
||||||
|
🔒 This issue has been automatically closed due to prolonged inactivity.
|
||||||
|
Feel free to open a new issue if you have further questions or concerns.
|
||||||
|
|
||||||
|
# Timing
|
||||||
|
days-before-issue-stale: 14
|
||||||
|
days-before-issue-close: 7
|
||||||
|
|
||||||
|
# Labels
|
||||||
|
stale-issue-label: 'stale'
|
||||||
|
remove-stale-when-updated: true
|
||||||
|
only-issue-labels: 'awaiting-requester'
|
||||||
|
|
||||||
|
# Exemptions
|
||||||
|
exempt-assignees: true
|
||||||
|
exempt-milestones: true
|
84
.github/workflows/label-from-dropdown.yml
vendored
Normal file
84
.github/workflows/label-from-dropdown.yml
vendored
Normal file
@@ -0,0 +1,84 @@
|
|||||||
|
name: Label issues from dropdowns
|
||||||
|
|
||||||
|
on:
|
||||||
|
issues:
|
||||||
|
types: [opened]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
label_from_dropdown:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
permissions:
|
||||||
|
issues: write
|
||||||
|
steps:
|
||||||
|
- name: Apply labels based on dropdown choices
|
||||||
|
uses: actions/github-script@v7
|
||||||
|
with:
|
||||||
|
script: |
|
||||||
|
const areaLabels = ['Metrics', 'Charts & Visualization', 'Settings & Configuration', 'Notifications & Alerts', 'Authentication', 'Installation', 'Performance', 'UI / UX', 'Other'];
|
||||||
|
const componentLabels = ['CPU', 'Memory', 'Storage', 'Network', 'Containers', 'GPU', 'Sensors', 'Other'];
|
||||||
|
|
||||||
|
const issueNumber = context.issue.number;
|
||||||
|
const owner = context.repo.owner;
|
||||||
|
const repo = context.repo.repo;
|
||||||
|
|
||||||
|
// Get the issue body
|
||||||
|
const body = context.payload.issue.body;
|
||||||
|
|
||||||
|
// Helper to find dropdown value in the body (assuming markdown format)
|
||||||
|
function extractSectionValue(heading) {
|
||||||
|
const regex = new RegExp(`### ${heading}\\s+([\\s\\S]*?)(?:\\n###|$)`, 'i');
|
||||||
|
const match = body.match(regex);
|
||||||
|
if (match) {
|
||||||
|
// Get the first non-empty line after the heading
|
||||||
|
const lines = match[1].split('\n').map(l => l.trim()).filter(Boolean);
|
||||||
|
return lines[0] || null;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Extract dropdown selections
|
||||||
|
const product = extractSectionValue('Product');
|
||||||
|
const area = extractSectionValue('Area');
|
||||||
|
const component = extractSectionValue('Component');
|
||||||
|
|
||||||
|
// Build labels to add
|
||||||
|
let labelsToAdd = [];
|
||||||
|
if (product) labelsToAdd.push(product);
|
||||||
|
if (area) labelsToAdd.push(area);
|
||||||
|
if (component) labelsToAdd.push(component);
|
||||||
|
|
||||||
|
// Get existing labels in the repo
|
||||||
|
const { data: existingLabels } = await github.rest.issues.listLabelsForRepo({
|
||||||
|
owner,
|
||||||
|
repo,
|
||||||
|
per_page: 100
|
||||||
|
});
|
||||||
|
const existingLabelNames = existingLabels.map(l => l.name);
|
||||||
|
|
||||||
|
// Find labels that need to be created
|
||||||
|
const labelsToCreate = labelsToAdd.filter(label => !existingLabelNames.includes(label));
|
||||||
|
|
||||||
|
// Create missing labels (with a default color)
|
||||||
|
for (const label of labelsToCreate) {
|
||||||
|
try {
|
||||||
|
await github.rest.issues.createLabel({
|
||||||
|
owner,
|
||||||
|
repo,
|
||||||
|
name: label,
|
||||||
|
color: 'ededed' // light gray, you can pick any hex color
|
||||||
|
});
|
||||||
|
} catch (e) {
|
||||||
|
// Ignore if label already exists (race condition), otherwise rethrow
|
||||||
|
if (!e || e.status !== 422) throw e;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Now apply all labels (they all exist now)
|
||||||
|
if (labelsToAdd.length > 0) {
|
||||||
|
await github.rest.issues.addLabels({
|
||||||
|
owner,
|
||||||
|
repo,
|
||||||
|
issue_number: issueNumber,
|
||||||
|
labels: labelsToAdd
|
||||||
|
});
|
||||||
|
}
|
Reference in New Issue
Block a user