Add GitHub issue templates, labels, and PR check workflow

- Bug report and feature request issue templates
- Comprehensive label definitions for issue management
- PR check workflow with multi-platform build verification
  (Linux x64/ARM64, Windows, macOS Intel/ARM)
- Frontend linting and Rust clippy checks
- Security audits for npm and cargo dependencies
- Caching optimization for faster CI runs
This commit is contained in:
SuperKali
2025-12-22 13:56:25 +01:00
parent e306ddcb0b
commit e7ccc8b97f
5 changed files with 890 additions and 0 deletions

139
.github/ISSUE_TEMPLATE/bug_report.yml vendored Normal file
View File

@@ -0,0 +1,139 @@
name: Bug Report
description: Report a bug or unexpected behavior in Armbian Imager
title: "[Bug]: "
labels: ["bug", "triage"]
body:
- type: markdown
attributes:
value: |
Thanks for taking the time to report a bug! Please fill out the form below to help us investigate and fix the issue.
- type: checkboxes
id: existing-issue
attributes:
label: Prerequisites
description: Please confirm the following before submitting
options:
- label: I have searched the existing issues and this bug has not been reported before
required: true
- label: I am using the latest version of Armbian Imager
required: true
- type: dropdown
id: os
attributes:
label: Operating System
description: Which operating system are you using?
options:
- Windows 10
- Windows 11
- macOS (Intel)
- macOS (Apple Silicon)
- Linux (Ubuntu)
- Linux (Debian)
- Linux (Linux Mint)
- Linux (Other Debian-based)
validations:
required: true
- type: input
id: os-version
attributes:
label: OS Version
description: Specific version of your operating system
placeholder: "e.g., Windows 11 23H2, macOS 14.2, Ubuntu 24.04"
validations:
required: true
- type: input
id: app-version
attributes:
label: Armbian Imager Version
description: Version of Armbian Imager (displayed at the bottom right corner of the home screen)
placeholder: "e.g., 1.0.0"
validations:
required: true
- type: dropdown
id: operation
attributes:
label: Operation Type
description: What were you trying to do when the bug occurred?
options:
- Downloading an image
- Flashing to SD card
- Flashing to USB drive
- Verifying a flash
- Selecting a board/image
- Using a custom image
- Device detection
- Application startup
- Other
validations:
required: true
- type: input
id: target-device
attributes:
label: Target Device (if applicable)
description: The SD card or USB drive model/brand you were flashing to
placeholder: "e.g., SanDisk Ultra 32GB, Samsung EVO 64GB"
- type: input
id: target-board
attributes:
label: Target Board (if applicable)
description: The Armbian board you were trying to flash an image for
placeholder: "e.g., Orange Pi 5, Raspberry Pi 4, Khadas VIM3"
- type: textarea
id: description
attributes:
label: Bug Description
description: A clear and concise description of what the bug is
placeholder: Describe what happened...
validations:
required: true
- type: textarea
id: expected
attributes:
label: Expected Behavior
description: What did you expect to happen?
placeholder: Describe what should have happened...
validations:
required: true
- type: textarea
id: steps
attributes:
label: Steps to Reproduce
description: Steps to reproduce the behavior
placeholder: |
1. Open Armbian Imager
2. Select board '...'
3. Click on '...'
4. See error
validations:
required: true
- type: textarea
id: logs
attributes:
label: Error Messages / Logs
description: |
If applicable, paste any error messages or logs here.
You can use the "Upload Logs" feature in Armbian Imager to get a paste.armbian.com link.
render: shell
- type: textarea
id: screenshots
attributes:
label: Screenshots
description: If applicable, add screenshots to help explain your problem
- type: textarea
id: additional
attributes:
label: Additional Context
description: Add any other context about the problem here

8
.github/ISSUE_TEMPLATE/config.yml vendored Normal file
View File

@@ -0,0 +1,8 @@
blank_issues_enabled: false
contact_links:
- name: Armbian Forums
url: https://forum.armbian.com/
about: For general questions and community support, please visit the Armbian Forums
- name: Documentation
url: https://docs.armbian.com/
about: Check the official Armbian documentation for guides and FAQs

View File

@@ -0,0 +1,94 @@
name: Feature Request
description: Suggest a new feature or enhancement for Armbian Imager
title: "[Feature]: "
labels: ["enhancement"]
body:
- type: markdown
attributes:
value: |
Thanks for suggesting a new feature! Please describe your idea in detail so we can evaluate and potentially implement it.
- type: checkboxes
id: existing-request
attributes:
label: Prerequisites
description: Please confirm the following before submitting
options:
- label: I have searched the existing issues and this feature has not been requested before
required: true
- type: dropdown
id: feature-area
attributes:
label: Feature Area
description: Which area of the application does this feature relate to?
options:
- User Interface / UX
- Download functionality
- Flash/Write functionality
- Device detection
- Image selection / Board support
- Custom image handling
- Verification / Validation
- Platform support (Windows/macOS/Linux)
- Localization / Translations
- Performance
- Accessibility
- Other
validations:
required: true
- type: textarea
id: problem
attributes:
label: Problem Statement
description: Is your feature request related to a problem? Please describe the problem you're trying to solve.
placeholder: "I'm always frustrated when... / Currently there's no way to..."
validations:
required: true
- type: textarea
id: solution
attributes:
label: Proposed Solution
description: Describe the solution you'd like to see implemented
placeholder: "I would like to be able to..."
validations:
required: true
- type: textarea
id: alternatives
attributes:
label: Alternatives Considered
description: Describe any alternative solutions or workarounds you've considered
placeholder: "I've tried... but it doesn't work because..."
- type: dropdown
id: priority
attributes:
label: How important is this feature to you?
options:
- Nice to have
- Would significantly improve my workflow
- Critical for my use case
validations:
required: true
- type: textarea
id: use-case
attributes:
label: Use Case
description: Describe a specific scenario where this feature would be useful
placeholder: "When I'm flashing multiple boards, I need to..."
- type: textarea
id: mockups
attributes:
label: Mockups / Examples
description: If applicable, add mockups, sketches, or examples from other applications
- type: textarea
id: additional
attributes:
label: Additional Context
description: Add any other context about the feature request here

378
.github/labels.yml vendored Normal file
View File

@@ -0,0 +1,378 @@
# ===========================================
# BUG AND ISSUE MANAGEMENT
# ===========================================
- name: bug
color: "d73a4a"
description: Something isn't working
- name: triage
color: "fbca04"
description: Needs initial review and categorization
- name: confirmed
color: "0e8a16"
description: Bug has been confirmed and reproduced
- name: wontfix
color: "ffffff"
description: This will not be worked on
- name: duplicate
color: "cfd3d7"
description: This issue or pull request already exists
- name: invalid
color: "e4e669"
description: This doesn't seem right
- name: regression
color: "b60205"
description: Something that worked before is now broken
# ===========================================
# FEATURE AND ENHANCEMENT
# ===========================================
- name: enhancement
color: "a2eeef"
description: New feature or request
- name: good first issue
color: "7057ff"
description: Good for newcomers
- name: help wanted
color: "008672"
description: Extra attention is needed
- name: feature-request
color: "c2e0c6"
description: Request for a new feature
# ===========================================
# PRIORITY
# ===========================================
- name: "priority: critical"
color: "b60205"
description: Must be fixed immediately
- name: "priority: high"
color: "d93f0b"
description: Should be addressed soon
- name: "priority: medium"
color: "fbca04"
description: Normal priority
- name: "priority: low"
color: "0e8a16"
description: Can be addressed later
# ===========================================
# PLATFORM
# ===========================================
- name: "platform: windows"
color: "0078d4"
description: Windows-specific issue
- name: "platform: macos"
color: "a3aaae"
description: macOS-specific issue
- name: "platform: macos-intel"
color: "a3aaae"
description: macOS Intel-specific issue
- name: "platform: macos-arm"
color: "a3aaae"
description: macOS Apple Silicon-specific issue
- name: "platform: linux"
color: "e95420"
description: Linux-specific issue
- name: "platform: linux-x64"
color: "e95420"
description: Linux x64 architecture issue
- name: "platform: linux-arm64"
color: "e95420"
description: Linux ARM64 architecture issue
# ===========================================
# UI COMPONENTS
# ===========================================
- name: "component: ui"
color: "c5def5"
description: User interface related
- name: "component: modal-manufacturer"
color: "c5def5"
description: Manufacturer selection modal
- name: "component: modal-board"
color: "c5def5"
description: Board selection modal
- name: "component: modal-image"
color: "c5def5"
description: Image selection modal
- name: "component: modal-device"
color: "c5def5"
description: Device selection modal
- name: "component: flash-progress"
color: "c5def5"
description: Flash progress UI
- name: "component: settings"
color: "c5def5"
description: Settings and preferences
- name: "component: theme"
color: "c5def5"
description: Light/dark theme issues
# ===========================================
# BACKEND COMPONENTS
# ===========================================
- name: "component: backend"
color: "fef2c0"
description: Rust backend related
- name: "component: flash"
color: "f9d0c4"
description: Flash/write operations
- name: "component: download"
color: "bfdadc"
description: Download functionality
- name: "component: device-detection"
color: "d4c5f9"
description: Device detection issues
- name: "component: decompression"
color: "e6ccb3"
description: Image decompression (XZ, GZ, ZSTD, BZIP2)
- name: "component: verification"
color: "c2e0c6"
description: SHA256 verification and validation
- name: "component: custom-image"
color: "f9c513"
description: Custom image file handling
- name: "component: api"
color: "bfd4f2"
description: Armbian API integration
- name: "component: tauri-ipc"
color: "d4c5f9"
description: Tauri IPC communication
- name: "component: updater"
color: "fbca04"
description: Auto-updater functionality
- name: "component: logs"
color: "c5def5"
description: Logging and log upload
# ===========================================
# OPERATIONS
# ===========================================
- name: "operation: download"
color: "1d76db"
description: Image download operation
- name: "operation: flash"
color: "ff6b6b"
description: Flash to device operation
- name: "operation: verify"
color: "0e8a16"
description: Verification operation
- name: "operation: decompress"
color: "e6ccb3"
description: Decompression operation
# ===========================================
# TARGET DEVICE TYPE
# ===========================================
- name: "device: sd-card"
color: "5319e7"
description: SD card related
- name: "device: usb"
color: "5319e7"
description: USB drive related
- name: "device: emmc"
color: "5319e7"
description: eMMC module related
- name: "device: nvme"
color: "5319e7"
description: NVMe drive related
# ===========================================
# IMAGE FORMATS
# ===========================================
- name: "format: xz"
color: "006b75"
description: XZ compressed images
- name: "format: gz"
color: "006b75"
description: GZ compressed images
- name: "format: zstd"
color: "006b75"
description: ZSTD compressed images
- name: "format: bzip2"
color: "006b75"
description: BZIP2 compressed images
- name: "format: raw"
color: "006b75"
description: Raw/uncompressed images
- name: "format: img"
color: "006b75"
description: IMG file format
# ===========================================
# STATUS
# ===========================================
- name: "status: in progress"
color: "1d76db"
description: Currently being worked on
- name: "status: blocked"
color: "b60205"
description: Blocked by another issue or external factor
- name: "status: needs info"
color: "d876e3"
description: Waiting for more information from reporter
- name: "status: ready for review"
color: "0e8a16"
description: Ready to be reviewed
- name: "status: on hold"
color: "c5def5"
description: Temporarily paused
- name: "status: needs testing"
color: "fbca04"
description: Needs testing before closing
# ===========================================
# TYPE
# ===========================================
- name: documentation
color: "0075ca"
description: Improvements or additions to documentation
- name: refactor
color: "d4c5f9"
description: Code refactoring without functional changes
- name: performance
color: "ff7619"
description: Performance improvements
- name: security
color: "ee0701"
description: Security related issues
- name: i18n
color: "5319e7"
description: Internationalization and translations
- name: accessibility
color: "1d76db"
description: Accessibility improvements
- name: testing
color: "bfd4f2"
description: Testing related
- name: ci-cd
color: "6f42c1"
description: CI/CD and build pipeline
- name: dependencies
color: "0366d6"
description: Dependency updates
# ===========================================
# ERRORS
# ===========================================
- name: "error: access-denied"
color: "b60205"
description: Permission/access denied errors
- name: "error: network"
color: "d93f0b"
description: Network connectivity errors
- name: "error: timeout"
color: "d93f0b"
description: Timeout errors
- name: "error: checksum"
color: "b60205"
description: Checksum/hash verification failures
- name: "error: write-failed"
color: "b60205"
description: Write operation failures
- name: "error: device-busy"
color: "d93f0b"
description: Device busy/locked errors
- name: "error: device-not-found"
color: "d93f0b"
description: Device not detected
- name: "error: corrupt-image"
color: "b60205"
description: Corrupted or invalid image file
- name: "error: insufficient-space"
color: "d93f0b"
description: Not enough space on device
- name: "error: crash"
color: "b60205"
description: Application crash
# ===========================================
# SPECIAL
# ===========================================
- name: upstream
color: "ededed"
description: Issue from upstream dependency
- name: breaking-change
color: "b60205"
description: Breaking change requiring migration
- name: needs-design
color: "f9d0c4"
description: Requires UI/UX design work
- name: hacktoberfest
color: "ff7619"
description: Hacktoberfest contribution
- name: sponsored
color: "ea4aaa"
description: Sponsored feature or fix

271
.github/workflows/pr-check.yml vendored Normal file
View File

@@ -0,0 +1,271 @@
name: PR Check
on:
pull_request:
branches: [main]
types: [opened, synchronize, reopened]
# Cancel in-progress runs for the same PR
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true
env:
CARGO_TERM_COLOR: always
RUST_BACKTRACE: 1
jobs:
# ===========================================
# Frontend Checks (runs once, platform-independent)
# ===========================================
frontend:
name: Frontend Checks
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: "20"
cache: "npm"
- name: Cache node_modules
uses: actions/cache@v4
with:
path: node_modules
key: ${{ runner.os }}-node-${{ hashFiles('package-lock.json') }}
restore-keys: |
${{ runner.os }}-node-
- name: Install dependencies
run: npm ci
- name: Run ESLint
run: npm run lint
- name: TypeScript type check
run: npx tsc --noEmit
# ===========================================
# Rust Checks (runs once, platform-independent)
# ===========================================
rust-lint:
name: Rust Lint & Format
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Install system dependencies
run: |
sudo apt-get update
sudo apt-get install -y \
libwebkit2gtk-4.1-dev \
libayatana-appindicator3-dev \
librsvg2-dev \
patchelf \
libssl-dev \
libgtk-3-dev
- name: Setup Rust
uses: dtolnay/rust-toolchain@stable
with:
components: clippy, rustfmt
- name: Cache Cargo
uses: Swatinem/rust-cache@v2
with:
workspaces: "src-tauri -> target"
cache-on-failure: true
- name: Check formatting
working-directory: src-tauri
run: cargo fmt --check
- name: Run Clippy
working-directory: src-tauri
run: cargo clippy --all-targets --all-features -- -D warnings
# ===========================================
# Build Test - All Platforms
# ===========================================
build:
name: Build (${{ matrix.platform }})
needs: [frontend, rust-lint]
strategy:
fail-fast: false
matrix:
include:
# Linux x64
- platform: linux-x64
os: ubuntu-latest
# Linux ARM64 (native runner)
- platform: linux-arm64
os: ubuntu-24.04-arm
# Windows x64
- platform: windows-x64
os: windows-latest
# macOS Intel
- platform: macos-intel
os: macos-13
# macOS Apple Silicon
- platform: macos-arm
os: macos-latest
runs-on: ${{ matrix.os }}
steps:
- name: Checkout repository
uses: actions/checkout@v4
# Linux dependencies
- name: Install Linux dependencies
if: runner.os == 'Linux'
run: |
sudo apt-get update
sudo apt-get install -y \
libwebkit2gtk-4.1-dev \
libayatana-appindicator3-dev \
librsvg2-dev \
patchelf \
libssl-dev \
libgtk-3-dev
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: "20"
cache: "npm"
- name: Cache node_modules
uses: actions/cache@v4
with:
path: node_modules
key: ${{ runner.os }}-${{ runner.arch }}-node-${{ hashFiles('package-lock.json') }}
restore-keys: |
${{ runner.os }}-${{ runner.arch }}-node-
- name: Setup Rust
uses: dtolnay/rust-toolchain@stable
- name: Cache Cargo
uses: Swatinem/rust-cache@v2
with:
workspaces: "src-tauri -> target"
cache-on-failure: true
shared-key: ${{ matrix.platform }}
- name: Install dependencies
run: npm ci
- name: Cargo check
working-directory: src-tauri
run: cargo check --all-targets
# ===========================================
# Full Build Test (Linux only, to verify complete build)
# ===========================================
build-full:
name: Full Build Test
needs: [frontend, rust-lint]
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Install system dependencies
run: |
sudo apt-get update
sudo apt-get install -y \
libwebkit2gtk-4.1-dev \
libayatana-appindicator3-dev \
librsvg2-dev \
patchelf \
libssl-dev \
libgtk-3-dev
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: "20"
cache: "npm"
- name: Cache node_modules
uses: actions/cache@v4
with:
path: node_modules
key: ${{ runner.os }}-node-${{ hashFiles('package-lock.json') }}
restore-keys: |
${{ runner.os }}-node-
- name: Setup Rust
uses: dtolnay/rust-toolchain@stable
- name: Cache Cargo
uses: Swatinem/rust-cache@v2
with:
workspaces: "src-tauri -> target"
cache-on-failure: true
shared-key: build-full
- name: Install dependencies
run: npm ci
- name: Build application
run: npm run tauri:build:dev
env:
TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY }}
TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY_PASSWORD }}
# ===========================================
# Security Audit
# ===========================================
security:
name: Security Audit
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: "20"
cache: "npm"
- name: Cache node_modules
uses: actions/cache@v4
with:
path: node_modules
key: ${{ runner.os }}-node-${{ hashFiles('package-lock.json') }}
restore-keys: |
${{ runner.os }}-node-
- name: Install dependencies
run: npm ci
- name: Run npm audit
run: npm audit --audit-level=high
continue-on-error: true
- name: Setup Rust
uses: dtolnay/rust-toolchain@stable
- name: Cache cargo-audit
uses: actions/cache@v4
with:
path: ~/.cargo/bin/cargo-audit
key: cargo-audit-${{ runner.os }}
- name: Install cargo-audit
run: cargo install cargo-audit --locked || true
- name: Run cargo audit
working-directory: src-tauri
run: cargo audit
continue-on-error: true