Files
Allen Houchins 6ff485fcdd Support custom tap folder for apps without casks; add three apps (#43784)
This pull request introduces support for ingesting Homebrew casks from
third-party taps (not available in the official
`Homebrew/homebrew-cask`) into the Fleet Maintained Apps (FMA) system.
It does this by allowing cask metadata to be committed directly into the
repository and referenced via a new `cask_path` field. The PR also
updates CI workflows to better support Fleet Desktop validation and
documents the new contributor flow.

**Support for custom Homebrew casks:**

* Added a new `cask_path` field to app manifests, allowing the FMA
ingester to read cask metadata from a local JSON file instead of
fetching from the Homebrew API. This enables ingestion of apps from
third-party taps or custom casks not present in the official Homebrew
repository.
[[1]](diffhunk://#diff-be469dd148f0c50ad56489c48bdb514522e1a46d21336e8f747b5880d71a6d1bR49-R66)
[[2]](diffhunk://#diff-abd7db4bef16a062c1bd81f54a7c846f1e91b913a9fe9f87976c8075f39b8cd2R270-R276)
* Refactored the Homebrew ingester (`brewIngester`) to use a new
`fetchCask` helper, which reads from the local file if `cask_path` is
set, or falls back to the API otherwise. Includes robust error handling.
[[1]](diffhunk://#diff-abd7db4bef16a062c1bd81f54a7c846f1e91b913a9fe9f87976c8075f39b8cd2L99-R101)
[[2]](diffhunk://#diff-abd7db4bef16a062c1bd81f54a7c846f1e91b913a9fe9f87976c8075f39b8cd2R200-R251)
* Added comprehensive documentation and examples for the custom tap
workflow, including a new `custom-tap/` directory with cask DSL sources,
generated JSON, and a regeneration script.
[[1]](diffhunk://#diff-2dfa2fc79b9becad555db38289a16afe4ce651665a31868d386fed8b4e160740R1-R85)
[[2]](diffhunk://#diff-be469dd148f0c50ad56489c48bdb514522e1a46d21336e8f747b5880d71a6d1bR49-R66)
* Added new custom casks for `fleet-desktop`, `druva-insync`, and
`zoom-rooms` under `inputs/homebrew/custom-tap/Casks/`.
[[1]](diffhunk://#diff-2555a54830de2bfb0ffca8bc487aac67de84dee5d431fe5f42e90e1754f63bb6R1-R36)
[[2]](diffhunk://#diff-db1fa8a43a27c5adf49a5ade04e61405ce1e9420f266e3160156cabf69ed4ea8R1-R40)
[[3]](diffhunk://#diff-effd461583140683d41dc68d9a93692d039be5ad5e52b6b108ece79f17155107R1-R44)

**Testing and validation:**

* Added a new test (`TestIngestCaskPath`) to ensure the ingester
correctly reads from `cask_path` and does not make unnecessary HTTP
requests, with error handling for missing files.

**CI workflow improvements:**

* Updated GitHub Actions workflows to handle Fleet Desktop's installer
requirements in CI by creating a managed preferences stub when
validating Fleet Desktop, ensuring the installer succeeds even without
MDM enrollment.
[[1]](diffhunk://#diff-28b30c8601cb7662d59efbfbbcf800cae91455fd3d875627659dced8c1257a24R100)
[[2]](diffhunk://#diff-28b30c8601cb7662d59efbfbbcf800cae91455fd3d875627659dced8c1257a24R116-R123)
[[3]](diffhunk://#diff-28b30c8601cb7662d59efbfbbcf800cae91455fd3d875627659dced8c1257a24R148-R172)
[[4]](diffhunk://#diff-c263ffc3062c3b5e4e4eb65976080c6cbddac478a5fed3392fe8b23c49bb2da8R69-R92)

These changes make it possible to maintain and test apps from custom
Homebrew taps within the Fleet repo, improving flexibility and
reliability for Fleet-maintained apps.

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **New Features**
* Added support for three new macOS apps: Fleet Desktop, Druva inSync,
and Zoom Rooms
  * Added UI icons for Fleet Desktop and Zoom Rooms
* **Enhancements**
* Fleet Desktop includes an MDM enrollment caveat and improved installer
validation for macOS installers
* Support for overriding Homebrew cask input via a local cask JSON file
* **Tests**
  * Added unit coverage for local cask JSON ingestion behavior
* **Chores**
* Added a deterministic script to regenerate Homebrew custom-tap
manifests
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2026-04-29 20:30:51 -05:00

124 lines
4.0 KiB
JSON

{
"$schema": "http://json-schema.org/draft/2020-12/schema",
"type": "object",
"title": "Homebrew-based Fleet-maintained apps input schema",
"description": "Specify metadata to source a Fleet-maintained app from Homebrew.",
"required": [
"name",
"unique_identifier",
"token",
"installer_format",
"slug",
"default_categories"
],
"properties": {
"name": {
"type": "string",
"description": "The user-facing name of the application.",
"minLength": 1
},
"unique_identifier": {
"type": "string",
"description": "The platform-specific unique identifier for the app. On macOS, this is the app's bundle identifier.",
"minLength": 1
},
"token": {
"type": "string",
"description": "The identifier used by homebrew for the app; it is the token field on the homebrew API response.",
"minLength": 1
},
"installer_format": {
"type": "string",
"description": "The file format for the app's installer.",
"enum": ["zip", "dmg", "pkg"]
},
"slug": {
"type": "string",
"description": "The slug identifies a specific app and platform combination. It is used to name the manifest files that contain the metadata that Fleet needs to add, install, and uninstall this app. Format: app-name/platform (e.g., adobe-acrobat-reader/darwin)",
"pattern": "^[a-z0-9-+@]+/darwin$",
"minLength": 1
},
"pre_uninstall_scripts": {
"type": "array",
"description": "Command lines that will be run before the generated uninstall script is executed.",
"items": {
"type": "string",
"minLength": 1
}
},
"post_uninstall_scripts": {
"type": "array",
"description": "Command lines that will be run after the generated uninstall script is executed.",
"items": {
"type": "string",
"minLength": 1
}
},
"default_categories": {
"type": "array",
"description": "The default categories assigned to the installer in self-service if no categories are specified when it is added to a team's library.",
"items": {
"type": "string",
"enum": ["Browsers", "Communication", "Developer tools", "Productivity", "Security", "Utilities"]
},
"minItems": 1,
"uniqueItems": true
},
"install_script_path": {
"type": "string",
"description": "A filepath to an install script. If provided, this script will override the generated install script.",
"minLength": 1,
"pattern": "\\.sh$"
},
"uninstall_script_path": {
"type": "string",
"description": "A filepath to an uninstall script. If provided, this script will override the generated uninstall script.",
"minLength": 1,
"pattern": "\\.sh$"
},
"frozen": {
"type": "boolean",
"description": "If true, the app will not be processed during ingestion and no new output will be created."
},
"cask_path": {
"type": "string",
"description": "Path (relative to the repo root) to a local file containing the cask JSON in the same schema as https://formulae.brew.sh/api/cask/<token>.json. Used to commit cask metadata for third-party taps directly into this repo under inputs/homebrew/custom-tap/.",
"minLength": 1,
"pattern": "\\.json$"
}
},
"not": {
"allOf": [
{
"properties": {
"uninstall_script_path": {
"type": "string"
}
},
"required": ["uninstall_script_path"]
},
{
"anyOf": [
{
"properties": {
"pre_uninstall_scripts": {
"type": "array"
}
},
"required": ["pre_uninstall_scripts"]
},
{
"properties": {
"post_uninstall_scripts": {
"type": "array"
}
},
"required": ["post_uninstall_scripts"]
}
]
}
]
},
"additionalProperties": false
}