From e7ccc8b97fc492f3f033a959258af49cf404ba01 Mon Sep 17 00:00:00 2001 From: SuperKali Date: Mon, 22 Dec 2025 13:56:25 +0100 Subject: [PATCH] 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 --- .github/ISSUE_TEMPLATE/bug_report.yml | 139 ++++++++ .github/ISSUE_TEMPLATE/config.yml | 8 + .github/ISSUE_TEMPLATE/feature_request.yml | 94 +++++ .github/labels.yml | 378 +++++++++++++++++++++ .github/workflows/pr-check.yml | 271 +++++++++++++++ 5 files changed, 890 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/bug_report.yml create mode 100644 .github/ISSUE_TEMPLATE/config.yml create mode 100644 .github/ISSUE_TEMPLATE/feature_request.yml create mode 100644 .github/labels.yml create mode 100644 .github/workflows/pr-check.yml diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml new file mode 100644 index 0000000..48213f8 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -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 diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 0000000..382898b --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -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 diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml new file mode 100644 index 0000000..281c3d5 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.yml @@ -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 diff --git a/.github/labels.yml b/.github/labels.yml new file mode 100644 index 0000000..7741ec5 --- /dev/null +++ b/.github/labels.yml @@ -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 diff --git a/.github/workflows/pr-check.yml b/.github/workflows/pr-check.yml new file mode 100644 index 0000000..5ca1947 --- /dev/null +++ b/.github/workflows/pr-check.yml @@ -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