mirror of
https://github.com/fankes/beszel.git
synced 2025-10-19 01:39:34 +08:00
84 lines
3.2 KiB
YAML
84 lines
3.2 KiB
YAML
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
|
|
});
|
|
} |