|
Some checks are pending
Build binaries / build-binaries (push) Waiting to run
Check automated documentation is up-to-date / check-doc-gen (push) Waiting to run
CodeQL / Analyze (push) Waiting to run
Deploy Fleet website / build (20.x) (push) Waiting to run
Apply latest configuration to dogfood with GitOps / fleet-gitops (push) Waiting to run
Test latest changes in fleetctl preview / test-preview (ubuntu-latest) (push) Waiting to run
golangci-lint / lint (push) Waiting to run
golangci-lint / lint-incremental (push) Waiting to run
Docker publish / publish (push) Waiting to run
Ingest maintained apps / build (push) Waiting to run
OSSF Scorecard / Validate Gradle wrapper (push) Waiting to run
OSSF Scorecard / Scorecard analysis (push) Waiting to run
Sync Maintained Apps Outputs to R2 / sync-to-r2 (push) Waiting to run
Test DB Changes / test-db-changes (push) Waiting to run
Run fleetd-chrome tests / test-fleetd-chrome (ubuntu-latest) (push) Waiting to run
Go tests (activity) / test-go-activity (mysql:8.0.44) (push) Waiting to run
Go tests (activity) / test-go-activity (mysql:9.5.0) (push) Waiting to run
Go tests (activity) / test-go-activity-extended-mysql (mysql:8.0.42) (push) Waiting to run
Go tests (activity) / test-go-activity-extended-mysql (mysql:8.4.8) (push) Waiting to run
Go tests (activity) / upload-coverage (push) Blocked by required conditions
Go tests (activity) / aggregate-result (push) Blocked by required conditions
Go Tests / test-go-no-db (fast) (push) Waiting to run
Go Tests / test-go-no-db (scripts) (push) Waiting to run
Go Tests / test-go (mysql:8.0.44, fleetctl) (push) Waiting to run
Go Tests / test-go (mysql:8.0.44, integration-core) (push) Waiting to run
Go Tests / test-go (mysql:8.0.44, integration-enterprise) (push) Waiting to run
Go Tests / test-go (mysql:8.0.44, integration-mdm) (push) Waiting to run
Go Tests / test-go (mysql:8.0.44, main) (push) Waiting to run
Go Tests / test-go (mysql:8.0.44, mysql) (push) Waiting to run
Go Tests / test-go (mysql:8.0.44, service) (push) Waiting to run
Go Tests / test-go (mysql:8.0.44, vuln) (push) Waiting to run
Go Tests / test-go (mysql:9.5.0, fleetctl) (push) Waiting to run
Go Tests / test-go (mysql:9.5.0, integration-core) (push) Waiting to run
Go Tests / test-go (mysql:9.5.0, integration-enterprise) (push) Waiting to run
Go Tests / test-go (mysql:9.5.0, integration-mdm) (push) Waiting to run
Go Tests / test-go (mysql:9.5.0, main) (push) Waiting to run
Go Tests / test-go (mysql:9.5.0, mysql) (push) Waiting to run
Go Tests / test-go (mysql:9.5.0, service) (push) Waiting to run
Go Tests / test-go (mysql:9.5.0, vuln) (push) Waiting to run
Go Tests / test-go-extended-mysql (mysql:8.0.42, fleetctl) (push) Waiting to run
Go Tests / test-go-extended-mysql (mysql:8.0.42, integration-core) (push) Waiting to run
Go Tests / test-go-extended-mysql (mysql:8.0.42, integration-enterprise) (push) Waiting to run
Go Tests / test-go-extended-mysql (mysql:8.0.42, integration-mdm) (push) Waiting to run
Go Tests / test-go-extended-mysql (mysql:8.0.42, mysql) (push) Waiting to run
Go Tests / test-go-extended-mysql (mysql:8.0.42, vuln) (push) Waiting to run
Go Tests / test-go-extended-mysql (mysql:8.4.8, fleetctl) (push) Waiting to run
Go Tests / test-go-extended-mysql (mysql:8.4.8, integration-mdm) (push) Waiting to run
Go Tests / test-go-extended-mysql (mysql:8.4.8, main) (push) Waiting to run
Go Tests / test-go-extended-mysql (mysql:8.4.8, mysql) (push) Waiting to run
Go Tests / test-go-extended-mysql (mysql:8.4.8, service) (push) Waiting to run
Go Tests / test-go-nanomdm (push) Waiting to run
Go Tests / upload-coverage (push) Blocked by required conditions
Go Tests / aggregate-result (push) Blocked by required conditions
JavaScript Tests / test-js (ubuntu-latest) (push) Waiting to run
JavaScript Tests / lint-js (ubuntu-latest) (push) Waiting to run
Test Mock Changes / test-mock-changes (push) Waiting to run
Test Puppet / test-puppet (push) Waiting to run
Go Tests / test-go-extended-mysql (mysql:8.0.42, main) (push) Waiting to run
Go Tests / test-go-extended-mysql (mysql:8.0.42, service) (push) Waiting to run
Go Tests / test-go-extended-mysql (mysql:8.4.8, integration-core) (push) Waiting to run
Go Tests / test-go-extended-mysql (mysql:8.4.8, integration-enterprise) (push) Waiting to run
Go Tests / test-go-extended-mysql (mysql:8.4.8, vuln) (push) Waiting to run
Test native tooling packaging / test-packaging (local, ubuntu-latest) (push) Waiting to run
Test native tooling packaging / test-packaging (remote, ubuntu-latest) (push) Waiting to run
Automated ingestion of latest Fleet-maintained app data. <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **Chores** * Updated version metadata for maintained macOS applications: Mattermost (6.1.2), OneDrive (26.055.0323.0004), and Windsurf (2.0.63). Each update includes refreshed installer URLs and corresponding checksums to ensure proper installation and security verification. <!-- end of auto-generated comment: release notes by coderabbit.ai --> Co-authored-by: allenhouchins <32207388+allenhouchins@users.noreply.github.com> |
||
|---|---|---|
| .. | ||
| ingesters | ||
| inputs | ||
| outputs | ||
| maintained_apps.go | ||
| README.md | ||
| script-diff.sh | ||
Fleet-maintained apps (FMA)
Adding a new app (macOS)
-
Find the app's metadata in its Homebrew formulae
-
Create a new manifest file called
$YOUR_APP_NAME.jsonin theinputs/homebrew/directory. For example, if you wanted to add Box Drive, create the fileinputs/homebrew/box-drive.json. -
Fill out the file according to the input schema below. For our example Box Drive app, it would look like this:
{ "name": "Box Drive", "slug": "box-drive/darwin", "unique_identifier": "com.box.desktop", "token": "box-drive", "installer_format": "pkg", "default_categories": ["Productivity"] } -
Run the following command from the root of the Fleet repo to generate the app's output data:
go run cmd/maintained-apps/main.go --slug="<slug-name>" --debug -
The contributor is responsible for adding the icon to Fleet (e.g. the TypeScript and website PNG components of #29175). These are generated using the generate-icons script. The script automatically adds the import statement and map entry to
frontend/pages/SoftwarePage/components/icons/index.ts, so you don't need to manually update the index file. -
Add a description for the app in
outputs/apps.jsonfile. You can use descriptions from Homebrew formulae. For consistency and presentation on the website, the description should follow sentence casing and the following format:<App Name>is a(n) (copy description from Homebrew)., making sure to end with a.. -
Open a PR to the
fleetrepository with the above changes. The #g-software Engineering Manager (EM) is automatically added reviewer. Also, @ mention the Fleet-maintained apps DRI. -
If the app passes automated tests, it is approved and merged. The EM reviews the PR within 3 business days. The app should appear shortly in the Fleet-maintained apps section when adding new software to Fleet. The app icon will not appear in Fleet until the following release.
macOS input file schema
| Name | Type | Description |
|---|---|---|
name |
string | Required. User-facing name of the application. |
unique_identifier |
string | Required. Platform-specific unique identifier (e.g., bundle identifier on macOS). |
token |
string | Required. Homebrew's unique identifier. It's the token field of the Homebrew API response. |
installer_format |
string | Required. File format of the installer (zip, dmg, pkg). Determine via the file extension in the Homebrew API url field or by downloading the installer if the extension isn’t present. |
slug |
string | Required. Identifies the app/platform combination (e.g., box-drive/darwin). Used to name manifest files and reference the app in Fleet's best practice GitOps. Format: <app-name>/<platform>, where app name is filesystem-friendly and platform is darwin. |
default_categories |
string | Required. Default categories for self-service if none are specified. Valid values: Browsers, Communication, Developer Tools, Productivity. |
pre_uninstall_scripts |
string | Command lines run before the generated uninstall script (e.g., for Box). |
post_uninstall_scripts |
string | Command lines run after the generated uninstall script (e.g., for Box). |
install_script_path |
string | Filepath to a custom install script (.sh). Overrides the generated install script. Script must be placed in inputs/homebrew/scripts/. |
uninstall_script_path |
string | Filepath to a custom uninstall script (.sh). Overrides the generated uninstall script. Cannot be used together with pre_uninstall_scripts or post_uninstall_scripts. Script must be placed in inputs/homebrew/scripts/. |
Adding a new app (Windows)
-
Find the Winget
PackageIdentifierin the relevant winget-pkgs repo manifest. -
Get the unique identifier that Fleet will use for matching the software with software inventory:
- On a test Windows host, install the app manually, then run the following PowerShell script that correlates to the defined
installer_scope:- Machine scope:
Get-ItemProperty 'HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\*' -ErrorAction SilentlyContinue | Where-Object {$_.DisplayName -like '*<App Name>*'} | Select-Object DisplayName, DisplayVersion, Publisher - User scope:
Get-ItemProperty 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Uninstall\*' -ErrorAction SilentlyContinue | Where-Object {$_.DisplayName -like '*<App Name>*'} | Select-Object DisplayName, DisplayVersion, Publisher
- Machine scope:
If the unique_identifier doesn't match the DisplayName, then Fleet will incorrectly create two software titles when the Fleet-maintained app is added and later installed. One title for the Fleet-maintained app and a separate title for the inventoried software.
- Fill out the file according to the input schema. For example, Box Drive looks like this:
{
"name": "Box Drive",
"slug": "box-drive/windows",
"package_identifier": "Box.Box",
"unique_identifier": "Box",
"installer_arch": "x64",
"installer_type": "msi",
"installer_scope": "machine",
"default_categories": ["Productivity"]
}
- Run
go run cmd/maintained-apps/main.go --slug="<app-name>/windows" --debugfrom the root of the Fleet repo to generate the app's output data, replacing<app-name>with your app's name, for example:
go run cmd/maintained-apps/main.go --slug="box-drive/windows" --debug
-
The contributor is responsible for adding the icon to Fleet (e.g. the TypeScript and website PNG components of #29175). These are generated using the generate-icons script. The script automatically adds the import statement and map entry to
frontend/pages/SoftwarePage/components/icons/index.ts, so you don't need to manually update the index file. -
Add a description for the app in outputs/apps.json file. You can use descriptions from the wingest manifest.
-
Open a PR to the fleet repository with the above changes. The #g-software Engineering Manager (EM) is automatically added reviewer. Also, @ mention the #g-software Product Designer (PD) in a comment that points them to the new icon. This way, the icon change gets a second pair of eyes.
-
If the app passes automated tests, it is approved and merged. The EM reviews the PR within 3 business days. The app should appear shortly in the Fleet-maintained apps section when adding new software to Fleet. The app icon will not appear in Fleet until the following release.
Windows input file schema
| Name | Type | Description |
|---|---|---|
name |
string | Required. User-facing name of the application. |
unique_identifier |
string | Required. Platform-specific unique identifier. For Windows, this is the DisplayName. |
package_identifier |
string | Required. The PackageIdentifier from winget. Fleet uses this to pull the correct metadata for the app. |
slug |
string | Required. Identifies the app/platform combination (e.g., box-drive/windows). Used to name manifest files and reference the app in Fleet's best practice GitOps. Format: <app-name>/<platform>, where app name is filesystem-friendly and platform is darwin. |
installer_arch |
string | Required. x64 or x86 (most apps use x64). |
installer_type |
string | Required. exe, msi, or msix (file type, not vendor tech like "wix") |
installer_scope |
string | Required. machine or user (prefer machine for managed installs) |
default_categories |
string | Required. Default categories for self-service if none are specified. Valid values: Browsers, Communication, Developer Tools, Productivity. |
install_script_path |
string | Filepath to a custom install script (.ps1). Overrides the generated install script. Script must be placed in inputs/winget/scripts/. For .msi apps, the ingestor automatically generates install scripts. Do not add scripts unless you need to override the generated behavior. For .exe apps, you must provide PowerShell scripts that run the installer file directly. Fleet stores the installer and sends it to the host at install time; your script must execute it using the INSTALLER_PATH environment variable. |
uninstall_script_path |
string | Filepath to a custom uninstall script (.ps1). Overrides the generated uninstall script. Script must be placed in inputs/winget/scripts/. For .msi apps, the ingestor automatically generates uninstall scripts. Do not add scripts unless you need to override the generated behavior. For .exe apps, you must provide a script to uninstall the app. Scripts for .exe apps are vendor-specific. Use the vendor’s documented silent uninstall switch or the registered UninstallString (if available), ensuring the script runs silently and returns the installer’s exit code. |
fuzzy_match_name |
boolean | If the unique_identifier doesn't match the DisplayName, use fuzzy_match_name to specify that Fleet uses "fuzzy matching" to match the Fleet-maintained app and the inventoried software. For example, for Pritunl, the unique_identifier is "Pritunl" and the inventories software's DisplayName is "Pritunl Client". With fuzzy_match_name set to true, Pritunl app will be matched to the inventories software. |
Windows troubleshooting
- App not found in Fleet UI: ensure
apps.jsonwas updated by the generator and your override URL is correct - Install fails silently: confirm your
installer_type,installer_arch, andinstaller_scopematch the selected winget installer; run your PowerShell script manually on a test host - Uninstall doesn’t remove the app: prefer explicit uninstall scripts; otherwise, ensure the winget manifest exposes
ProductCodeorUpgradeCode - Hash mismatch errors: if the upstream manifest is in flux, you can set
ignore_hash: truein the input JSON (use sparingly)
Can I do this on macOS?
The instructions below are meant to be run on a Windows host. But, you can run most of this on a macOS host, as well:
- You can author Windows inputs and run the generator on macOS. The ingester is Go code that fetches data from winget/GitHub and works cross‑platform.
- To find the PackageName and Publisher, you can look in the locale and installer yaml files in the winget-pkgs repo.
- Validation and testing still require a Windows host (to verify programs.name and to run install/uninstall).
Updating existing Fleet-maintained apps
Fleet-maintained apps need to be updated as frequently as possible while maintaining reliability. This is currently a balancing act as both scenarios below result in customer workflow blocking bugs:
- App vendor updates to installers can break install/uninstall scripts
- App vendors will deprecate download links for older installers
A Github action periodically creates a PR that updates one or more apps in the catalog by:
- Bumping versions
- Regenerating install/uninstall scripts
Each app updated in the PR must be validated independently. Only merge the PR if all apps changed meet the following criteria:
- App can be downloaded using manifest URL
- App installs successfully on host using manifest install script
- App exists on host
- App uninstalls successfully on host using manifest uninstall script
If an app does not pass test criteria:
- Freeze the app
- File a bug for tracking
Freezing an existing Fleet-maintained app
If any app fails validation:
-
Do not merge the PR as-is.
-
Add
"frozen": true"to the failing app's input file (e.g.,inputs/homebrew/<app>.json). -
Revert its corresponding output manifest file (e.g.,
outputs/<slug>.json) to the version in themainbranch:git checkout origin/main -- ee/maintained-apps/outputs/<slug>.json -
Validate changes in the frozen input file by running the following. This should output no errors and generate no changes.
go run cmd/maintained-apps/main.go --slug="<slug>" --debug -
Commit both the input change and the output file revert to the same PR.