Skip to content

Package meshtasticd for Windows as an MSI - #11289

Merged
vidplace7 merged 9 commits into
developfrom
windows-msi-package
Jul 31, 2026
Merged

Package meshtasticd for Windows as an MSI#11289
vidplace7 merged 9 commits into
developfrom
windows-msi-package

Conversation

@caveman99

@caveman99 caveman99 commented Jul 30, 2026

Copy link
Copy Markdown
Member

Installs the Windows build as a background service instead of shipping a bare binary.

  • --service connects meshtasticd to the Service Control Manager. Dispatcher runs on its own thread from parse_opt(), so portduino's main() is unchanged. Stop sets shutdownAtMsec and reuses the existing Power::shutdown() save-and-exit path.
  • MSI installs an auto-start LocalSystem service. Config at %ProgramData%\Meshtastic\config.yaml, NeverOverwrite and Permanent so an edited one survives upgrade and uninstall. Vital="no".
  • bin/build-winget-package.ps1 builds the MSI and emits the winget manifests.
  • CI builds the MSI on every Windows run and uploads it as an artifact.

WiX is pinned below v6, which refuses to build without accepting the Open Source Maintenance Fee EULA.

Not included, deliberately:

  • No main_matrix.yml changes. Attaching the MSI to releases waits for the matrix rework in Actions: Surgical CI - Only run PRs upon actual change #11151, alongside MacOS.
  • package_winget.yml validates manifests against a published release but does not submit them. Publishing to microsoft/winget-pkgs stays manual for now.

Verified: pio run -e native-windows, MSI service/config rows by decompile, winget validate, trunk.

Service lifecycle not exercised end to end, which needs an elevated msiexec and attached hardware.

Summary by CodeRabbit

  • New Features

    • Added Windows MSI packaging and Microsoft Store-compatible manifest generation for x64 and ARM64 releases.
    • Added a Windows service mode that reports startup and shutdown status more reliably.
    • Added a configuration validation mode to identify attempted configuration files and report issues without terminating early.
    • Improved WASM build coverage for supported mesh interfaces.
  • Bug Fixes

    • Fixed Windows service startup and shutdown race conditions, improving reliability when managed by Windows Service Control Manager.

@github-actions

github-actions Bot commented Jul 30, 2026

Copy link
Copy Markdown
Contributor

⚡ Try this PR in the Web Flasher

Flash this PR in the Web Flasher

firmware commit boards expires

Warning

This is an automated, unreviewed CI test build. Back up your device configuration
before flashing, and only flash devices you are able to recover.

Supported boards built by this PR (31)
Device Board Platform
Crowpanel Adv 3.5 TFT elecrow-adv-35-tft esp32-s3
Heltec HT62 heltec-ht62-esp32c3-sx1262 esp32-c3
Heltec Mesh Node 096 heltec-mesh-node-t096 nrf52840
Heltec Mesh Node T1 heltec-mesh-node-t1 nrf52840
Heltec Mesh Node T114 heltec-mesh-node-t114 nrf52840
Heltec V3 heltec-v3 esp32-s3
Heltec V4 heltec-v4 esp32-s3
Meshnology W10 meshnology_w10 esp32-s3
Meshnology W12 meshnology_w12 esp32-s3
Raspberry Pi Pico pico rp2040
Raspberry Pi Pico W picow rp2040
RAK WisMesh Pocket V3 rak_wismesh_pocket nrf52840
RAK WisMesh Pod rak_wismesh_pod nrf52840
RAK WisMesh Repeater Mini V2 rak_wismesh_repeater_mini nrf52840
RAK WisMesh Tag rak_wismeshtag nrf52840
RAK WisBlock 11200 rak11200 esp32
RAK WisBlock 11310 rak11310 rp2040
RAK3312 rak3312 esp32-s3
RAK WisBlock 4631 rak4631 nrf52840
Seeed SenseCAP Mesh-Tracker-X1 seeed_mesh_tracker_X1 nrf52840
Seeed Wio Tracker L1 seeed_wio_tracker_L1 nrf52840
Seeed Xiao NRF52840 Kit seeed_xiao_nrf52840_kit nrf52840
Seeed Xiao ESP32-S3 seeed-xiao-s3 esp32-s3
Station G2 station-g2 esp32-s3
Station G3 station-g3 esp32-s3
LILYGO T-Deck t-deck-tft esp32-s3
LILYGO T-Echo t-echo nrf52840
LILYGO T-Echo Plus t-echo-plus nrf52840
LILYGO T-Impulse Plus t-impulse-plus nrf52840
LilyGo T3-C6 tlora-c6 esp32-c6
Seeed SenseCAP T1000-E tracker-t1000-e nrf52840

Build artifacts expire on 2026-08-29. Updated for f4d7e1e.

@coderabbitai

coderabbitai Bot commented Jul 30, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: b126dc9c-ba9a-4236-ac2a-92898ac431fc

📥 Commits

Reviewing files that changed from the base of the PR and between 46d7ca2 and f4d7e1e.

📒 Files selected for processing (2)
  • src/platform/portduino/PortduinoGlue.cpp
  • variants/native/portduino/platformio.ini

📝 Walkthrough

Walkthrough

Windows builds now package MSI and Winget artifacts, validate release manifests, and support Portduino Windows service lifecycle reporting. Portduino also adds configuration-check CLI handling, while native build linker and source filters are updated.

Changes

Windows packaging and service delivery

Layer / File(s) Summary
Windows service runtime
src/platform/portduino/..., src/main.cpp, variants/native/portduino/platformio.ini
Portduino adds Windows service startup and readiness reporting, handles SCM startup/stop races, adds --check and --service options, and links advapi32.
MSI and Winget manifest builder
bin/build-winget-package.ps1, packaging/windows/meshtasticd.wxs
A PowerShell tool builds or reuses an MSI, computes deterministic product codes, generates Winget manifests, and optionally validates them.
Windows artifact release publication
.github/workflows/build_windows_bin.yml, .semgrepignore
The Windows workflow installs pinned WiX tooling, runs packaging with the release tag, and uploads MSI and manifest artifacts.
Manual Winget validation
.github/workflows/package_winget.yml
The workflow requires exactly one release MSI, extracts its version and architecture, generates manifests, verifies the installer hash, and uploads results.
Native build inputs
variants/native/portduino/platformio.ini
The WASM build now compiles LR2021Interface.cpp while retaining the LR20x0Interface.cpp exclusion.

Estimated code review effort: 4 (Complex) | ~45 minutes

Sequence Diagram(s)

sequenceDiagram
  participant WindowsBuild
  participant WiX
  participant WingetBuilder
  participant ArtifactStore
  WindowsBuild->>WiX: Install WiX 5.0.2
  WindowsBuild->>WingetBuilder: Build MSI and manifests with ReleaseTag
  WingetBuilder->>WiX: Invoke wix build
  WingetBuilder->>WindowsBuild: Return MSI and manifest paths
  WindowsBuild->>ArtifactStore: Upload MSI and manifests
Loading

Possibly related PRs

  • meshtastic/firmware#11031: Introduced the Windows build workflow that this change extends with WiX/MSI and Winget packaging.

Suggested labels: needs-review

Suggested reviewers: vidplace7, thebentern, jp-bennett

🚥 Pre-merge checks | ✅ 3 | ❌ 2

❌ Failed checks (2 warnings)

Check name Status Explanation Resolution
Description check ⚠️ Warning The description explains the change, but it does not follow the required template and omits the attestations section. Replace the freeform text with the repository template, including the attestations checkboxes and any required testing or regression notes.
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (3 passed)
Check name Status Explanation
Title check ✅ Passed The title is concise and accurately summarizes the main change: packaging meshtasticd for Windows as an MSI.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches 💡 1
📝 Generate docstrings 💡
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch windows-msi-package

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

Adds a --service flag connecting meshtasticd to the Service Control
Manager, a WiX MSI installing it as an auto-start LocalSystem service with
config in %ProgramData%\Meshtastic, and a CI step attaching the MSI to
releases.
@caveman99
caveman99 force-pushed the windows-msi-package branch from dfeeefe to cd01592 Compare July 30, 2026 07:41
@caveman99 caveman99 added the enhancement New feature or request label Jul 30, 2026

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🧹 Nitpick comments (4)
bin/build-winget-package.ps1 (1)

92-115: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

New-DeterministicGuid PSScriptAnalyzer hint is a false positive; consider a test instead.

The PSUseShouldProcessForStateChangingFunctions warning doesn't apply here — the function only computes an in-memory GUID and mutates no system state, so ShouldProcess/-WhatIf support isn't meaningful. Given this routine's byte-order manipulation is intricate and directly determines whether major-upgrade ProductCodes stay stable across rebuilds, a small Pester test with a known input/output pair would give more confidence than manual review alone.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@bin/build-winget-package.ps1` around lines 92 - 115, Add a focused Pester
test for New-DeterministicGuid using a fixed namespace and name with a known
expected GUID, covering the RFC 4122 byte-order and version/variant
transformations. Do not add ShouldProcess or -WhatIf support, since the function
only computes and returns an in-memory value.

Source: Linters/SAST tools

.github/workflows/package_winget.yml (1)

36-40: 🎯 Functional Correctness | 🔵 Trivial | 💤 Low value

Select-Object -First 1 silently picks an arbitrary MSI if more than one exists.

Fine today since only one architecture is published per release, but will silently mis-package if a second architecture MSI is ever attached to the same release tag.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/package_winget.yml around lines 36 - 40, Update the
“Generate manifests for the published MSI” step to validate that exactly one MSI
exists under release/download before assigning $msi; fail the workflow with a
clear error when zero or multiple files are found, and pass the single validated
MSI to build-winget-package.ps1 without using Select-Object -First 1.
.github/workflows/build_windows_bin.yml (1)

145-163: 🔒 Security & Privacy | 🔵 Trivial | ⚡ Quick win

Direct template expansion into run: (zizmor template-injection).

Line 154 expands ${{ steps.version.outputs.long }} directly into the PowerShell run: body. Lower risk here since the value is derived from repo build metadata rather than raw user input, but the standard hardening is to pass it via env: and reference $env:VAR instead. See the consolidated comment covering this pattern across files.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/build_windows_bin.yml around lines 145 - 163, The Build
the MSI and winget manifests step directly interpolates
steps.version.outputs.long into its PowerShell run script. Pass the version
through the step’s env configuration and reference the environment variable in
the build-winget-package.ps1 invocation, preserving the existing v-prefixed
ReleaseTag value.

Source: Linters/SAST tools

.github/workflows/main_matrix.yml (1)

531-538: 🔒 Security & Privacy | 🔵 Trivial | ⚡ Quick win

Direct template expansion into run: (zizmor template-injection).

Same pattern as flagged elsewhere: ${{ needs.version.outputs.long }} is expanded directly into the gh release upload command body. See the consolidated comment for the shared fix.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/main_matrix.yml around lines 531 - 538, Update the “Add
sources to GitHub Release” step so needs.version.outputs.long and the other
version outputs are passed through environment variables or step inputs before
the shell runs, rather than interpolated directly in the run script. Use those
shell-safe variables in each gh release upload command while preserving the
existing release tag and asset paths.

Source: Linters/SAST tools

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.github/workflows/package_winget.yml:
- Around line 27-40: Route all GitHub Actions expression values through step
environment variables before using them in run bodies: in
.github/workflows/package_winget.yml lines 27-40, bind inputs.release_tag and
inputs.version and reference them as PowerShell $env variables in both steps; in
.github/workflows/build_windows_bin.yml lines 145-163, bind
steps.version.outputs.long and use the corresponding $env variable; in
.github/workflows/main_matrix.yml lines 531-538, bind needs.version.outputs.long
and use that variable for the gh release upload invocation and shared sibling
lines. Preserve the existing command behavior while removing direct ${{ }}
interpolation from shell scripts.

In `@src/platform/portduino/windows/WindowsService.cpp`:
- Around line 20-39: Synchronize concurrent status reporting in reportStatus,
which is called by both serviceMain and controlHandler. Add the mutex include
and guard the shared checkPoint and serviceStatus updates through
SetServiceStatus with a mutex, ensuring each status snapshot and checkpoint
increment is serialized without changing the existing state behavior.

---

Nitpick comments:
In @.github/workflows/build_windows_bin.yml:
- Around line 145-163: The Build the MSI and winget manifests step directly
interpolates steps.version.outputs.long into its PowerShell run script. Pass the
version through the step’s env configuration and reference the environment
variable in the build-winget-package.ps1 invocation, preserving the existing
v-prefixed ReleaseTag value.

In @.github/workflows/main_matrix.yml:
- Around line 531-538: Update the “Add sources to GitHub Release” step so
needs.version.outputs.long and the other version outputs are passed through
environment variables or step inputs before the shell runs, rather than
interpolated directly in the run script. Use those shell-safe variables in each
gh release upload command while preserving the existing release tag and asset
paths.

In @.github/workflows/package_winget.yml:
- Around line 36-40: Update the “Generate manifests for the published MSI” step
to validate that exactly one MSI exists under release/download before assigning
$msi; fail the workflow with a clear error when zero or multiple files are
found, and pass the single validated MSI to build-winget-package.ps1 without
using Select-Object -First 1.

In `@bin/build-winget-package.ps1`:
- Around line 92-115: Add a focused Pester test for New-DeterministicGuid using
a fixed namespace and name with a known expected GUID, covering the RFC 4122
byte-order and version/variant transformations. Do not add ShouldProcess or
-WhatIf support, since the function only computes and returns an in-memory
value.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: aa1bafcd-069e-46ff-b52c-6bedb5a91c5a

📥 Commits

Reviewing files that changed from the base of the PR and between 9c260ad and cd01592.

📒 Files selected for processing (10)
  • .github/workflows/build_windows_bin.yml
  • .github/workflows/main_matrix.yml
  • .github/workflows/package_winget.yml
  • bin/build-winget-package.ps1
  • packaging/windows/meshtasticd.wxs
  • src/main.cpp
  • src/platform/portduino/PortduinoGlue.cpp
  • src/platform/portduino/windows/WindowsService.cpp
  • src/platform/portduino/windows/WindowsService.h
  • variants/native/portduino/platformio.ini

Comment thread .github/workflows/package_winget.yml Outdated
Comment thread src/platform/portduino/windows/WindowsService.cpp Outdated
@caveman99 caveman99 added the triaged Reviewed by the team, has enough information and ready to work on now. label Jul 30, 2026
Bind workflow expressions to env vars in run: bodies, and build the
service status per call with an atomic checkpoint.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@src/platform/portduino/windows/WindowsService.cpp`:
- Around line 21-42: Update reportStatus to serialize concurrent status updates
and track when shutdown begins, ensuring that once SERVICE_STOP_PENDING is
reported, later startup or running reports are suppressed. Preserve stop-related
reporting and existing checkpoint behavior while preventing startup polling from
overwriting the shutdown state.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: d2dabb70-38f0-4b18-b297-dd9685b4f198

📥 Commits

Reviewing files that changed from the base of the PR and between cd01592 and c7cd7e9.

📒 Files selected for processing (6)
  • .github/workflows/build_windows_bin.yml
  • .github/workflows/main_matrix.yml
  • .github/workflows/package_winget.yml
  • bin/build-winget-package.ps1
  • packaging/windows/meshtasticd.wxs
  • src/platform/portduino/windows/WindowsService.cpp
🚧 Files skipped from review as they are similar to previous changes (2)
  • bin/build-winget-package.ps1
  • .github/workflows/package_winget.yml

Comment thread src/platform/portduino/windows/WindowsService.cpp
Latch the stop under a mutex so a startup report cannot walk the state
back. Ignore the new workflows in semgrep and checkov, as main_matrix
already is.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.trunk/trunk.yaml:
- Around line 112-116: Replace the broad Checkov file-level ignore for
package_winget.yml in the Trunk configuration with a targeted inline suppression
for checkov/CKV_GHA_7, using the existing workflow’s suppression convention.
Remove the linters: [checkov] path entry so other Checkov findings remain
enabled.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: d3ab6a34-33f7-4f0f-9c32-41d2fd6c09f8

📥 Commits

Reviewing files that changed from the base of the PR and between c7cd7e9 and 9f719b2.

📒 Files selected for processing (3)
  • .semgrepignore
  • .trunk/trunk.yaml
  • src/platform/portduino/windows/WindowsService.cpp

Comment thread .trunk/trunk.yaml Outdated
Comment on lines +112 to +116
# CKV_GHA_7 wants workflow_dispatch inputs empty, but the manual winget validation run
# needs a tag and version. Ignored at file level to keep the workflow suppression-free.
- linters: [checkov]
paths:
- .github/workflows/package_winget.yml

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔒 Security & Privacy | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "== repository files =="
git ls-files | rg '(^|/)(\.trunk/trunk\.yaml|package_winget\.yml)$|trunk|checkov' || true

echo
echo "== trunk.yaml around referenced lines =="
if [ -f .trunk/trunk.yaml ]; then
  nl -ba .trunk/trunk.yaml | sed -n '90,130p'
else
  echo ".trunk/trunk.yaml not found"
fi

echo
echo "== workflow referenced file existence/size =="
if [ -f .github/workflows/package_winget.yml ]; then
  wc -l .github/workflows/package_winget.yml
  nl -ba .github/workflows/package_winget.yml | sed -n '1,220p'
else
  echo ".github/workflows/package_winget.yml not found"
fi

echo
echo "== checkov skip/suppression/docs references in repo =="
rg -n "ckv_gha_7|CKV_GHA_7|\.checkov|checkov skip|checkov-suppress|linters:\s*\[checkov\]" .trunk .github . 2>/dev/null || true

Repository: meshtastic/firmware

Length of output: 747


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "== relevant files =="
for f in .trunk/trunk.yaml .github/workflows/package_winget.yml .github/workflows/trunk_annotate_pr.yml .github/workflows/trunk_check.yml; do
  if [ -f "$f" ]; then
    echo "--- $f ($(wc -l < "$f") lines) ---"
    sed -n '1,220p' "$f"
  else
    echo "--- $f not found ---"
  fi
done

echo
echo "== search suppression/checkov references =="
grep -RInEi "ckv_gha_7|CKV_GHA_7|\.checkov|checkov skip|checkov-suppress|linters:\s*\[checkov\]|suppress-checkov|skip_checkov" .trunk .github . 2>/dev/null || true

Repository: meshtastic/firmware

Length of output: 9509


🌐 Web query:

Trunk linter ignore syntax file level all linters path ignored all rules linters [ALL]

💡 Result:

To ignore all rules for all linters in specific files within your Trunk configuration, you should use the ignore key in your .trunk/trunk.yaml file [1][2]. Under the lint section, you can define a list of ignored paths by specifying linters: [ALL] [1][3]. This tells Trunk to skip all linting checks for the files matching the provided glob patterns [1][2]. Example configuration in .trunk/trunk.yaml: yaml lint: ignore: - linters: [ALL] paths: - path/to/ignore/ - another/specific/file.ext Key points regarding this configuration: - The paths are relative to the root of your repository [1][2]. - You can use glob patterns to match multiple files or directories [1][2]. - If you need to include specific files within an ignored directory, you can use the ! prefix for an inverse ignore (e.g., - !path/to/ignore/important_file.ext) [1][2]. - Trunk is also git-aware and will automatically ignore files that are defined in your .gitignore [1][2]. If you only need to suppress all issues for a specific linter in a single file via code comments, you can use // trunk-ignore-all(<linter-name>) at the top of that file [1][4][2]. However, for a broad, rule-independent exclusion of all linters for specific paths, the trunk.yaml configuration above is the standard and recommended approach [1][3].

Citations:


🌐 Web query:

Trunk code quality ignore all rules specific linter specific file trunk.yaml linters: [lint-name]

💡 Result:

To ignore specific linters for specific files or paths in Trunk, you should use the ignore key within your.trunk/trunk.yaml configuration file [1][2]. The ignore configuration allows you to define a list of rules, where each entry specifies the linters to ignore and the associated file paths [1][3]. Example configuration in.trunk/trunk.yaml: lint: ignore: - linters: [eslint] paths: - path/to/specific/file.ts - path/to/directory/ - linters: [ALL] paths: - src/generated/ Key details: - linters: You can provide a list of specific linter names (e.g., [eslint, black]) or use the special [ALL] tag to ignore all linters for the specified paths [1][2]. - paths: These are glob patterns relative to the root of your repository [1][3]. You can use! at the start of a path to create an inverse ignore (e.g., to exclude a subdirectory within an ignored path) [1][3]. If you only need to ignore issues on specific lines within a file, you can use inline comment directives instead of modifying the YAML config [1][4]. For example: // trunk-ignore(linter-name) const unusedVariable = 42; Or to ignore all issues on a specific line: // trunk-ignore const unusedVariable = 42; To ignore all issues in an entire file via comments, you can add this to the top of the file: // trunk-ignore-all(linter-name) Trunk is also git-aware and will ignore files listed in your.gitignore by default [1][3].

Citations:


🌐 Web query:

Trunk config ignore multiple linter-specific entries paths can have multiple rules single linter path

💡 Result:

In Trunk, you can ignore specific files and paths for one or more linters by using the lint.ignore key within your .trunk/trunk.yaml configuration file [1][2]. Each entry in the lint.ignore list requires two keys: linters and paths [1][3]. linters: A list of linter names (e.g., [eslint, black]) or the special [ALL] tag to apply the ignore rule to every enabled linter [1][3]. paths: A list of glob patterns relative to the repository root [1][3]. You can define multiple ignore entries to handle different requirements, such as ignoring specific files for one linter while ignoring different paths for all linters [2]. Trunk also supports inverse ignores using the ! prefix, which ensures that files matching that glob will not be ignored even if they are caught by other ignore patterns [1][3]. Example configuration: lint: ignore: # Ignore generated files for all linters - linters: [ALL] paths: - src/generated/ - test/test_data # Ignore a specific file only for eslint - linters: [eslint] paths: - c/run.ts # Inverse ignore: ignore all files in a directory except specific ones - linters: [ALL] paths: - src/generated/ -!src/generated//*.foo Trunk is also git-aware and automatically ignores files specified in your.gitignore file by default [1][3].

Citations:


🌐 Web query:

Trunk trunk-ignore-checkov-specific-rule inline suppression

💡 Result:

To suppress a specific Checkov rule inline when using Trunk, you should use the Trunk-specific ignore syntax rather than the native Checkov comment syntax [1][2]. Trunk provides a standardized inline suppression mechanism that applies to all supported linters, including Checkov [1]. You can suppress a specific Checkov rule on a given line by adding the following comment: // trunk-ignore(checkov/CHECK_ID) Replace CHECK_ID with the specific Checkov rule ID (e.g., CKV_AWS_123) [1]. For example, to suppress the rule CKV_AWS_123: # trunk-ignore(checkov/CKV_AWS_123) resource "aws_s3_bucket" "example" {... } If you wish to suppress all Checkov issues on a specific line, you can omit the rule ID [1]: # trunk-ignore(checkov) resource "aws_s3_bucket" "example" {... } While native Checkov allows inline suppression using checkov:skip=<check_id> [3][4], using the Trunk-native trunk-ignore syntax is the recommended approach within the Trunk ecosystem as it ensures Trunk is aware of the suppression and can manage it consistently across your project [1].

Citations:


Scope the file-level Checkov ignore to CKV_GHA_7.

linters: [checkov] silences every Checkov rule for package_winget.yml, but this only exists to allow non-empty workflow_dispatch inputs. Add the targeted inline suppression used elsewhere, e.g. # trunk-ignore(checkov/CKV_GHA_7), and remove the broad file-level ignore so future workflow security findings remain visible.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.trunk/trunk.yaml around lines 112 - 116, Replace the broad Checkov
file-level ignore for package_winget.yml in the Trunk configuration with a
targeted inline suppression for checkov/CKV_GHA_7, using the existing workflow’s
suppression convention. Remove the linters: [checkov] path entry so other
Checkov findings remain enabled.

Resolve the newest release inside the job instead of taking
workflow_dispatch inputs, so CKV_GHA_7 no longer fires and checkov stays
active on the file.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.github/workflows/package_winget.yml:
- Around line 25-30: Update the MSI selection and packaging flow around the
`$msi` and `$version` assignments so it explicitly selects the x64 asset
expected by `build-winget-package.ps1`'s default `Architecture`, or extracts the
selected filename architecture and passes it through to that script. Ensure the
generated manifest architecture always matches the downloaded MSI URL and hash,
rather than allowing arbitrary arm64 selection.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: c8907831-5177-43da-8a69-11ba47ade8ff

📥 Commits

Reviewing files that changed from the base of the PR and between 9f719b2 and 5a1166f.

📒 Files selected for processing (1)
  • .github/workflows/package_winget.yml

Comment thread .github/workflows/package_winget.yml Outdated
Parse it from the asset name instead of defaulting to x64, and fail on a
multi-arch release rather than validating one at random.
Writes the MSI and the three winget manifests into -OutputDirectory. The installer manifest
pins the MSI's SHA256, so the file must be published unchanged at -InstallerUrl.

WiX is required, pinned below v6, which refuses to build without accepting the OSMF EULA:

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Seeing WiX triggers a lot of dayjob PTSD 😅

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think the native service control interface is the real win here ;-)

@thebentern

Copy link
Copy Markdown
Contributor

LGTM overall. We may consider doing an arch specific build for arm64. It's fine for now because Meshtastic is not resource intensive and it should run fine through the x64 emulation layer.

@thebentern
thebentern requested a review from vidplace7 July 30, 2026 11:31
Comment thread .github/workflows/main_matrix.yml
@caveman99
caveman99 requested a review from vidplace7 July 30, 2026 12:37
Release attachment moves to the matrix rework in #11151. The MSI is still
built and uploaded as a CI artifact.
@caveman99
caveman99 force-pushed the windows-msi-package branch from 69a6543 to 9e68447 Compare July 30, 2026 12:40
@caveman99
caveman99 enabled auto-merge July 30, 2026 12:52
@vidplace7

Copy link
Copy Markdown
Member

LGTM overall. We may consider doing an arch specific build for arm64. It's fine for now because Meshtastic is not resource intensive and it should run fine through the x64 emulation layer.

image As far as I can see, we actually *can't* ship an arm64 build without switching msys2 toolchains (from gcc to clang/llvm)

# Conflicts:
#	src/platform/portduino/PortduinoGlue.cpp
@caveman99
caveman99 added this pull request to the merge queue Jul 30, 2026
@github-merge-queue
github-merge-queue Bot removed this pull request from the merge queue due to failed status checks Jul 31, 2026
@vidplace7
vidplace7 enabled auto-merge July 31, 2026 03:23
@vidplace7
vidplace7 added this pull request to the merge queue Jul 31, 2026
Merged via the queue into develop with commit ecd59e3 Jul 31, 2026
56 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request triaged Reviewed by the team, has enough information and ready to work on now.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants